事件过程:

上周发现 APP 的某个 webview 页面底部会出现一个透明浮层,导致整个页面无法点击,反复测试排查后发现只有在移动网络下时而能复现,毫无规律可言,最后是在某手机上使用 4G 网络能固定复现。

查找过程:

有了能稳定复现的环境,就该缩小范围来定位问题了,最简单的思路就是抓包观察这个浮层来知何处,但传统的通过 Charles 走 WIFI 代理进行抓包就没办法复现这个 Bug 了,想到的办法有:

  1. 手机 A 移动网络放出热点→PC 连接并配置代理→手机 B 连接 PC 上的代理(这样就达到抓移动网络下的包体目的,但是太费流量且过程麻烦,PASS)
  2. 使用 Safari 的 Web 检查器配合 iPhone 调试分析(事后发现的一种解决方案,详情可看 https://chon.io/blog/safari-ios-iphone-itouch-web-dev-inspector/
  3. IOS 神器 rvictl ,一根数据线实现使用 Tcpdump、Wireshark 抓包分析,原理是将移动设备虚拟一个网卡接口给 Mac,出入口流量都可以通过这个接口传输给 Mac,Tcpdump、Wireshark 再监控这个虚拟网卡接口就可以抓到移动设备上的包了

使用第三种 rvictl 办法,步骤如下

  1. 将 iPhone 通过数据线连接上 Mac,打开 iTunes,复制设备的 UDID(位置在’ 摘要 ‘tab 页中)
  2. 打开 Terminal,输入 rvictl -s 设备 udid
  3. 打开 Wireshark,在捕获选项中能看到这个 rvi0 这个网卡,选中,然后输入合适的过滤符就可以抓包成功

数据包中可以查到一个来源不是我们自己服务器且代码中不存在的一个http://static.hnfjx.com/static/image/close.png链接

最后定位到是 common-9bdeaba34f.build.js 里包含了这张图片的引用,但是并不是我们自己所写,仔细一看这个文件被篡改了,这个 js 文件是放在七牛 CDN 上,原因自然就清楚了,七牛 CDN 返回给客户端的 JS 文件不是我们之前上传的文件。

劫持流程:

  1. 客户端请求 build.js

  2. cdn 节点返回假的 build.js 文件

  3. 假的 build.js 加载成功,插入了广告

事后分析

请求这个 Js 文件放在七牛 CDN 上,是七牛的根域名且是 https,返回的却是可解析非客户预期的文件:

想想可能性,细思极恐,七牛的域名被劫持,劫持方还有他的证书,是谁呢?




↙↙↙阅读原文可查看相关链接,并与作者交流