在家庭服务器或影视仓储系统上,全自动追剧工具 Sonarr 与下载器协同运转,通常能让用户彻底摆脱手动检索资源的繁琐。然而,一套看似成熟的自动化抓取流程,正被黑客改造成免审核的恶意软件分发通道。近期在公开 BT 索引站上,一个伪装成《南方公园》新剧集的文件被 Sonarr 自动检索并下载,其真实身份却是一个带有针对性免杀外壳的信息窃取木马。

这并非孤立个案。此类攻击专门利用家庭自动化流水线的信任机制:攻击者通过伪造做种人数诱导算法拉取,再通过无意义字节将文件撑大至数百兆以逃避云端杀毒沙箱检测。自动化的确省去了手动点击,但一旦终端用户在共享目录中误触运行,受害者的浏览器凭据、密码库乃至云端开发者密钥都将被一并卷走。

膨胀的假剧集与算法盲区

事件的起因非常典型:Sonarr 在追更《南方公园》单集时,从公开索引源捕获到了一个带有 2392 个做种者 虚假数据的目标。该任务在添加到 qBittorrent 后迅速触发异常并陷入每 90 秒重试一次的死循环。技术分析显示,该文件并非常规视频容器,而是一个后缀直接为 .exe 的 Windows 可执行文件,实际程序本体仅有 118 KB,其余 886 MB 均为末尾填充的垃圾无用数据。

Code
<svg viewBox='0 0 760 220' width='100%' height='220'>
  <rect x='0' y='0' width='760' height='220' fill='#fbf9f4' stroke='#e2dccf' rx='8'/>
  <text x='32' y='36' font-size='18' font-weight='bold' fill='#b25a3a'>虚假剧集文件的内部体积解剖</text>
  <line x1='32' y1='52' x2='728' y2='52' stroke='#e2dccf' stroke-width='1'/>
  
  <rect x='32' y='80' width='110' height='70' fill='#b25a3a' rx='4'/>
  <text x='87' y='112' font-size='15' font-weight='bold' fill='#ffffff' text-anchor='middle'>PE 执行体</text>
  <text x='87' y='134' font-size='13' fill='#ffffff' text-anchor='middle'>118 KB</text>
  
  <rect x='152' y='80' width='576' height='70' fill='#ede8df' stroke='#d5cebf' rx='4'/>
  <text x='440' y='112' font-size='15' font-weight='bold' fill='#2c2822' text-anchor='middle'>垃圾填充数据(Padding)</text>
  <text x='440' y='134' font-size='13' fill='#7a7266' text-anchor='middle'>886 MB(用于绕过杀软体积扫描上限)</text>
  
  <text x='32' y='185' font-size='13' fill='#7a7266'>末尾 64 字节保存 ChaCha20 解密配置,启动后解密载荷直接在内存展开</text>
</svg>

这种将体积膨胀至数百兆的做法并非无的放矢。自动化抓取系统通常会设置视频文件的最低大小阈值,几百兆的体积极易被识别为合规的正片;更关键的是,主流杀毒软件引擎和在线云沙箱对上传分析的文件普遍设有体积上限,超额的垃圾填充会导致多数扫描机制直接放弃分析。

这类利用虚假汇报做种数来欺骗客户端优先选择的手法,在社区中早有迹可循。Sonarr Issue #7029 曾详细记录过索引站追踪服务器通过虚构健康度使任务停滞在获取元数据阶段的案例;Bitdefender 在 2024 年 11 月也曾披露过类似的传播战役,黑客利用美剧《From》第三季尚未开播的空档,制作约 800 MB 的虚假膨胀剧集分发 Lumma Stealer 窃密木马。

内存解密载荷与广泛的凭据搜刮

逆向分析表明,这个仅 118 KB 的外壳具备极高对抗性。攻击者部署了大量的冗余异或指令干扰反编译,但核心解密逻辑极为紧凑:读取自身文件末尾的 64 字节配置,通过 ChaCha20 算法在内存中解密出第二层载荷,随后直接通过修改进程环境块(PEB)映射执行,整个解密与驻留过程完全不落地到硬盘。

第二层载荷是一个用 MSVC 编译的 C++ 程序,体积为 929 KB,内部对绝大多数敏感字符串采用了 AES-128-CTR 逐条加密。借助 Unicorn 引擎模拟执行并提取寄存器后,其搜刮目标一览无余:

  • 浏览器与密码.遍历 Chrome、Edge、Firefox、Brave 等主流浏览器,提取 Cookie、历史记录与自动填充凭据,并包含针对 Chrome 新版应用绑定加密(App-Bound Encryption)的绕过代码;搜刮 Bitwarden、1Password、KeePass 等密码库凭据。
  • 开发与远程配置.强行窃取当前用户的 .ssh 密钥、.aws、.azure、gcloud、.kube 以及 .docker 认证配置;同时抓取 AnyDesk、TeamViewer、WinSCP、FileZilla 的登录凭据。
  • 资产与通讯数据.扫描 Telegram 客户端会话、Discord 令牌、Steam 认证,以及 Ledger Live、Trezor Suite、Exodus 等冷热加密钱包数据,甚至包括桌面便签(Sticky Notes)中的明文内容。
