andixurniawan/malware-scanner

GitHub: andixurniawan/malware-scanner

一款跨平台的供应链恶意软件扫描工具,用于检测并隔离通过项目配置文件和开发工具潜入开发者环境的恶意代码。

Stars: 0 | Forks: 0

# malware-scanner 一款用于扫描通过项目配置文件和开发工具潜入的供应链恶意软件的工具。适用于 **macOS/Linux** 和 **Windows**。 最初于 2026 年 7 月至 8 月处理真实安全事件时开发,并根据实地发现进行了多次改进。 ## 扫描目标 该类恶意软件不会攻击网站访问者。它的目标是**开发者机器**——笔记本电脑、构建服务器和 CI runner。 它之所以难以被察觉: - Payload 被附加在看似正常的配置文件的**最后一行**,前面带有**数百个空格**,因此在编辑器中打开文件时无法看到。 - 存储库中的 `.vscode/` 文件被配置为**在打开文件夹时立即自动运行命令**——无需构建,无需 `npm install`。 - Payload 伪装成资产文件,例如内部实际为代码的 `.woff2` 字体文件。 - 自动运行的开发工具入口点也被感染——包括 npm 入口文件和基于 Electron 的应用程序。 ## 用法 ### macOS / Linux ``` chmod +x malware-scan.sh # 扫描并隔离确认为 malware 的文件 ./malware-scan.sh # 仅扫描 — 不移动任何文件 ./malware-scan.sh --no-quarantine # 同时终止进程并保存结果 ./malware-scan.sh --kill --report ~/hasil-scan.txt # 仅扫描特定目录 ./malware-scan.sh --quick ~/work ~/projects ``` ### Windows ``` # 扫描并隔离确认为 malware 的文件 .\malware-scan.ps1 # 仅扫描 — 不移动任何文件 .\malware-scan.ps1 -NoQuarantine .\malware-scan.ps1 -Kill -Report "$env:USERPROFILE\hasil-scan.txt" .\malware-scan.ps1 -Path "C:\Users\nama\work" ``` **在不指定目录参数的情况下运行。** 限制扫描范围已多次导致遗漏发现——恶意软件曾被发现在 `~/.nvm` 和 `/Applications` 中,这两者都在项目文件夹之外。 退出代码:`0` 表示干净,`1` 表示有发现,`2` 表示用法错误。 ## 隔离区 从 v2.3 版本开始,**确定**为恶意软件的文件会被直接移动到 `$HOME/karantina-malware-<日期-时间>/`(权限为 `700`)。是移动而非删除——其内容保持完整,并且每次隔离都会附带 `MANIFEST.tsv` 和 `PULIHKAN.sh`,以便在发生误报时恢复一切。 操作顺序是严格绑定的,这正是其安全性的保障: ``` salin → verifikasi ukuran salinan = sumber → baru hapus yang asli └─ gagal di langkah mana pun: berkas asli tidak disentuh sama sekali ``` 被移动的仅仅是**不存在合法形态**的发现: | 发现 | 是否隔离 | 原因 | |---|---|---| | 匹配 signature | 是 | 在 1,500 个文件中零误报 | | `.vscode` 运行伪装资产文件 | 是 | `node …woff2` 绝不合法 | | `[CURIGA]`(启发式空格检测) | 否 | 曾产生 25 次误报 | | 仅 `task.allowAutomaticTasks` | 否 | 可能是合法的 | | 常规 `folderOpen` 任务 | 否 | 可能合法——例如启动 dev server | | `[artefak]` | 否 | 并非感染 | 使用 `--no-quarantine`(Windows 上为 `-NoQuarantine`)可完全关闭此功能。 在 Windows 上,文件会被移动到 `%USERPROFILE%\karantina-malware-<日期-时间>\`,并通过 `PULIHKAN.ps1` 进行恢复。驱动器号将作为文件夹名称保存(`C:\a\b.js` → `berkas\C\a\b.js`),以便在恢复时能够精确重组。 **如果被隔离的文件受 git 跟踪**,脚本会发出明确警告:仅仅移动它们无济于事,因为一次 `git checkout` 或后续的部署就会将它们带回来。真正需要清理的是存储库本身。 ## 检查内容 | # | 检查项 | |---|---| | 1 | 正在运行的 loader 进程 | | 2 | 连接至已知 C2 服务器 | | 3 | 被注入 payload 的文件 | | 4 | 在打开文件夹时执行命令的编辑器配置 | | 5 | 批量 push 自动化文件及无保护的凭证 | | 6 | 导致恶意软件在终止后重新启动的机制 | 在 Windows 上,针对 respawn 机制的检查包括 Registry Run keys、Scheduled Tasks 和 Startup 文件夹。 ## 设计原则 在早期版本在实际应用中失败后,我们做出了一些决定,其原因可能对编写类似工具的人有所帮助。 **检测不依赖于活动编号。** 此类恶意软件的活动编号已经更改了六次。早期版本采用字面匹配,导致两个变体直接漏网。目前采用的是跨变体稳定的形式——构建戳、混淆器生成的函数名以及 marker 结构。 **检测依赖于上下文,而非原始模式。** 恶意软件在 `require()` 中利用 unicode 转义来隐藏模块名。仅仅检测 unicode 转义会产生数十次误报——正常的编码表和 PDF 库也会包含它们。其特征在于**在 `require()` 调用内部**使用转义。 **存在不依赖 signature 的第二层检测。** 该家族的 Payload 总是被附加在最后一行,前面带有数百个空格。符合此模式的文件将被标记为 `[CURIGA]`——这意味着需要人工检查,而非确认已感染。这能够捕获 marker 从未见过的变体。 **合法进程不会被终止。** 只有当进程的命令行包含 payload marker 时,该进程才会被标记——而不仅仅是因为它使用了 `node -e`。经过实测:带有恶意软件 marker 的诱饵进程被成功终止,而其他基于 Node 的应用程序仍继续运行。 **自动隔离,但不会自动终止进程。** 这种差异是有意为之。移动文件可以通过 `PULIHKAN.sh` 完全撤销,而终止的进程会丢失可能仍需用于分析的内存状态。可逆的操作可以作为默认设置;不可逆的操作则必须通过 `--kill` 显式请求。 **隔离区从不干预启发式发现。** 只有匹配 signature 的发现以及触发运行伪装资产文件的发现才会被移动。2.1 版本曾从启发式模式中产生过 25 次误报;如果当时有自动移动功能,合法文件也会丢失。一旦工具移动了错误的文件,人们就会对其失去信任。 **发现永远不会被隐藏。** 正常位置下包含检测模式的文件——转录本、编辑器日志、脚本本身——会被标记为 `[artefak]` 并单独计算,但仍会予以显示。 ## 注意事项 该脚本以纯文本形式包含恶意软件检测模式,因此可能会被杀毒软件标记。这是正常现象,并不代表已被感染。 无需管理员权限。请以平时工作的普通用户身份运行,因为该恶意软件正是以此类用户的访问权限运行。 ## 如果发现异常 1. 在清理受感染文件之前,请勿运行前端构建 2. 请勿在基于 VS Code 的编辑器中打开受影响的存储库 3. 假定该机器上的凭证已泄露——撤销 token、SSH 密钥和数据库凭证,然后**从其他设备**重新生成替代凭证 4. 在防火墙处屏蔽通往 C2 服务器地址的出站流量 发现批量 push 自动化文件意味着该机器不仅仅是一个受害者——请将其报告给安全团队,且不要删除这些文件。 ## 许可证 MIT
标签:AI合规, 库, 应急响应, 应用安全, 开发环境安全, 恶意软件扫描, 网络信息收集