微信小程序源码包泄露?这个锅要 CDN 来背

2018-01-01 22:50:01 +08:00
 xiqingongzi

导读

微信小程序源码包泄露,罪魁祸首竟是 CDN ?微信的 CDN 服务提供商这次要背锅咯。

今天一大早,在 V 站看到了这样的一篇帖子《微信跳一跳 可以直接更改分数,POST 请求没有校验…》

点进去发现有这样一段文字:

竟然可以下载微信小程序的源码?这岂不是所有的小程序任意被 Copy 了?开发小哥哥 247 的工作成果就这样被人任意下载了?太坑了吧!

出于云计算从业者的敏感,我认为,这次的锅,可能要微信的 CDN 服务提供商来背了。

接下来来说说原因。

域名泄露天机

在我上面的截图,你可能会看到下载的 URL,这个 URL 的前半部分是这样的,

123.125.9.32/resstatic.servicewechat.com/

如果是一个云计算从业者,看到这样的 URL 可能立马就非常敏感了,因为这种 URL 是很典型的 CDN 检测链接,CDN 的用户可以用这个链接来检测自己的服务是否被部署到了对应的节点上。这个 URL 就是检测,域名 resstatic.servicewechat.com 部署在 123.125.9.32 节点上的数据是否已经部署成功,如果你访问的目标文件存在,则说明 CDN 节点成功的缓存了对应的源站数据。我们通过了这个测试链接获取到了 CDN 节点缓存的内容。

诶,虽然上面你说的我好像听懂了,但是还是没明白为什么锅要 CDN 背啊,这个锅不应该是甩给微信开发团队的么?

嗯,话是这么说,URL 的泄漏肯定和开发团队写的代码有关,但是这个问题的核心在于使用的 CDN 没有提供相对应的功能支持,从而导致了最终的泄漏。如果 CDN 层面上搞定了功能,即使开发者在上线前没有注意到替换对应的地址,也不会出现问题的。

CDN 到底是个啥?

接下来,我们来说说,到底什么是 CDN,来帮助你理解为什么锅我们要甩给 CDN。

CDN 的全称为 Content Delivery Network,中文的含义是内容分发网络。这里的重点是,网络,这说明 CDN 并不是一个单机结构,而是有很多不同的节点累计出来的。

在没有使用 CDN 之前,我们的网站是这样被访问的

无论你是来自中国东北,还是美国俄勒冈,又或是浪漫之都巴黎,你想要访问我的网站,都需要访问我放在 FoShan 的服务器。

我们都知道,虽然说光速很快,但是我们的电子的传递速度有限,受到物理条件的限制,也就导致不同的地区到达同一个地点的速度有快有慢。

作为一个商人,我不希望丢失来自法国的订单,但是现实却是法国人访问我的网站变成了“ World Wide Wait (世界一起等待)”。如何解决这个问题呢?

在 1995 年,美国麻省理工学院的一位应用数学教授 Tom Leighton 博士借助应用数学和运算学解决了这个问题

上图就是发明了 CDN 技术的 F. Thomson Leighton 老爷子,他和当时一起研究 CDN 技术的几位顶级研究人员创建了世界上第一家,也是迄今为止最大的 CDN 公司 Akamai。

他们是如何解决这个问题的呢?

你不是离目标网站远么?我让目标网站离你近一点,你访问速度不就快了么?

他们在全球部署一系列不同的节点,构建一层虚拟网络(就是我们说的「内容分发网络」),并借助算法,实时的根据网络流量和节点的连接、负载情况以及到用户的距离和响应时间等综合信息,将用户的请求重新导向离用户最近的节点。

经过这么一导,原本你要访问 FoShan,才能看到的网站,现在你只需去伦敦就够了,节省了大段的路程,访问速度自然快了。

为什么能够分配到对应的节点?这个得益于 CDN 的核心技术,流量分发算法。我唔知啦!

事实上,真实的场景下,可能不只有 LA、DaLian、Londo 这三个节点,而是世界各处都有,用户访问的时候可能根本不需要跨国、跨地区,你所在的城市就有节点,隧道相当快。

