「大多数样本在VirusTotal上完全未被检出。」ANY.RUN的研究员在报告里写下这句话时,这个名为SpankRAT的工具包已经在暗处运行了足够长的时间。
它用Rust编写,分两个阶段植入,最终把自己藏进Windows最核心的进程之一。更麻烦的是,它生成的网络流量看起来就像普通用户在正常操作电脑。
这不是什么理论上的攻击手法。ANY.RUN的分析师已经拿到了样本,还原了完整的执行链条。问题是:为什么现代安全体系会对这种"寄生"在合法进程里的威胁如此迟钝?
拆解SpankRAT:一个两阶段的设计哲学
这个工具包的结构很简洁,只有两个组件,但分工明确。
第一阶段叫SpankLoader,是个轻量级的加载器。它的任务只有一个:从远程服务器拉取真正的恶意代码。通信用的是未加密的HTTP——这个细节很有意思,后面会讲到。
SpankLoader拿到权限后,先给自己升个级。它调用SeDebugPrivilege(调试权限),这是Windows系统里权限极高的一个令牌,通常只有调试器或者系统级工具才会用到。拿到这个权限,它就能随意操作其他进程了。
接下来它把一个叫rmm_agent.dll的文件丢到C:\ProgramData\目录下。这个路径是Windows系统保留给应用程序数据的,很多合法软件也在这里存放文件,所以不会引起注意。
真正的动作是下一步:DLL注入。SpankLoader把这个恶意DLL注入到explorer.exe进程里。explorer.exe就是Windows资源管理器,你每次开机它都在运行,负责桌面、任务栏、文件浏览。它是Windows最核心、最被信任的进程之一。
注入完成后,SpankLoader还安排了一个后手:创建一个名为RmmAgentCore的计划任务,触发条件是用户登录,执行权限设为最高。这样即使电脑重启,恶意代码也能自动恢复。
到这里,第一阶段的使命结束。SpankLoader本身可以消失了,真正的控制功能已经转移到了explorer.exe内部。
为什么偏偏选explorer.exe?
这个选择不是随机的,而是一个精心计算过的"信任套利"策略。
现代安全产品大量使用"基于信誉的检测"(reputation-based detection)。简单说,就是给每个程序、每个进程、每个网络连接打分。来自微软签名的系统进程?信誉极高。来自临时目录、没有数字签名的可执行文件?信誉极低,重点监控。
SpankRAT的整个设计就是围绕这个评分体系做逆向工程。
当恶意DLL被注入explorer.exe后,它发起的所有网络连接,在防火墙、EDR(端点检测与响应)、网络监控工具看来,源头都是explorer.exe。这个进程天生自带"白名单"光环,它的网络活动通常不会被拦截,甚至不会被详细记录。
ANY.RUN的研究员指出,这种技术"尤其危险",因为它让恶意流量看起来像是来自"受信任的内置Windows进程"。传统端点检测和网络检测方案很难识别出异常——它们看到的只是一个正常的系统进程在连外网。
更隐蔽的是,安全运营中心(SOC)的分析师在处置告警时,会天然地给来自系统进程的告警降优先级。告警太多,时间太少,人的注意力会本能地跳过"看起来正常"的东西。SpankRAT利用的不仅是技术漏洞,更是人机交互中的认知偏差。
C2通信:用WebSocket和JSON伪装成正常业务
SpankRAT在explorer.exe里站稳脚跟后,会建立一个WebSocket连接回控制服务器。地址格式是ws://:9000/ws/agent。
WebSocket是个很有意思的选择。它不是传统的HTTP请求-响应模式,而是全双工的长连接,适合实时通信。更重要的是,现在很多正经的Web应用也用WebSocket——在线协作工具、股票行情、聊天软件。防火墙和代理服务器通常不会拦截它,因为拦了可能会误伤正常业务。
通信协议用的是JSON,一种人类可读的数据格式。这同样是在模仿正常软件的行为。二进制协议看起来更像"黑客工具",JSON则像是普通的API调用。
ANY.RUN的分析显示,这个工具包支持18种不同的服务器指令。功能覆盖相当全面:执行远程命令、文件操作、进程管理、系统信息收集,等等。所有系统交互都通过PowerShell完成,参数是-NoProfile -NonInteractive -ExecutionPolicy Bypass——标准的不留痕迹模式。
系统指纹识别直接从注册表读取构建号和产品名称,这些细节说明开发者对Windows内部机制相当熟悉。
一个值得注意的矛盾点:第一阶段的C2通信用未加密的HTTP,但第二阶段的WebSocket连接似乎有更高的隐蔽性要求。这可能是一种"分层暴露"策略——加载器阶段被发现的代价较低,核心功能则需要更强的隐蔽性。也可能只是不同开发者的代码拼接,但ANY.RUN的报告没有给出更多样本来源信息。
VirusTotal的"失明":签名检测的系统性困境
ANY.RUN在分析时提到,"大多数SpankRAT样本在VirusTotal上仍然未被检出"。
VirusTotal聚合了几十家杀毒引擎的检测结果,被行业视为"全面扫描"的基准。如果一种恶意软件在这里都能保持低调,说明它成功绕过了主流的检测范式。
问题出在哪里?
SpankRAT的核心恶意功能并不存在于磁盘上的独立文件中。它分阶段投递,第一阶段只是个下载器;第二阶段是内存中的DLL注入。传统的基于文件签名的杀毒引擎,扫描的是磁盘上的可执行文件。如果恶意代码只在内存里运行,或者动态下载执行,签名比对就找不到目标。
更深层的问题是"信任链"的滥用。杀毒引擎看到explorer.exe,看到微软的数字签名,看到它在正常路径运行,就很难再往下追问:这个进程内部的内存空间里,是不是藏着外来的DLL?
这不是SpankRAT独有的技巧。DLL注入、进程镂空(process hollowing)、APC注入等技术在APT攻击中已经很常见。但SpankRAT的完整工具链展示了一种"工业化"的成熟度:从持久化到权限维持,从流量伪装到C2通信,每个环节都针对现代防御体系做了优化。
Rust语言的选择也值得关注。Rust编译的二进制文件有独特的内存安全特性,但更重要的是,它对静态分析不太友好。控制流平坦化、字符串加密、反调试这些技巧,在Rust实现里可能更难被自动化工具还原。
ANY.RUN的解法:行为分析为什么重要
面对这种威胁,ANY.RUN给出的建议是转向行为分析平台,比如他们自己的沙箱产品。
逻辑很直接:既然文件特征不可信,那就看程序做了什么。SpankLoader调用SeDebugPrivilege、向explorer.exe注入代码、创建计划任务、建立外连——这些动作单独看可能都有合理解释,但按特定顺序组合在一起,就是明确的攻击链。
行为分析的优势在于不依赖预先知道的"坏东西"特征。它监控的是系统调用序列、内存操作模式、网络连接图谱。即使SpankRAT的某个变种换了C2域名、改了通信协议,只要它还走"注入explorer.exe→WebSocket外连"这条路,行为模型就能识别。
ANY.RUN特别强调他们的沙箱能"实时呈现完整的执行链、注入活动、C2通信模式和权限提升行为"。这针对的正是SpankRAT这类威胁的核心难点:攻击分布在多个阶段、多个进程,单点检测很难看到全貌。
不过,行为分析也有成本。沙箱执行需要时间,大规模部署需要算力,误报率也需要持续调优。对于安全团队来说,这不是"换掉杀毒软件"那么简单,而是检测策略的系统性升级。
这个案例的真正启示
SpankRAT的技术细节本身并不 revolutionary。DLL注入explorer.exe是已知技术,Rust编写的恶意软件也越来越多,分阶段投递更是标准操作。
但它的"产品化"程度值得注意。这不是某个黑客的即兴发挥,而是一个设计精良、测试充分、针对特定防御弱点优化的工具包。18种C2指令、完整的持久化机制、对Windows内部API的熟练运用——这些都需要时间和资源投入。
更关键的是它揭示的防御缺口。基于信誉的检测、文件签名扫描、简单的进程白名单,这些构成了过去十年端点安全的主流范式。SpankRAT的设计几乎是针对这个范式的"压力测试",而且测试通过了。
对于25-40岁的技术从业者来说,这个案例有几个实用的 takeaway:
第一,如果你的团队还在主要依赖杀毒软件的"绿色对勾"来判断文件安全性,需要重新评估策略。现代威胁的活跃阶段 increasingly 发生在内存中,磁盘扫描的覆盖盲区在扩大。
第二,网络监控需要更细粒度的上下文。看到explorer.exe连外网,不能自动放行;需要追问的是:这个连接是在进程的哪个线程发起的?对应的内存模块是什么?
第三,SOC的告警分级规则可能需要调整。基于进程身份的自动降优先级,正在被攻击者系统性利用。人机协作的流程设计,要假设攻击者已经研究过分析师的心理模型。
ANY.RUN的报告最后给出了一些狩猎指标(IoC),包括特定的计划任务名称、DLL文件名、注册表查询模式。这些 tactical 层面的情报会随样本变化而失效,但背后的 strategic 洞察更持久:防御者和攻击者的博弈,正在从"谁能隐藏代码特征"转向"谁能模拟正常行为更逼真"。
SpankRAT在这个维度上走了一步。下一步会是什么,取决于谁能更快地把行为分析、内存取证、网络流量关联这些能力产品化、自动化。
热门跟贴