返回

2026/11/11

你下载的安全工具本身就是恶意软件:虚假 GitHub 仓库感染 2,000 多台 Windows 电脑

Doctor Web 在 GitHub 上发现了构建时即运行恶意软件的虚假安全工具。本文介绍其手法,以及构建克隆代码前应检查的内容。

你在 GitHub 上找到一个小工具,可以整理网络扫描器的输出结果。它有 README、Visual Studio 项目和构建说明。你克隆下来,点击“生成”。一切看起来都很正常,但在编译器启动之前,一条隐藏的命令已经在你的工作站上运行了。

这正是 Doctor Web 在 2026 年 11 月 5 日披露的陷阱。其研究人员发现了一批伪装成扫描自动化、安全测试和日志分析工具的 GitHub 仓库,并统计到在研究进行时已有 2,000 多台 Windows 电脑被感染。本文将说明这个陷阱的原理、它为何连经验丰富的工程师也能骗过,以及在构建刚克隆的代码之前应该检查什么。

要点

  • 这些仓库伪装成安全工具,恶意命令在构建过程中或启动脚本时运行,无需另外启动任何程序。
  • 恶意代码隐藏在 Visual Studio 项目文件、.suo 文件中,以及 Python 和 Go 源文件中大段空白字符的后面。
  • 最终载荷包括两个 AsyncRAT 后门、一个劫持剪贴板中加密货币钱包地址的程序,以及一个窃取浏览器数据、VPN 和 FTP 设置以及 Discord 令牌的信息窃取程序。
  • 构建之前先阅读构建文件,并在不保存任何凭据的一次性虚拟机中构建来历不明的代码。
  • 如果你已经构建过此类项目,应将该工作站视为已被入侵,并在一台干净的设备上更改其中保存的所有凭据。

Doctor Web 发现了什么

根据 Doctor Web 的报告,最早的受感染仓库大约出现在两年前。当时它们的目标是加密货币钱包用户,伪装成区块链游戏、游戏机器人和作弊工具。如今,攻击者已将目标转向信息安全从业人员。其中一个虚假仓库包含一个用于解析、清理和格式化 Fscan 网络扫描器输出的脚本。

这并不是软件漏洞,也没有可供修补的 CVE。这是一场供应链与社会工程攻击:攻击者发布一个看似有用的项目,然后等待有人去构建它。BleepingComputer 对该研究的总结指出,利用空白字符隐藏代码是一种老技巧,但至今依然有效。

陷阱的原理

Doctor Web 在三类文件中发现了恶意代码。它们都不是审查者通常首先打开的文件。

隐藏位置会发生什么为何容易被忽视
.csproj 项目文件PreBuildEvent 在项目编译之前运行一条命令审查者阅读的是源代码,而不是项目文件
.suo 文件文件中携带一条 PowerShell 命令它是二进制设置文件,Visual Studio 通常将其放在隐藏文件夹中
Python 和 Go 源文件恶意代码藏在大量空白字符之后除非向右滚动很远或开启自动换行,否则这一行看起来是空的

此后的攻击链都是相同的。一个 PowerShell 脚本(报告中举例为 C:\Users\Public\Pictures\t.ps1 和 L.ps1)会向攻击者的服务器,或 YouTube、Telegram、Google Docs、GitCode、Pastebin 等合法服务请求一段加密字符串。解密后,该字符串是一个压缩包的下载链接,压缩包会被解压到 C:\ProgramData\Windows.Microsoft.Photos。

其中包含一个基于 Electron 的加载器 Microsoft.exe,Doctor Web 将其检测为 Trojan.Loader.3261。该加载器通过 Telegram 机器人上报系统信息,尝试提升权限,并关闭 Windows Defender、用户账户控制、通知、系统还原和卷影副本。它还会尝试卸载 ESET、McAfee 和 Malwarebytes 的产品,并修改 hosts 文件以屏蔽杀毒软件厂商的域名。

为了不被发现,加载器在默认模式下会让 explorer.exe 看起来是它的父进程,修改注册表值 VerifiedAndReputablePolicyState 以绕过智能应用控制,恢复 ntdll.dll 的原始代码以移除安全产品在其中设置的钩子,直接进行系统调用,并修补用于事件跟踪和脚本扫描的 Windows 函数。随后,它将载荷注入 RegAsm.exe 等合法的 Windows 进程中。

接下来是三个载荷:

  • 两个 AsyncRAT 后门。两个文件完全相同,但使用不同的网络端口。Doctor Web 认为,这可能使两名操作者能够同时控制同一台设备。
  • 一个剪贴板劫持程序(clipper)。它会替换剪贴板中的加密货币钱包地址,并将屏幕截图、当前窗口标题、用户登录名和 IP 地址发送给一个 Telegram 机器人。
  • 一个信息窃取程序(JS.Stealer.191)。它会检测沙箱和虚拟机,然后收集浏览器数据、FileZilla、MobaXterm 和 Total Commander 的连接文件、VPN 设置、即时通讯软件文件、游戏账户数据和 Discord 令牌,并通过 Telegram 机器人发送出去。

Doctor Web 还发现了一个尚未完成的组件,它会安装一个 Windows 服务,并在加载器被删除后重新下载。这表明攻击者仍在继续开发这套工具。

