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镜像, 信息窃取, 库, 应急响应, 应用安全, 文档安全, 暗色界面