2018年的第一天,微信小程序被爆出惊天BUG:任何人可以通过AppID和版本号获取任意小程序的源码文件!
该漏洞被大范围曝光起源于V2EX论坛一篇关于利用微信小游戏“跳一跳”不校验post的漏洞进行刷分技能文章,文章同时给出了获取跳一跳小游戏源码的获取方法。文章备注,此种获取源码的方法对付小程序也是通用的。
方法非常大略:只要获取到小程序的appid和版本号,即可通过布局URL直接下载该小程序的源码wxapkg文件。
理论上,小程序的appid和版本号是只有开拓者本人知道的,除非小程序开拓者公布,其他职员无从获取。而技能层面上,我们却可以通过对小程序和做事器的通信进行抓包获取到小程序appid和版本号。这就使得下载小程序源码变得轻松非常。
微信小程序官方称在当天修复了通过布局URL下载源码的漏洞,目前,已无法利用布局URL的办法直接下载小程序实行包。
这个锅该当由谁来背?
有开拓者越日在V2EX爆料称,该漏洞是由于小程序CDN做事商没有给访问做URL鉴权导致的。做事器开拓我并不熟习,此处不站队。
实际上,通过布局URL的办法下载小程序源码只是个中被曝光了的一个办法,我们的手机里实在已经保存了所有我们利用过的小程序实行包,对付root的安卓手机,我们可以在appbrand文件中找到所有已经利用过的小程序wxapkg文件。
只是命名规则比混乱,但这比抓包和布局URL的方法降落了对技能的哀求。
之以是在标题利用“终于大规模爆发”,是由于这两种获取小程序源码的方法早在2017年6月就有开拓者发文给出了,而那位开拓者写文更多的是对前端代码安全的谈论。
更有谈论代价的正好是前端代码的安全问题。
小程序大部分功能的实现都是基于前真个,很多开拓者为了省却域名备案和SSL证书支配的麻烦,将小程序的大部分功能都写在了前端。在被抓包和提取实行包不可避免的情形下,就哀求小程序官方采纳足够的代码安全保护方法。
而这一点,小程序开拓团队做的不是很好。
利用前文的任意方法获取到小程序的实行文件,用Python版脚本(不得不佩服我们的程序员,在短短的一天韶光内,涌现了Python、PHP和js三个版本的解包脚本)对下载的wxapkg文件解包后得到这么几个文件:
解码后的小程序文件目录
可以创造这些文件的组成和小程序的代码已经非常相似了。与常规小程序代码不同的是,解包的文件格式仍旧是HTML文件。
但这不是重点。
打开page-frame.html和app-service.js,可以创造这些代码已经非常具备可读性了:
page-frame.html代码截图
app-service.js
对付熟习小程序开拓的人来说,这样的代码已经险些不须要再格式化了,现有文件已经可以比较清楚地看出代码的逻辑。
回到代码保护。
我们获取到的wxapkg文件实在是小程序的实行文件,可以大略理解为安装包。安卓手机的安装包(xxx.apk文件)大家非常熟习,我们是很难通过apk文件获取到运用源代码的,由于代码压缩有非常繁芜的加密过程,很难被反编译。
但为什么小程序的实行包就可以被轻松地“反编译”?(用“反编译”实在已经非常高估小程序了,你可以创造前面我都是利用了“解包”这个词,由于小程序的“反编译”过程非常大略,就像解压缩一样。)
小程序的实行文件之以是可以如此轻松地被反编译,根源在于小程序的开拓团队并没有对小程序的实行文件进行有效的保护,也便是加密。利用Hex Fiend(一款Mac OS上的十六进制编辑转件)剖析wxapkg文件会创造,大部分字段是没有被加密的,可以直接看到文件的路径。
实际上,小程序只是很大略的将图片、js和json文件压在一起,而压制的过程无非便是Wxml --> Html、 Wxml --> JS、Wxss --> Css,转换后文件二进制格式跟后缀名为wx二进制格式完备同等。这就使得解包过程非常大略,以是涌现了一天之内呈现出Python、PHP和JS三个版本解包代码的情形。
实在,早在2017年10月份,就有开拓者在简书分享了对小程序实行包的提取和解析过程,并在GitHub开源了脚本代码。
So?
开拓者Rolan在文章《从微信小程序看前端代码的安全》中提到:
微信并没有在代码安全上进行过多的考虑。这导致须要在运用审核过程中花费比较多的功夫(也便是自己给代码加密),不然作品太随意马虎被复制窜改,以至于会失落去渠道先机,这对流量是致命打击。
由于历史缘故原由,前真个代码安全技能发展的比较缓慢,比较其他被编译成二进制的运用,前端这种纯文本运用,太随意马虎被辨识与窜改。
对前端代码进行保护的目的在于让机器随意马虎识别干系的指令,而使人难以理解代码的逻辑,但每每在对前端代码进行保护过程中,很难既兼顾指令效率又能使可读性降落。
因此,常常须要在现有的代码中增加一些额外的验证逻辑,例如一些增加无效的代码进行稠浊、采取守护代码保护业务代码不能在其他的域名下正常运行、增加一些防止调试跟踪的断点等,这些方法都是使得破解代码时人工本钱增加,从而增加代码的安全性。
这篇文章是2017年6月发布的,早与小程序源码大范围泄露前半年!
半年前就已经被开拓者意识到的安全问题,小程序开拓团队却至今没有创造,或者像Rolan说的“并没有在代码安全上进行过多的考虑”。
近乎开源的源代码对付开拓者而言,已经险些没有任何盈利的可能性。当前互联网环境下,个人开拓者(或小型开拓团队)在没有足够资金和流量支持的情形下,先发上风是他们唯一可以利用的资源,而代码的安全性是对先发上风的绝对保护。
一旦代码被开源,优质小程序可能会迅速被不怀美意的成本和流量持有方抄袭取代。
作为微信生态内的新生力量,小程序不仅被官方,也被很多开拓者和内容创业者寄予厚望,而这次暴露出的bug则令民气惊。希望微信官方能尽快修复漏洞,让刚刚举头的小程序生态稳健发展。