为何专业人士也会中招

这场攻击利用的恰恰是通常被视为良好实践的习惯。

  • 从源代码构建感觉比运行下载的程序更安全。许多工程师拒绝运行来历不明的二进制文件,却乐于编译一个项目,因为他们可以阅读代码。而在这里,他们读到的代码是干净的,命令藏在构建配置中。
  • 没有“运行这个程序”的那一刻。命令作为普通构建的一部分启动,因此在启动未知程序前通常会有的那一下迟疑根本不会出现。
  • GitHub 是值得信任的地方。一个 README 整洁、附有安装说明的仓库,看起来和成千上万个正常项目没什么两样。Doctor Web 指出,攻击者甚至提供了安装 Visual Studio 和克隆仓库的说明。
  • 工程师的工作站掌握着钥匙。保存的浏览器会话、VPN 配置文件和服务器连接文件,正是信息窃取程序要收集的内容,而它们往往能打开通往生产系统和客户环境的大门。

构建前应检查什么

这些检查只需几分钟,适用于你刚克隆的任何项目,无论是在 Windows、Linux 还是 macOS 上。请在用 IDE 打开项目之前,在仓库文件夹中运行它们。

# 1. Build hooks and command execution in project files
grep -rniE 'PreBuildEvent|PostBuildEvent|<Exec |powershell|cmd\.exe' \
  --include='*.csproj' --include='*.vbproj' --include='*.vcxproj' \
  --include='*.props' --include='*.targets' .
# 2. Visual Studio user-option files that should not be in a repository
find . -name '*.suo'
# 3. Files with very long runs of spaces or tabs on one line
grep -rlE '[[:space:]]{200,}' .

在没有 Unix 风格 shell 的 Windows 上,可以用 PowerShell 完成同样的空白字符检查:

Get-ChildItem -Recurse -File |
  Select-String -Pattern '\s{200,}' -List |
  Select-Object -ExpandProperty Path

命中并不代表一定是恶意软件。许多正常项目都会使用构建事件,压缩后的文件也会包含很长的行。但这足以成为一个理由:在任何东西运行之前,先打开文件,读一读命令到底做了什么。

  1. 先阅读构建文件。项目文件、Makefile、setup.py、软件包安装脚本和 CI 文件都可以运行命令。要像审查源代码一样仔细地阅读它们。
  2. 删除随仓库一起出现的 .suo 文件和 .vs 文件夹。它们是每个用户的个人设置,项目构建并不需要它们。
  3. 开启自动换行或显示空白字符,在编辑器中审查不熟悉的代码时尤其如此。
  4. 查看仓库的历史记录。新注册的账户、只有一次大型提交、几乎没有真实的 issue 或贡献者、功能与知名项目重复的工具,这些都是需要更加谨慎的信号。仅凭星标和复刻数说明不了什么,因为它们可以造假。
  5. 在一次性环境中构建来历不明的代码。使用不保存密码、没有 VPN 配置文件和 SSH 密钥的一次性虚拟机或容器,用完后将其删除。

提示:保留一个干净的虚拟机快照,专门用来试用工具。在其中克隆、构建和测试,然后回滚到快照。如果某个工具确实有用,请在它接近你日常使用的工作站之前先进行全面审查。

如果你已经构建过

Doctor Web 已在其入侵指标列表中公布了文件哈希、域名、地址和示例仓库名称。报告中描述的迹象包括:

  • 存在 C:\ProgramData\Windows.Microsoft.Photos 文件夹或名为 Microsoft.exe 的程序;
  • C:\Users\Public\Pictures 中存在 t.ps1 或 L.ps1;
  • Windows Defender 中存在并非你添加的 regasm.exe 或 dwm.exe 排除项;
  • hosts 文件中出现杀毒软件厂商的域名,或者系统还原和卷影副本被关闭;
  • 安全软件消失或停止更新。

如果发现上述任何迹象,或者你确知自己构建过列表中的项目,请假定这台机器上的所有内容都已被读取,并采取以下措施:

  1. 断开该工作站的网络连接,并通知你的安全团队。
  2. 在另一台干净的设备上,更改浏览器中保存的密码并退出所有活动会话,使被盗的会话 Cookie 失效。
  3. 更换 VPN 配置文件,以及 FTP 和终端客户端中保存的密码或密钥,并检查这些凭据能够访问的服务器。
  4. 重置 Discord 及其他即时通讯软件的会话,并将加密资产转移到在干净设备上创建的钱包中。
  5. 重新安装操作系统,而不是尝试清理。该加载器会关闭安全和恢复功能并安装两个后门,清理过的系统很难让人放心。

提示:检查服务器和 VPN 日志,查看受影响账户在构建该项目之后是否有登录记录。被盗的连接文件会在攻击者的系统上使用,而不是在被感染的工作站上。

LOGIQ 能提供哪些帮助

LOGIQ 帮助企业安全地运行开源软件,涵盖企业级 Linux、OpenJDK 以及围绕它们的构建和部署流水线。如果你希望有人帮你审视团队将外部代码引入环境的方式,或者需要帮助将构建系统与关键凭据隔离开来,欢迎与我们联系。