那个爬出浏览器的扩展程序
Zscaler 发现了一个名为 Edgecution 的后门,它运行在一个受害者从未打开过的 Microsoft Edge 窗口里,然后利用 Native Messaging——扩展用来与桌面应用通信的合法通道——在宿主机上执行命令。值得一问的是:当浏览器运行在一个用完即弃的虚拟机里时,这座通往宿主机的桥梁究竟能触及什么。
浏览器扩展本该被困在浏览器里。一个名为 Edgecution 的后门,恰恰 是一个活生生的证明:原来「本该如此」这四个字承担了太多分量。它 运行在一个受害者从未打开、也看不见的 Microsoft Edge 窗口里,并利 用每一款 Chromium 浏览器都内置的一项功能,在底层那台机器上执行 命令。
想象一下财务部那位刚入职三周的新人,凡事都还习惯说「好的」。一条 消息通过 Microsoft Teams 发了过来,发件人的名字就列在 IT 支持的名 单里。说是 Outlook 有一个垃圾邮件过滤器的更新,邮件团队这周正在推 送,这是页面链接。她点开了。页面打着「Outlook 更新管理控制台」的 招牌,看上去够「内部」的,还给了她一小段命令,让她运行一下以完成 安装。她照做了。似乎什么也没发生。她关掉标签页,继续干活。
六月下旬,Zscaler 的 ThreatLabz 团队 记录下了 她关掉那个标签页之后发生的事。这个恶意软件家族名为 Edgecution,BleepingComputer 也在同一周 做了报道。 这款恶意软件天生就安静;真正值得细看的,是攻击者选择把它藏在了 哪里。
一条来自 IT 的消息——其实不是。
第一步是通过 Microsoft Teams 进行的社会工程学攻击:攻击者冒充公司 自己的 IT 员工,把员工引向那个假冒的 Outlook 更新页面。页面提供了 三种「完成安装」的方式,而按照 Zscaler 的拆解,它们交付的其实是同 一样东西:一个与真实 AutoHotKey 可执行文件捆绑在一起的混淆后 AutoHotKey 脚本、一段被复制到剪贴板的 Windows 批处理脚本,或者一 段被复制到剪贴板的 PowerShell 脚本。这三者里有两种,正是你也许听 说过、叫作 ClickFix 的剪贴板粘贴伎俩——页面替你把命令写好,剩下要 人类做的,就只有粘贴并按下 Enter。
那一次粘贴,就是胜负的全部。载荷被装在一个加密的 ZIP 里,而它的
PK 魔数字节被抹掉了,于是在任何扫描器眼里,这个文件都不像一个
ZIP。脚本一旦运行,宿主机就沦陷了——靠的不是什么精巧的漏洞利用,
而是因为有人被说动,在自己的电脑上运行了一个程序。在这之后的一
切,都只是攻击者在决定该怎么留下来。
把浏览器当作后门。
它熬过一次重启的方式,是值得放慢节奏细看的部分。大多数想要持久化
的恶意软件,会丢下一个可执行文件、写一个注册表运行键,或者安装一
个服务——而这些恰恰都是安全工具专门盯着看的东西。Edgecution 做的
事则安静得多。其安装脚本会创建一个 Windows 计划任务,用一小把命令
行参数来启动 Microsoft Edge,其中包括用 --load-extension 来侧载攻击
者自己的扩展,以及 --headless=new 让浏览器窗口永远不会被绘制到屏
幕上。于是现在机器上就跑着一个 Microsoft Edge 进程——一个有签名、
受信任、再普通不过的程序——而用户既看不见它,也并不是自己启动的。
在那个看不见的浏览器内部,扩展做了两件事。它通过一个托管在 Amazon CloudFront 上的 WebSocket,向一台命令与控制服务器(攻击者用来下发 指令的地址)发送信标,于是这些流量看起来就像一个普通浏览器在与一 个普通的内容网络通信。同时,它把收到的命令通过 Native Messaging 中 转给宿主机。
Native Messaging(原生消息传递)是一项真实存在、有正式文档的
Chromium 功能,它正按设计运作。它是让浏览器扩展与安装在同一台机器
上的桌面程序通信的通道——比如说,扩展正是用这套机制把工作交给它配
套的桌面应用。扩展调用 chrome.runtime.sendNativeMessage,浏览器便会
启动一个在清单文件中指定的小型「原生主机」程序,并把 JSON 通过管道
传给它。Edgecution 注册了它自己的原生主机:一个会启动 Python 后门的
native_host.bat。从这里开始,这个后门就能运行 shell 命令、运行
PowerShell、运行任意 Python、读写文件、列出正在运行的进程,并把系统
信息层层上报——你想成为那个把干净落脚点交给勒索软件团伙的初始访问
代理(initial-access broker),需要的一切它都齐了。Zscaler 把这名操作
者的作案手法与 Payouts King 勒索软件行动联系在了一起。
留意一下这幅图里没有什么:没有新的服务,也没有一个被丢在磁盘上、
等着被标记的 .exe。真正在执行攻击者命令的,是 python.exe——它由
一个批处理文件启动,而那个批处理文件又由 Microsoft Edge 启动——承载
这些命令的流量,则是一个浏览器在与一个 CDN 通信。它之所以能够隐入
背景,是因为它几乎每一个部分,都是一个合法的东西在做一件看起来合
法的事。
各路标题把这称为一次沙盒逃逸。更精确的说法是:在那名员工运行脚本 的那一刻,宿主机就已经沦陷了。Native Messaging 并不是攻击者凿穿的一 个洞;它是浏览器自带的一扇门,而攻击者只是径直走了进去。这个区 别,指向了真正的修复必须落在何处。对于一项正按设计运作的功能,你 是没法靠打补丁脱身的。你能改变的,是这扇门通向哪里。
「通往宿主机的桥梁」在 Bromure 里能触及什么。
Bromure 是一款安全优先的浏览器。在你的 Mac 上,每一个标签页都运行 在一个用完即弃的 Linux 虚拟机(virtual machine——一台独立的、属于它 自己的计算机)里,而当你关闭窗口时,这个虚拟机就会被抹除。仅仅这 一个架构上的选择,就改变了 Edgecution 故事的余下部分在你机器上意味 着什么。
先从 Native Messaging 说起,它是整场攻击的关键所在。在一款普通浏览 器里,扩展所通信的那个「原生主机」,是你操作系统上的一个程序——而 这个操作系统,正是装着你的文件、你的钥匙串和你的网络共享的那一 个。这座桥是没有边界的:任何扩展都可以注册一个原生主机,而那个主 机可以是任何东西。Edgecution 的整个把戏,都仰仗于浏览器和你的文件 处在同一台机器上。
在 Bromure 里,浏览器并不在那台机器上。它运行在那个用完即弃的虚拟 机内部,所以浏览器底下的那个操作系统,是那台用完即弃的 Linux 客 户机,而不是 macOS。某个虚拟机内部的东西注册的一个流氓原生主机, 将会是一个虚拟机内部的程序——它通信的对象,是一台不包含你任何生活 痕迹、并且在你关闭窗口时就不复存在的计算机。确实能跨越到 macOS 那 一侧的,是一组狭窄的桥梁,它们都是第一方的、被烧录进只读磁盘镜像 里的:比如凭据桥,它会从你 Mac 的 Keychain 里填入通行密钥和密码。一 个正在运行的会话没有任何办法去新增一座这样的桥,因为——这正是答案 的另一半——你根本就装不了扩展。
这种封锁,不是一个钓鱼页面能把你说服绕过去的设置。在 Bromure 的浏
览器策略里,chrome://extensions 和 Web Store 都在一份硬性的封锁名单
上,没有 developer mode,没有「load unpacked」,也没有任何高级开关能
绕过它。同样,你也没有办法去做 Edgecution 在宿主机一侧所做的事——启
动第二个 Chromium,用 --load-extension 指向你真实的配置文件——因为你
真实的配置文件,并不是你 Mac 上某个可以让游荡进程瞄准一个浏览器去
打开的文件夹。它被封存在虚拟机内部。
还有一条线索值得一拉,因为它是整个故事里最廉价的一场胜利。那个诱 饵是通过 Microsoft Teams 送达的。如今很多人都把 Teams、Outlook 和 Slack 当作网页应用来用。如果这个习惯发生在一个用完即弃的 Bromure 标 签页里,那么那条冒充身份的消息、那个链接、那个伪造的「Outlook 更 新」页面,从第一秒起就全都落在了一个隔离的会话里——而我们刚刚走过 的那条攻击链,根本走不到第三步,因为那个想让你运行脚本的页面,正 待在一个够不到你 shell 的虚拟机里。那场需要宿主机的攻击,永远碰不到 宿主机。
这并不能解决什么。
隔离不是什么魔咒,它的边界值得直白地说清楚。
一条你亲手运行的命令
这里的入口,是一个人在运行一个脚本——一段被复制到剪贴板的批处 理或 PowerShell 命令,或者一个 AutoHotKey 可执行文件。如果你把一 条命令粘贴进自己的 shell 并按下 Enter,那这个回路里就没有任何浏 览器隔离可言。虚拟机与你 Mac 之间的剪贴板共享默认是开启的,因为 复制粘贴本就是正常浏览的一部分;你可以把某个配置文件切换到完全 隔离,而那个反钓鱼层也在那里,会赶在你动手之前把页面标记出来。 但有一条经久不衰的规则,比上面这一切都更古老:永远不要运行一个 网页递给你的命令。
Windows 二进制文件,一种可移植的手法
Edgecution 针对的是 Windows 上的 Microsoft Edge,那几个具体的文件 在 Mac 上是跑不起来的。但这只是一点聊胜于无的安慰,算不上防御。 Native Messaging 在 macOS 上同样是一项 Chromium 功能,而就在同一 周,还出现了一场 macOS 上的攻击活动 ,它诱骗用户粘贴一条 Terminal 命令,从而投放 Atomic 信息窃取程 序。手法是可移植的;只有那些二进制文件才是与操作系统绑定的。
Bromure 改变的东西更狭窄,但我们认为,它比一句「保证不会有任何坏 东西能碰到你」的承诺更有用。它移除的,是那些让 Edgecution 得以安静 而持久的前提条件。浏览器不再是一个紧挨着你文件、长期驻留且受信任 的进程。Native Messaging 也不再是一座任何扩展都能注册的、没有边界的 桥——扩展根本就装不进来,而浏览器自己的操作系统是用完即弃的。至于 持久化——这整套架构当初就是为了实现它而建的——如今已无处可持久:关 掉窗口,后门赖以存身的那台机器就没了。
危险的那个浏览器,是你看不见的那一个。
二十年来,关于浏览器的安全建议,讲的都是你眼前的那扇窗口——检查地 址栏,找那把小锁,不要点击奇怪的链接。Edgecution 是一个小小的提 醒:真正在造成破坏的那个浏览器,越来越多地是你从未见过的那一个: 一个无头进程,由一个计划任务启动,与一个 CDN 通信,运行着一个你从 未安装过的扩展。你没法去检查一扇从未被绘制出来的窗口的地址栏。
问题不再是你眼前那扇窗口安不安全,而是这台机器上的任何一个浏览 器,一旦被掉转枪口对准你,它能触及到什么。在一台普通的计算机上, 答案是:你的文件,经由它自带的一座桥。在一台运行 Bromure 的机器 上,答案则是:一台用完即弃的 Linux 盒子,在你用完它的那一刻就把一 切都忘得一干二净。这就是那个值得拥有的区别。安装它,把它设为你 那一半不信任的浏览的默认选项,让那些隐藏的窗口,去通向某个你本来 反正就要扔掉的东西。