首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  微信

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

  •  
  •   xiqingongzi · 292 天前 · 7533 次点击
    这是一个创建于 292 天前的主题,其中的信息可能已经有所发展或是发生改变。

    导读

    微信小程序源码包泄露,罪魁祸首竟是 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 的服务器。

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

    • 对于来自东北的老铁,访问我的网站自然是速度还不错。
    • 俄勒冈的美帝男青年,得益于中美的海底光缆,速度还行。
    • 但是法国巴黎的妙龄女郎就遭了殃,她想要访问我的网站,数据包要先从 FoShan 经由中美海底光缆,达到美国后,再通过美国和欧洲的海底光缆,到达欧洲、到达法国,这位妙龄女郎想要访问我的网站,就要等待很久,连连说 Non。

    作为一个商人,我不希望丢失来自法国的订单,但是现实却是法国人访问我的网站变成了“ 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 鉴权,以确保数据的安全!特别是源码等重要的内容。

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

    第 1 条附言  ·  292 天前
    广告来了:微信搜索公众号西秦说云,可以看到后续更多云计算解读~
    第 2 条附言  ·  292 天前

    微信不用腾讯云?是的,出问题的IP不是腾讯云的

    腾讯云没有 URL 鉴权?作为 Beggar VIP, 我没有

    第 3 条附言  ·  292 天前
    关于抓包和鉴权的问题是这样的:
    之所以有这个考虑是基于这次的问题的下载流程,我是通过抓包获取到小程序的 ID 和版本号,到指定地址下载。
    也可能是我提供的抓包截图刚好是下载小程序的。实际上你抓任何一个有小程序 ID 和版本号的请求,都可以在指定地址下载到小程序的源码。

    不抓包能不能直接下载到?
    可以,小程序的 id 不少公众号都公布出来了,比如 Fenng 的抽奖助手,那么对于一个知道这个地址的人来说,不用抓包,id + version 就 ok,版本是从 1 开始递增的。从 1 开始试就 OK
    67 回复  |  直到 2018-01-03 14:22:10 +08:00
        1
    qiayue   292 天前   ♥ 8
    仔细看到最后页没发现是哪家的广告
        2
    SourceMan   292 天前 via iPhone
    楼主,原文你看懂或者实践了吗?
    还是纯粹为了开头那个广告图

    其实一开头见到那句广告词,特别反感,感觉的负面营销的典范之一
        3
    Bryan0Z   292 天前 via Android
    @qiayue 开头最大的框那个不就是嘛
        4
    wxcszh   292 天前
    微信的 CDN 应该是腾讯云吧。。。总不能打自家脸啊
        5
    juneszh   292 天前
    东拼西凑 不知所谓
        6
    qiayue   292 天前
    @Bryan0Z 还以为是搞笑的
        7
    xiqingongzi   292 天前 via iPhone
    @wxcszh 不是腾讯云,我去腾讯云后台查了,不是腾讯云的 Ip
        8
    xiqingongzi   292 天前 via iPhone
    @SourceMan 1.我下载了 88 个源码 2.佛山是反讽,如果你觉得是广告,我无言以对。

    @qiayue 其实是我公众号的广告。。。。忘了发

    @juneszh 自己写的,哪里看的不太懂?总体上是从这次事件看 CDN URL 鉴权机制的重要性。
        9
    xiqingongzi   292 天前 via iPhone
    @qiayue 我在你朋友圈里的 ID 是 bestony
        10
    widewing   292 天前 via Android
    为啥加了权鉴就泄露不了了?都抓包了,直接 dump 下来啊
        11
    xiqingongzi   292 天前 via iPhone
    @widewing 有时间限制的,authkey 和时间有关,假设动态时间是 5s,你必须在 5s 完成所有操作才行。不能说绝对,但能拦住大多数。
        12
    thetast   292 天前 via Android
    @xiqingongzi CDN edge endpoint 一般都不是自己的吧。。。
        13
    torbrowserbridge   292 天前 via Android
    @xiqingongzi #然而内部用的资源和外部客户的不一样。
        14
    xzl   292 天前
    这位道友,谁告诉你腾讯云不支持 URL 鉴权的?
        15
    xiqingongzi   292 天前 via iPhone
    @xzl 请提供官方文档地址或后台截图。或者我截图给你也可以。
        16
    xiqingongzi   292 天前 via iPhone
    @torbrowserbridge 那就没办法了,毕竟对于这些云计算公司,我都是外部用户,只能说我们这些外部用户能拿到的资源。
        17
    xiqingongzi   292 天前 via iPhone
    @thetast CDN 服务商不自建节点??我仿佛看到了改个配置要半个小时的某牛云 z
        18
    xiqingongzi   292 天前 via iPhone
    @torbrowserbridge 可能我是个 beggar vip
        19
    jimmy2010   292 天前 via Android
    好评,挺详细的,还不是广告。
    开通那个讽刺是模仿万万没想到吧,挺搞笑的
        20
    xiqingongzi   292 天前
    @jimmy2010 #19 yes,老铁也是万星人!
        21
    wafm   292 天前
    哈哈 现今还有相信高防的?
        22
    icyalala   292 天前
    你都抓包了,还鉴权。。还 CDN 背锅。。这在搞笑嘛。。
        23
    233   292 天前
    来晚的想求两个源码学习下,不知是否方便
    cGVudGl1bWlpMjMzQGdtYWlsLmNvbQ==
        24
    xiqingongzi   292 天前 via iPhone
    @233 怂,不敢发,我自己学习了。

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


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

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

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

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

    ---------------------
    没有价值。
        49
    qsnow6   291 天前
    几句话说的清的事情,扯这么大篇幅?
        50
    xiqingongzi   291 天前
    @wangxiaoer #48 那我无话可说,大家的观念不同。
    @qsnow6 #49 顺便科普下 CDN
        51
    blless   291 天前 via Android
    这个 lz 强行打广告的,看他打滚的样子就知道了,越理他越高兴呢。加密数据访问方式多了去了,强行 cdn 上硬掰
        52
    xiqingongzi   291 天前
    @blless #51 厉害了,我黑佛山高防还成了广告。看来我要找个佛山机房要广告费了。
        53
    xenme   291 天前
    Android 平台应用的 APK 导出都能下载,居然不需要注册验证手机号和邮箱啥的,代码都被人家下载完了。
    CDN 还不加任何鉴权验证就提供下载,作者还发布到那么多各种各样的市场,太不安全了。
        54
    oonnnoo   291 天前 via Android
    强行背锅
        55
    xenme   291 天前
    @xenme 还有 Chrome 的 extension 的源码居然直接调试工具点下就出来了,居然都不需要点击 download 就能看了,太恐怖了,Google 这么大厂商居然都不加密保护一下,开源的居然都没人修复这个 BUG,0day 有没有?
        56
    xiqingongzi   291 天前
    @xenme #53 这句黑的有理。不过,正规的渠道应该是由 Google Play 统一下发,国情导致国内的市场层出不穷。也因此,国内的付费 Andorid 不少过的很惨。
        57
    icyalala   291 天前
    @xiqingongzi 强行拉上 CDN 说事,源码泄露这事儿,CDN 真的一点责任都没有。
    即使 CDN 有鉴权、而且微信也用到了,URL 也随机化了,对于"源码泄露"这件事情来说,没有任何改变。
    "不是开发者的人都在疯狂的下载" 又有什么用呢?看不懂源码的人下载到源码后,又能造成什么伤害呢?微信花费了精力做了鉴权,又能得到什么呢?
        58
    bravecoder   291 天前   ♥ 1
    楼主的思路是对的。
    1. 抓包得到的链接里是有鉴权码的,但是不带鉴权码也可以访问,说白了就是 CDN 的漏洞,资源访问验权失效
    2. 小程序 wxapkg 文件也是可以从手机提取的,已经有人发帖子写出详细了
        59
    bravecoder   291 天前
    @xiqingongzi 技术门槛的降低非常重要
    其实 ‘ AI ’ 刷分已经在 v 站发布很长时间了,不过通过 POST 方式降低了技术门槛,让更多人能够操作
        60
    xiqingongzi   291 天前
    @bravecoder #59 我因为不玩游戏。。。其实没关注游戏这一块,直接关注的就是可以直接下载。。跳一跳至今手残玩了 46 分。我觉得技术门槛降低最大的风险是这些代码被很多人拿到手里,后续他们可以找人解开,有点风险。以前仿一个小程序是仿界面,现在直接去 Copy 源码就好了。
        61
    YzSama   291 天前
    @xiqingongzi #60 领教了。一直都有听过 CDN 加速,只是没真的去了解。
    楼主科普的不错。
    可转载?
        62
    xiqingongzi   291 天前
    @YzSama #61 转载随意,注明出处即可。
        63
    YzSama   291 天前
    @xiqingongzi #62 👌
        64
    quericy   291 天前
    腾讯云有 url 鉴权的,得找他们人工开,他们家有些东西在后台面版里没有的
        65
    xiqingongzi   291 天前 via iPhone
    @quericy 这一块我今天上午和腾讯云的产品怼了一个多小时,他们后面会上到控制台了。
        66
    hanbing135   290 天前 via Android
    我觉得 cdn 的科普写的不错
        67
    xiqingongzi   290 天前
    @hanbing135 #66 感谢,可以关注公众号,后面会写更多的科普内容~
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1873 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 26ms · UTC 03:58 · PVG 11:58 · LAX 20:58 · JFK 23:58
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1