Code
<svg viewBox='0 0 760 300' width='100%' height='300'>
  <rect x='0' y='0' width='760' height='300' fill='#fbf9f4' stroke='#e2dccf' rx='8'/>
  <text x='32' y='36' font-size='18' font-weight='bold' fill='#b25a3a'>木马入侵与凭据搜刮执行链路</text>
  <line x1='32' y1='52' x2='728' y2='52' stroke='#e2dccf' stroke-width='1'/>
  
  <rect x='32' y='85' width='150' height='80' fill='#ffffff' stroke='#d5cebf' rx='6'/>
  <text x='107' y='118' font-size='15' font-weight='bold' fill='#2c2822' text-anchor='middle'>公开 BT 索引站</text>
  <text x='107' y='142' font-size='13' fill='#7a7266' text-anchor='middle'>伪造 2000+ 做种数</text>
  
  <polygon points='192,125 204,120 204,130' fill='#b25a3a'/>
  <line x1='182' y1='125' x2='200' y2='125' stroke='#b25a3a' stroke-width='2'/>
  
  <rect x='214' y='85' width='150' height='80' fill='#ffffff' stroke='#d5cebf' rx='6'/>
  <text x='289' y='118' font-size='15' font-weight='bold' fill='#2c2822' text-anchor='middle'>NAS 自动化流程</text>
  <text x='289' y='142' font-size='13' fill='#7a7266' text-anchor='middle'>Sonarr 调度下载</text>
  
  <polygon points='374,125 386,120 386,130' fill='#b25a3a'/>
  <line x1='364' y1='125' x2='382' y2='125' stroke='#b25a3a' stroke-width='2'/>
  
  <rect x='396' y='85' width='150' height='80' fill='#ffffff' stroke='#d5cebf' rx='6'/>
  <text x='471' y='118' font-size='15' font-weight='bold' fill='#2c2822' text-anchor='middle'>共享下载目录</text>
  <text x='471' y='142' font-size='13' fill='#c0392b' text-anchor='middle'>桌面终端误触执行</text>
  
  <polygon points='556,125 568,120 568,130' fill='#c0392b'/>
  <line x1='546' y1='125' x2='564' y2='125' stroke='#c0392b' stroke-width='2'/>
  
  <rect x='578' y='85' width='150' height='80' fill='#ffffff' stroke='#c0392b' stroke-width='1.5' rx='6'/>
  <text x='653' y='118' font-size='15' font-weight='bold' fill='#c0392b' text-anchor='middle'>全方位凭据失窃</text>
  <text x='653' y='142' font-size='13' fill='#7a7266' text-anchor='middle'>SSH/AWS/钱包/密码</text>

  <rect x='32' y='195' width='696' height='75' fill='#ede8df' rx='4'/>
  <text x='48' y='225' font-size='13' font-weight='bold' fill='#2c2822'>C2 通信机制矛盾点:</text>
  <text x='48' y='248' font-size='13' fill='#7a7266'>一方面利用 YouTube 频道简介与 GitHub Gist 隐藏真实回连地址,另一方面却在二进制内硬编码了明文备用地址。</text>
</svg>
自动化系统越缺乏人工干预,恶意软件越容易将存储网络借道为直达终端的传输走廊。

有意思的是,该程序在架构上呈现出极大的割裂感。它运用了严格的动态 API 解析和沙箱环境探测,甚至使用了 YouTube 频道的个人简介与 GitHub Gist 作为接收控制服务器地址的死信箱(Dead Drop);但在同一段代码的备用回退逻辑中,攻击者却直接将明文服务器地址硬编码在了二进制文件内。这种高阶混淆与业余粗心并存的特征,是当下网络黑产拼装恶意软件工程的典型写照。


自动化断点与家庭防御纵深

从安全边界来看,Sonarr 本身运行在 Linux NAS 或容器化环境中,并不能直接解析运行 Windows PE 文件,自动化软件本身并非直接受害者。真正的危险在于共享存储链路。在家庭局域网环境中,NAS 下载目录通常挂载在多台个人电脑上,家庭成员或缺乏安全意识的用户看到下载完成的同名剧集文件并双击启动,攻击便借由自动化通道在内网核心终端落地。

开源社区对此类威胁早有博弈。Sonarr 在 Issue #3709 中就讨论过针对伪造剧集后缀的黑名单机制,并记录了热门美剧未播前即出现虚假种子的现象;随后在 Issue #7369 与 PR #7397 中,维护团队加入了对 .zipx、.lnk 等非媒体后缀的拦截,一旦包含危险扩展名直接将下载任务判定为失败。

然而静态黑名单机制总会落后于黑客的封装手法。正如社区 Issue #7721 所指出的,攻击者已经从常规的可执行文件转向 .scr、.arj 等较为小众的容器格式。仅靠下载器端排除文件后缀并不闭环,专注于下载整理的生态工具 decluttarr 在其 Issue #226 中指出,仅在 qBittorrent 侧丢弃危险文件会导致上游 Sonarr 陷入无尽的任务重试,必须联动清理机制将假资源直接移入黑名单才能彻底阻断。

  • 风险.若将公开索引源接入全自动抓取管道,且未在下载端严格限制可执行文件后缀,NAS 将直接沦为免受云查杀拦截的内网木马中继站。

要阻断此类攻击,自动化架构必须建立纵深防护:在 qBittorrent 等下载器设置中,将 .exe、.scr、.lnk、.bat 以及冷门压缩格式列入排除名单;在 Prowlarr 端降低反复投毒的公开追踪站权重;更根本的做法,则是将媒体入库目录与下载暂存目录物理隔离,杜绝用户在个人 PC 上直接运行未通过流媒体转码处理的原始文件。