你可能会问,为什么访问他的节点,就和访问我的站点一样?

这是得益于 CDN 工作的机制,当用户初次访问 CDN 节点时,CDN 节点会检测,自己有没有对应的文件的缓存,如果没有,则会向源站请求这个文件。第一次访问 CDN 时,速度会略慢于不加 CDN。因为用户需要经过 1234,四步才能获得文件。

当用户第二次访问 CDN 节点时,CDN 检测到自己有对应的文件。就直接讲对应文件返回给用户。第二次访问时,速度会非常快,远胜不加 CDN。因为这次用户访问时,只需要和 DaLian 的 CDN 节点进行沟通,就可以了。

得益于距离的缩短,CDN 使我们的资源访问的速度变得飞快无比。借助于海量的 CDN 节点,我们的网站能够背全世界人民以相当快的速度来访问。

没有校验的 CDN 如同不设防的宫殿

上面,我们了解了 CDN 的工作原理,接下来我们回到微信这次的问题上。在上面我们提到,CDN 为了提升我们的资源的加载速度,会将我们的内容缓存在 CDN 节点上。

由于我们的内容很多时候得到授权才能看的,所以不少 CDN 进化出了一项新的功能,URL 鉴权。URL 鉴权就是我们的请求地址后面,加入一个形如?auth_key=timestamp-rand-uid-md5hash的参数,通过这个参数的校验,来实现访问的控制,参数校验通过,正确返回内容,校验不通过,报错。

当用户请求中的 Auth Key 不正确或不存在时,则返回 401 Unauthorized。这样,就保证了我们的请求在未经授权下,无法被访问到。

在微信的抓包结果中其实也可以看到,下载小程序的源码包是加了参数的。

但是很不幸的是,可能是微信小程序的 CDN 服务商并不提供相关的功能,导致我们可以通过 CDN 的校验地址直接下载小程序的源码包。当然,也可能是该服务商并没有在该功能上加入 URL 鉴权的控制,所以就坑了微信一把。

国内都有哪些 CDN 服务提供商支持 URL 鉴权?

目前,国内 CDN 服务商林立,老牌子的网宿、蓝汛;云计算服务商 阿里云、腾讯云、百度云、又拍云、七牛云;安全服务提供商 安全宝、360 网站卫士等等。其对 URL 鉴权的支持度也不同。具体的你可以看下面的表格。

总结

微信的 CDN 服务商不知是哪家,希望能够尽快加入相关链接的校验。对于我们来说,我们得到了一个教训,CDN 上存放的内容,应该进行 URL 鉴权,以确保数据的安全!特别是源码等重要的内容。

本文仅代表我个人的观点,如观点有误,欢迎指出!

12037 次点击
所在节点    微信
67 条回复
wangxiaoer
2018-01-02 12:57:02 +08:00
@xiqingongzi 淘宝的 js 源代码通过 CDN 泄露了,原价 999,现价 20 快,快来下载吧!!
est
2018-01-02 13:04:48 +08:00
强行瞎掰技术是一种怎么样的体验?
xiqingongzi
2018-01-02 13:07:09 +08:00
@t123yh #38 我从不否认代码加密的重要性。我强调的是 CDN 在此次泄漏中所承担的角色。

@murmur #39 这个是技术层面的问题,混淆能不能藏住代码,不在这次的讨论范围之内。
@wangxiaoer #40 1. 关于精准授权的问题,我今天上午和腾讯云的 CDN 产品怼了俩小时,腾讯云的大企业用的没问题。2. 你这个比喻不够具体和恰当,如果是网页的 JS,没有限制的 JS,没有价值,但是如果你的源码是其视图层的 Nodejs 代码,别说 20,2000 都有人买。我也举个例子,优酷有个视频,需要会员才能看,现在 CDN 说了,你不需要买会员,给我视频的 ID 你就能看(视频的 ID 由于宣传的需要已经分发出去),这个锅你觉得是应该优酷来背?
xiqingongzi
2018-01-02 13:10:06 +08:00
@est #42 这个我不知道,不过你还不如和楼上一起来讨论
wangxiaoer
2018-01-02 13:17:06 +08:00
@xiqingongzi 我就问你一句,这个小程序源码需不需要下载到客户端执行?你用 Nodejs 这种后台代码拿出来说事有意思吗
xiqingongzi
2018-01-02 13:21:57 +08:00
@wangxiaoer #45 需要。是,后台代码不合适。但是不做权限说明的淘宝代码,同样不合适。如果说,某个 JS 是淘宝的超级管理员后台的 Ajax 代码,你说有没有价值?
qiuai
2018-01-02 13:27:53 +08:00
你这广告做的不专业啊...至少留个网站或者什么能马上到你家的吧......我都不知道怎么找你家...
wangxiaoer
2018-01-02 13:31:12 +08:00
@xiqingongzi

