一个跑在NAS上的Sonarr,收到了一条警告。它以为自己在下载《南方公园》的新一集,结果拉下来的是一个.exe文件。

打开网易新闻 查看精彩图片

这是网页开发者兼设计师Thereallo记录的一次真实遭遇。文件被伪装成动画剧集,文件名模仿了剧集命名,扩展名却是可执行文件,还挂在有大量做种者的公共Tracker上。Sonarr把它当成普通媒体文件尝试导入,失败后并没有停下——大约每90秒就重试一次导入,持续空耗系统资源。

打开网易新闻 查看精彩图片

正方会说,这不过是自动化工具的正常反应:Sonarr的职责就是盯着RSS、抓取、导入,它没有判断文件是不是恶意程序的能力。反方则指出,恰恰是这种"无脑信任"构成了攻击面——攻击者不需要骗过人,只需要骗过一条自动化的流水线。

打开网易新闻 查看精彩图片

判断很直接:这不是Sonarr的漏洞,而是整条下载链路上缺少一道执行文件拦截。

这个恶意文件本身并不复杂,但伪装做得相当刻意。它没有像常见样本那样捆绑假的编解码器安装包,而是以单个可执行文件的形式提供。qBittorrent在下载完成后立刻显示已完成,磁盘上却并没有真正写入内容,说明样本可能具备规避磁盘写入的机制。

更值得看的是体积构成。恶意代码本体只有118KB,是一个PE格式的x64 GUI可执行文件,但文件实际被附加了886MB的无关数据。这种膨胀大概率是为了让大量安全扫描器直接放弃读取文件,用体积换检测率。

把前118KB切出来丢进IDA Pro,看到的是反复对全局变量做XOR运算的代码,典型的混淆手法,目的是让反编译输出变得难以阅读。剥掉全部混淆逻辑后,真正的行为可以归成六步:

  1. 把自己作为文件打开
  2. 读取文件最后64字节
  3. 用这段数据在垃圾数据中定位并解密隐藏的载荷
  4. 在内存中手动映射PE文件
  5. 改写PEB结构体中的ImageBaseAddress字段,指向内存中展开的载荷基址
  6. 执行载荷

也就是说,真正的本体藏在"最后64字节"里。解密使用ChaCha20,常量被藏在全局变量中,最终被分析还原出来。样本还带有反调试和反沙箱机制,一旦检测到调试环境就悄悄退出。整个流程不触碰磁盘,全部在内存中完成。

解密后生成的第二个PE文件约929KB,是一个高度混淆的信息窃取型恶意程序,字符串加密、导入表在运行时才解析。它盯上的目标清单很长:

  • 浏览器:Chrome、Edge、Brave、Opera、Opera GX、Vivaldi、Firefox,包括密码、Cookie、自动填充和Chrome的应用绑定加密功能
  • 加密钱包:Exodus、Electrum、Atomic、Guarda、Coinomi、Ledger Live、Trezor Suite、Wasabi、Sparrow、Monero、Zcash、Armory,以及浏览器扩展钱包
  • 密码管理器:KeePass、KeePassXC、Bitwarden、1Password、NordPass、RoboForm、Windows凭据管理器
  • 账号:Telegram、Discord令牌、Steam、Roblox Cookie、Minecraft账号、Authy
  • 开发者相关:.ssh、.aws、gcloud、.azure、.kube、.docker
  • 远程访问:AnyDesk、TeamViewer、WinSCP、FileZilla、mRemoteNG、RDCMan
  • 其他:Outlook、Thunderbird、VPN配置、OBS配置、便签、桌面文档

窃取到的数据经zlib压缩后发往攻击者服务器。C2地址没有硬编码在样本里,而是从YouTube频道"bubblegym"(2026年9月14日创建)和GitHub gist获取,取回后再经Base64解码,与一段类似键盘乱敲的字符串做XOR运算还原。

针对这类攻击,Thereallo给出的处置建议都落在工具配置层面:

  • qBittorrent:在设置的"排除文件名"中加入*.exe、*.scr、*.lnk、*.bat、*.cmd,直接阻断可执行文件下载
  • Sonarr/Radarr:检测到*.exe时使用"从客户端删除"功能,并加入黑名单
  • Prowlarr:对提供恶意文件的Tracker考虑降级或彻底移除

最后他给恶意软件开发者的建议是:把技术用在正职工作上,别耗在粗制滥造的样本上。

对跑自动化下载链路的人来说,这件事的教训不在分析有多深,而在配置里那几行通配符——90秒一次的重试不会自己停下来。