微信小程序源码包泄露?这个锅要 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 条回复
wafm
2018-01-02 01:31:58 +08:00
哈哈 现今还有相信高防的?
icyalala
2018-01-02 01:40:03 +08:00
你都抓包了,还鉴权。。还 CDN 背锅。。这在搞笑嘛。。
233
2018-01-02 02:24:22 +08:00
来晚的想求两个源码学习下,不知是否方便
cGVudGl1bWlpMjMzQGdtYWlsLmNvbQ==
xiqingongzi
2018-01-02 07:17:30 +08:00
@233 怂,不敢发,我自己学习了。

@icyalala 鉴权算法都是有时间戳的,你猜时间戳干嘛的呢?
blless
2018-01-02 08:07:26 +08:00
下载地址都是 release 了…说明打包没打包干净吧…跟 cdn 有啥关系…
cljnnn
2018-01-02 08:13:39 +08:00
@xiqingongzi 参考 /t/419056#145,跟你 CDN 都没关系了。CDN 说,源代码泄露这个锅他不背。
111111111111
2018-01-02 08:18:21 +08:00
这个广告我喜欢
xiqingongzi
2018-01-02 08:30:28 +08:00
@blless #25 打包、代码没有进行混淆不是你的代码可以随意从第三方获取的理由。换句话说,你开发了一个 App,上传到了 App Store,可以随意被人从一个 CDN 上扒下来,而不是必须通过 App Store 的分发机制进行分发,你认为是应该的么?


@cljnnn #26 你还是没有意识到「那个地址」到底是从何而来。那个下载地址是 CDN 服务商提供的,用来检测文件是否正常存储的。那个地址是 CDN 的检测地址,不做任何加密和校验,直接允许访问,才最终带来了可以随意下载小程序。换句话说,假设这个地址加了校验 ID,你还能通过这个地址有效的下载到小程序的源码包么?
xiqingongzi
2018-01-02 08:30:56 +08:00
@111111111111 #27 可以去关注我的公众号哦~以后会推送更多类型的科普。
thetast
2018-01-02 08:35:18 +08:00
@xiqingongzi 我意思是云服务商跟 CDN 服务商合作推的应该
xiqingongzi
2018-01-02 08:38:06 +08:00
@thetast #30 这么说是没错,不过号称是自建机房。毕竟全国那么多城市。不过应该改一改,云服务商和「通信运营商」。才对
cljnnn
2018-01-02 08:44:49 +08:00
@xiqingongzi 你搞清楚主次了么?你的意思是 cdn 加上你的鉴权算法就不会“源代码泄露”了?根本原因如 25 楼所说是 wxapkg 解完包并且没有混淆等等泄露了源代码。只能说直接 cdn 下载让 wxapkg 包更容易获取而已。
xiqingongzi
2018-01-02 08:52:32 +08:00
@cljnnn #32 没有混淆绝对是小程序的锅,这个它跑不掉,甚至于版本号 1234 都是小程序的锅,但是在这次事件中,CDN 也有自己不光彩的一面,如果没有这个「不光彩的一面」,没这么容易玩的这么大。抓包大家难道以前没想过还是去对应文件夹下找文件大家没想过?为什么这次这么容易玩大? CDN 所承载的无需鉴权即可下载对事件起了推波助澜的效果。甚至于,CDN 成功的将本来一个很难的过程,变成了一个很简单的路子。
icyalala
2018-01-02 12:03:17 +08:00
@xiqingongzi 能看到源码与 CDN 无关,CDN 也并没有所谓"不光彩的一面"。鉴权与否对于抓包来说完全无关。对于想要获取源码的人来说,有无鉴权根本与所谓"难度"无关。

AppStore 安装包下载可是有各种防护措施的,但很多人为了获取旧版安装包,都是直接去拿工具抓包,没有"难度",网上也有大批教程。PS4 游戏的包甚至可以随意下载且毫无任何阻拦措施,但目前为止甚至连把包解开都无法做到。这些平台里的 App 源码无法泄露,是得益于程序的编译和平台的加密策略。
xiqingongzi
2018-01-02 12:28:26 +08:00
@icyalala #34 没错啊,混淆才是核心。不过我昨天看到的一个微信群,几百号人借助这个渠道在疯狂的下源码,作何解释?没有降低难度?我不认为。传统的渠道,由于操作复杂,让这些事情成为小众。如今,一个简化的渠道,让是不是开发者的人都在疯狂的下载,我觉得这个变量需要承担事物发展变化的责任。
xiqingongzi
2018-01-02 12:29:48 +08:00
@icyalala #34 换句话说,传统的模式是抓包—保存—解包。现在不需要抓包了,你只需要找到 Appid —保存了。这种路径上的优化,使得大量的人涌入,下载。中间一切都没有变,仅仅是渠道放开了限制。你觉得是哪个因素导致了这样的现象的发生?
xiqingongzi
2018-01-02 12:32:34 +08:00
@icyalala #34 如果说原因是人均素质的提高,我更愿意相信是其中的变量发生了改变。
t123yh
2018-01-02 12:46:48 +08:00
@xiqingongzi 举个例子,一个 App,用户登录时密码验证逻辑做在客户端了,导致任意登录漏洞,你认为是客户端做得不够好、防护措施不到位,还是整个验证逻辑的位置就错了?解决事情的根本才是必要的。
murmur
2018-01-02 12:47:49 +08:00
搞大新闻来了?
js 还想混淆东西么 native 都放不住
wangxiaoer
2018-01-02 12:49:20 +08:00
几句话讲清楚的,还把 CDN 原理弄出来,有意思吗?
CDN 作为内容分发,静态资源为主,能做到精准授权码?

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

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

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

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

© 2021 V2EX