BLTSEC/aur-sentinel

GitHub: BLTSEC/aur-sentinel

该工具是针对 2026 年 6 月 AUR 供应链攻击的本地 Bash 分诊脚本,帮助 Arch Linux 用户基于公开 IoC 快速排查主机是否受影响。

Stars: 0 | Forks: 0

# AUR Sentinel 针对 2026 年 6 月 Arch User Repository (AUR) 供应链攻击活动的尽力而为的本地分诊工具。该活动涉及恶意的 `atomic-lockfile` / `js-digest` / `lockfile-js` npm/Bun 包活动,社区报告的后续包名指标(如 `nextfile-js`)、通常被称为 `deps` 的 ELF 负载、信息窃取行为,以及可选的仅限 root 的 eBPF rootkit 行为。 该项目刻意保持精简:仅提供一个可审计的 Bash 脚本,帮助 Arch Linux 用户快速确认以下问题: - 我当前是否安装了已知的受影响 AUR 软件包? - 我的 pacman 历史记录中是否有安装或升级这些包的痕迹? - AUR 助手缓存中是否包含攻击活动指标? - npm/Bun 产物中是否出现了恶意软件包? - 主机上是否存在明显的持久化、eBPF、进程、套接字或负载哈希指标? ## 快速开始 请先审查脚本,然后在本地运行: ``` git clone https://github.com/BLTSEC/aur-sentinel.git cd aur-sentinel bash aur-sentinel.sh ``` 推荐的高覆盖率运行方式: ``` sudo bash aur-sentinel.sh --fetch-list --deep-hash ``` 可选的扩展启发式审查: ``` sudo bash aur-sentinel.sh --fetch-list --deep-hash --extended ``` 离线/手动审查过的受影响包列表: ``` sudo bash aur-sentinel.sh --affected-list ./affected-packages.txt --deep-hash ``` ## 安全模型 该脚本在设计上比将未知远程脚本通过管道传递给 shell 运行更安全: - 它**不**执行下载的代码。 - 默认**关闭**网络访问。 - `--fetch-list` 仅将公开的包名列表作为数据下载,并在比较前对其进行规范化处理。主要数据源是来自 aur-general 邮件列表的 Arch Linux HedgeDoc 链接列表。 - `--fetch-list` 还包含少量来自 2026-06-12 Arch aur-general 报告的补充包名集合,这些包名在最初验证时并不存在于公开列表 URL 中。 - `--affected-list FILE` 允许您使用已在本地审查过或从其他地方获取的列表。 - 它不会将任何数据上传到外部。 - 它仅输出调查结果和高级状态,而不会输出完整的软件包数据库、shell 历史记录、浏览器数据或机密信息。 - `--extended` 是可选的,因为通用的入侵启发式检测范围更广,可能会产生误报。 ## 涵盖的入侵指标 该脚本和本 README 有意包含了来自事件研究的公开指标,以及少量明确标注的社区报告指标。受影响的 AUR 软件包列表**未内嵌**在脚本中,因为它在早期响应期间发生了变化;请使用 `--fetch-list` 或 `--affected-list FILE` 进行包名匹配。 | 类型 | 指标 | | --- | --- | | 恶意 npm/Bun 包名 | `atomic-lockfile` | | 恶意 npm/Bun 包名 | `js-digest` | | 恶意/关联 npm 包名 | `lockfile-js` | | 社区报告的可疑 npm 包名 | `nextfile-js` | | 负载/构建路径字符串 | `src/hooks/deps` | | 负载文件名 | `deps` | | 伪装/可疑文件名 | `monero-wallet-gui` | | 可疑的下载脚本名 | `temp.sh` | | 已报告的 SHA256 | `6144d433f8a0316869877b5f834c801251bbb936e5f1577c5680878c7443c98b` | | 已报告的 SHA256 | `7883bda1ff15425f2dbe622c45a3ae105ddfa6175009bbf0b0cad9bf5c79b316` | | 社区报告的 SHA256 | `47893d9badc38c54b71321263ce8178c1abb10396e0aadf9793e61ec8829e204` | | 已报告的 32 字符哈希字符串 | `42b59fdbe1b72895b2951412222ebf40` | | 已报告的 ELF 负载大小 | `3,040,376` 字节 | | 已报告的 Tor/onion 主机片段 | `olrh4mibs62l6kkuvvjyc5lrercqg5tz543r4lsw3o6mh5qb7g7sneid.onion` | | 已报告的 HTTP 路径/方法 | `POST /api/agent` | | 已报告的 HTTP 路径/方法 | `POST /upload` | | 已报告的固定 BPF map | `/sys/fs/bpf/hidden_pids` | | 已报告的固定 BPF map | `/sys/fs/bpf/hidden_names` | | 已报告的固定 BPF map | `/sys/fs/bpf/hidden_inodes` | | 检查的持久化行为 | 最近具有 `Restart=always` / `RestartSec=30` 的 systemd 服务 | 这些 IoC 用于本地文本、元数据、进程、持久化、BPF map、文件名、大小和哈希检查。请将匹配项视为分诊线索:审查上下文,必要时保留证据,不要假设脚本能证明完整的入侵范围。 ## 检查内容 ### 1. Pacman / AUR 暴露情况 - 使用 `pacman -Qqm` 列出当前的第三方软件包。 - 在提供受影响包列表时,将当前的第三方包名与该列表进行比对。 - 作为后备方案,对所有已安装的包名进行比较,以捕获可能已移动到第三方仓库中的包。 - 检查 `atomic-lockfile`、`js-digest`、`lockfile-js` 和 `nextfile-js` 是否作为 pacman 软件包被安装。 ### 2. Pacman 历史记录 - 读取 `/var/log/pacman.log` 以及可用的滚动压缩日志。 - 查找攻击活动字符串,如 `atomic-lockfile`、`js-digest`、`src/hooks/deps`、已知哈希、BPF map 名称以及来自公开研究的 C2/上传字符串。 - 标记 `pacman -U` 历史记录,因为许多 AUR 助手会构建软件包并通过 pacman 安装生成的软件包文件。 - 在可用时,将历史安装/升级的包名与受影响包列表进行比较。 ### 3. AUR 助手和构建缓存 搜索常见的用户级缓存位置,包括在 `sudo` 下运行时: - `~/.cache/yay` - `~/.cache/paru` - `~/.cache/pikaur` - `~/.cache/trizen` - `~/.cache/aura` - `~/.cache/pacaur` - `~/.cache/makepkg` 它会在缓存的 PKGBUILD、安装脚本和相关文件中查找攻击活动指标,而不会执行它们。 ### 4. npm 和 Bun 产物 - 如果安装了 `npm`,则检查全局 npm 包。 - 如果安装了 `bun`,则检查全局 Bun 包。 - 在用户主目录和 `/tmp` 中搜索 `node_modules/atomic-lockfile`、`node_modules/js-digest`、`node_modules/lockfile-js`、`node_modules/nextfile-js`,以及 lockfile/包元数据引用。 ### 5. Systemd 持久化 据报道,被分析的恶意软件在条件允许时会创建持久化的 systemd 单元。该脚本会检查系统和用户单元目录中的攻击活动字符串,并标记具有持久化重启行为(如 `Restart=always` / `RestartSec=30`)的近期服务。 ### 6. eBPF rootkit 指标 公开分析报告了固定的 BPF map 名称: - `/sys/fs/bpf/hidden_pids` - `/sys/fs/bpf/hidden_names` - `/sys/fs/bpf/hidden_inodes` 脚本会直接检查这些名称。如果安装了 `bpftool`,它还会扫描 `bpftool map list` 的输出。 ### 7. 进程和套接字指标 - 扫描可见的进程命令行和可执行文件名称,查找攻击活动的 IoC。 - 在可用时扫描 `ss` 输出,查找明显的攻击活动字符串。 Rootkit 可以隐藏进程和套接字产物,因此这很有用,但并不是决定性的。 ### 8. 负载文件和哈希候选对象 默认情况下,脚本会查找可疑的文件名和大小,包括: - `deps` - `monero-wallet-gui` - 包含 `atomic-lockfile`、`js-digest`、`lockfile-js` 或 `nextfile-js` 的路径 - 匹配已报告的 3,040,376 字节 ELF 负载大小的文件 使用 `--deep-hash` 时,它还会对常见根目录(如 `/home`、`/var/lib`、`/opt`、`/usr/local`、`/tmp` 和 `/etc/systemd`)下最近修改的小型文件进行哈希计算。 脚本中包含的已知 SHA256 指标: - `6144d433f8a0316869877b5f834c801251bbb936e5f1577c5680878c7443c98b` - `7883bda1ff15425f2dbe622c45a3ae105ddfa6175009bbf0b0cad9bf5c79b316` - `47893d9badc38c54b71321263ce8178c1abb10396e0aadf9793e61ec8829e204` ### 9. 扩展的通用入侵检查 (`--extended`) 这些检查默认**关闭**,因为它们的范围比特定的 AUR 攻击活动更广,并且可能会产生误报。当您希望获得超出特定攻击活动 IoC 的更多结果时,它们可用作保守的初步审查。在可能的情况下,敏感文件的具体内容会被隐藏。 `--extended` 目前会检查: - 非空的 `/etc/ld.so.preload`; - 从 `/tmp`、`/var/tmp`、`/dev/shm` 运行的可见进程,或可疑的已删除可执行文件; - Bash、Zsh 和 Fish 配置中的通用 shell 启动注入模式,例如 `curl | ...`、`wget | ...`、`eval $(...)`、base64 解码管道和 `LD_PRELOAD=`; - 全局 npm/Bun/pnpm 包 `preinstall`、`install` 和 `postinstall` 脚本中存在风险的生命周期 hook 模式; - 持久化相关文件(如 systemd 单元、桌面自启动项、pacman hooks 和 Hyprland 的 `autostart.lua`)中存在风险的命令模式; - 使用强制 `command=` 选项的 SSH `authorized_keys` 条目。 请将 `--extended` 的发现视为分诊线索,而不是此 AUR 活动的自动证明。 ## 选项 ``` Usage: aur-sentinel.sh [options] Options: --fetch-list Download public affected-package lists as data and compare against pacman. No downloaded script/code is executed. --affected-list FILE Use a local newline-separated affected package list. You can combine this with --fetch-list. --deep-hash Hash more recently modified small files under /home, /var/lib, /opt, /usr/local, /tmp, and /etc/systemd. Slower but may catch renamed payloads. --extended Run opt-in generic Linux compromise checks. These are broader and noisier than campaign-specific IoCs: ld.so.preload, volatile executable paths, shell config injection patterns, npm/Bun lifecycle hooks, suspicious persistence snippets, and SSH authorized_keys forced-command entries. --since YYYY-MM-DD Date used for recent service/deep-hash checks. Default: 2026-06-10. -h, --help Show help. ``` ## 退出代码 | 退出代码 | 含义 | | --- | --- | | `0` | 启用的检查未发现证据。 | | `1` | 警告或检查未完成;无法完全排除暴露的可能性。 | | `2` | 发现了强 IoC 或受影响包的证据。 | ## 解释结果 ### `[OK]` 该特定检查未发现证据。 ### `[WARN]` 某些内容需要审查,或者检查未能完成。示例: - 历史记录中出现了受影响的包名,但来源不明; - 包列表下载失败; - 存在 `pacman -U` 历史记录,应予以审查; - 存在可疑的候选文件名,但与已知哈希不匹配; - `--extended` 启发式检测发现了通用的持久化、shell 配置、npm hook、易失性可执行文件或 SSH 强制命令模式。 ### `[BAD]` 在证明并非如此之前,请将其视为有意义的证据。示例: - 当前已安装受影响的 AUR 包; - 已知恶意负载哈希匹配; - systemd 持久化配置中存在攻击活动 IoC; - 可疑的固定 BPF map 名称。 ## 如果发现指标 1. 将主机与不受信任的网络断开连接。 2. 如果事件响应或取证很重要,请保留证据。 3. 在已知干净的设备上轮换凭据,尤其是 SSH、GitHub、npm、Vault、Docker/Podman、浏览器/会话、聊天和 VPN 凭据。 4. 考虑从干净的安装介质重新安装系统。公开分析描述了当负载以足够权限运行时的可选 eBPF rootkit 行为,因此就地清理可能不可信。 ## 研究背景 该工具基于截至 2026 年 6 月 15 日审查的公开报告和分析: - **BleepingComputer** 报道称,数百个 AUR 包被入侵以分发 rootkit/信息窃取程序,并总结了受影响的凭据目标和修复建议: - **ioctl.fail** 发布了 `deps` ELF 负载的静态分析,包括持久化行为、目标凭据存储、C2/上传指标、eBPF map 名称和哈希值: - **Sonatype** 报道了相关的 AUR/npm 分发路径,其中恶意的 PKGBUILD 更改调用了 npm 来安装 `atomic-lockfile`: - **Arch Linux aur-general 邮件列表主题** 协调了有关恶意 AUR 提交的报告和维护者响应: - **lenucksi/aur-malware-check** 汇总了社区检测脚本和补充的包名/npm/哈希指标。除非上文已独立涵盖,否则从该来源采用的指标均被视为社区报告: 在早期响应期间,软件包名称列表一直在变化。因此,此脚本将包列表视为外部数据,并支持 `--fetch-list` 和手动审查的 `--affected-list FILE` 工作流程。 ## 局限性 - 带有 rootkit 的实时系统可能会对实时响应工具撒谎。 - 受影响的包列表可能不完整、过时或不可用。 - 重命名、修改或第二阶段的负载可能与当前指标不匹配。 - `bpftool` 是可选的;如果没有它,BPF 检查将仅限于可见的固定 map 名称。 - `--extended` 的发现结果可能会包含干扰项,并可能识别出合法的管理员自定义配置。 - 此工具不能清除恶意软件,也不能轮换凭据。 ## 开发 / 审查 基本语法检查: ``` bash -n aur-sentinel.sh ``` 无网络的本地试运行: ``` bash aur-sentinel.sh ``` 高覆盖率本地运行: ``` sudo bash aur-sentinel.sh --fetch-list --deep-hash ``` 扩展启发式运行: ``` sudo bash aur-sentinel.sh --fetch-list --deep-hash --extended ``` 贡献应保持脚本的可审计性,避免执行远程内容,并避免收集或打印机密信息。 ## 许可证 MIT 许可证。请参见 [LICENSE](LICENSE)。
标签:Bash, Docker镜像, 信息窃取, 库, 应急响应, 应用安全, 文档安全, 暗色界面