查看: 48|回复: 1

    重大消息推出!微信小程序曝出漏洞来临所有小程序源代码可任意下载

    [复制链接]
  • TA的每日心情

    2018-1-24 18:38
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    21

    主题

    27

    帖子

    156

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    156

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-1-9 13:03:48 | 显示全部楼层 |阅读模式
      源代码可任意下载的重大漏洞终于大规模爆发。
      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则令人心惊。希望微信官方能尽快修复漏洞,让刚刚抬头的小程序生态稳健成长。



    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-2-7 10:07
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    2613

    主题

    2622

    帖子

    7961

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    7961

    活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-1-9 14:09:56 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|好站群 ( 苏ICP备15018248号-1

    GMT+8, 2018-2-24 06:29 , Processed in 0.059294 second(s), 36 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表