玄武实验室联合独立安全研究员 em 发现在 Mac OS 上用户量比较大的两款微信防撤回外挂存在安全问题,装了此外挂的用户只要在浏览器里访问攻击者页面并停留一分钟左右,攻击者即可拿到该用户的好友列表,聊天记录,甚至以该用户的身份给好友发送消息,对用户的信息安全造成巨大威胁。

目前这两款外挂的用户量较大,比较热门的一款目前在 Github 上的 star 数量接近 8800,实际安装的用户数量可能更多。经过玄武实验室与微信安全部门沟通,为了避免让众多用户暴露在安全风险中,我们决定先对该外挂进行漏洞通报,然后再发文提示用户安全威胁。em 于10月15日在对应的 Github 仓库中提交了修复代码,其中一个已经进行修补,而另一个尚无操作。玄武实验室联合微信安全提醒大家,不要随意安装微信外挂。

一个攻击演示的视频如下。

这两个外挂出现问题的原因是相同的。下面以较为流行的 WeChatPlugin-MacOS 为例,说明此攻击发生的原理。

根据代码我们发现,WeChatPlugin-MacOS 使用了GCDWebServer在本地127.0.0.1监听了52700端口作为 web 服务器。以修复前的代码为例。在TKWebServerManager.m文件中定义了以下4个基于 HTTP 的 API。

  • /wechat-plugin/user
  • /wechat-plugin/chatlog
  • /wechat-plugin/open-session
  • /wechat-plugin/send-message

这四个 API 接口的作用分别是获取用户好友、获取聊天记录、打开与指定好友的聊天窗口、对指定好友发送任意消息。

例如,直接在浏览器里访问http://127.0.0.1:52700/wechat-plugin/user即可获取在 Mac 版微信聊天窗口页中所有的好友、群等信息。

有的同学可能会有疑问,端口监听在本地,只有自己能访问到,攻击者如何发起攻击呢?

一种常见的针对此场景的攻击方法名为 DNS Rebind。攻击者首先自己搭建一个DNS解析服务器,让自己控制的域名在发生第一次DNS解析的时候指向攻击者的服务器,以后都解析到127.0.0.1。这样当受害者访问攻击者的页面(http://attacker-domain-with-dns-rebind/exp.html)的时候,会从攻击者的服务器上拉取攻击代码,后面的对attacker-domain-with-dns-rebind域名的请求,会指向本地,即127.0.0.1。由于DNS的解析结果存在一定的缓存时间,在浏览器里大概需要1分钟的时间才会失效进行第二次解析。在发生第二次解析的时候,其指向的IP地址会变为127.0.0.1。虽然 DNS 解析指向的服务器变了,但是域名没变,浏览器仍然遵循同源策略,这样就能往本地端口发送请求并获取数据,甚至传输到其他站点了。

通过 DNS Rebind,攻击者可以拿到该用户的好友列表,聊天记录,以该用户的身份给好友发送消息。

最后感谢 m4bln 在测试过程中提供的帮助。

附存在问题的插件:

https://github.com/TKkk-iOSer/WeChatPlugin-MacOS

https://github.com/Sunnyyoung/WeChatTweak-macOS