某个 JS 是淘宝的超级管理员后台的 Ajax 代码,你说有没有价值

---------------------
没有价值。
qsnow6
2018-01-02 13:35:24 +08:00
几句话说的清的事情,扯这么大篇幅?
xiqingongzi
2018-01-02 13:36:12 +08:00
@wangxiaoer #48 那我无话可说,大家的观念不同。
@qsnow6 #49 顺便科普下 CDN
blless
2018-01-02 13:37:24 +08:00
这个 lz 强行打广告的,看他打滚的样子就知道了,越理他越高兴呢。加密数据访问方式多了去了,强行 cdn 上硬掰
xiqingongzi
2018-01-02 13:39:27 +08:00
@blless #51 厉害了,我黑佛山高防还成了广告。看来我要找个佛山机房要广告费了。
xenme
2018-01-02 13:43:05 +08:00
Android 平台应用的 APK 导出都能下载,居然不需要注册验证手机号和邮箱啥的,代码都被人家下载完了。
CDN 还不加任何鉴权验证就提供下载,作者还发布到那么多各种各样的市场,太不安全了。
oonnnoo
2018-01-02 13:44:32 +08:00
强行背锅
xenme
2018-01-02 13:45:15 +08:00
@xenme 还有 Chrome 的 extension 的源码居然直接调试工具点下就出来了,居然都不需要点击 download 就能看了,太恐怖了,Google 这么大厂商居然都不加密保护一下,开源的居然都没人修复这个 BUG,0day 有没有?
xiqingongzi
2018-01-02 13:45:17 +08:00
@xenme #53 这句黑的有理。不过,正规的渠道应该是由 Google Play 统一下发,国情导致国内的市场层出不穷。也因此,国内的付费 Andorid 不少过的很惨。
icyalala
2018-01-02 13:46:27 +08:00
@xiqingongzi 强行拉上 CDN 说事,源码泄露这事儿,CDN 真的一点责任都没有。
即使 CDN 有鉴权、而且微信也用到了,URL 也随机化了,对于"源码泄露"这件事情来说,没有任何改变。
"不是开发者的人都在疯狂的下载" 又有什么用呢?看不懂源码的人下载到源码后,又能造成什么伤害呢?微信花费了精力做了鉴权,又能得到什么呢?
bravecoder
2018-01-02 13:49:38 +08:00
楼主的思路是对的。
1. 抓包得到的链接里是有鉴权码的,但是不带鉴权码也可以访问,说白了就是 CDN 的漏洞,资源访问验权失效
2. 小程序 wxapkg 文件也是可以从手机提取的,已经有人发帖子写出详细了
bravecoder
2018-01-02 14:04:42 +08:00
@xiqingongzi 技术门槛的降低非常重要
其实 ‘ AI ’ 刷分已经在 v 站发布很长时间了,不过通过 POST 方式降低了技术门槛,让更多人能够操作
xiqingongzi
2018-01-02 14:10:13 +08:00
@bravecoder #59 我因为不玩游戏。。。其实没关注游戏这一块,直接关注的就是可以直接下载。。跳一跳至今手残玩了 46 分。我觉得技术门槛降低最大的风险是这些代码被很多人拿到手里,后续他们可以找人解开,有点风险。以前仿一个小程序是仿界面,现在直接去 Copy 源码就好了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419229

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX