musqz/archcanary
GitHub: musqz/archcanary
一款面向 Arch Linux 的分层安全检测工具,扫描 AUR 恶意软件包并审计 systemd、eBPF、内核模块等多层系统持久化威胁。
Stars: 0 | Forks: 0
# archcanary
[](https://github.com/musqz/archcanary/releases)
## 什么是 archcanary?
archcanary 是一个专为 Arch Linux 设计的分层安全检测工具栈——用于扫描恶意的 AUR 软件包、systemd/eBPF 持久化、npm/bun 缓存投毒、内核模块篡改、库注入等。
它最初源自 [lenucksi/aur-malware-check](https://github.com/lenucksi/aur-malware-check),名为 **aur-malware-check**,最初专注于 2026 年 6 月的 AUR 供应链攻击。随着该工具的发展,它涵盖了更广泛的系统检查——集成了 GUI 前端、基于 LLM 的安装前扫描、自动化的 systemd 定时器以及多层检测——其范围已经超出了原有的名称。因此它被重命名为 **archcanary**,以反映它现在的样子:一个用于完整 Arch 系统安全检测的多功能工具。
为了适配新需求,本工具对原项目进行了大量的修改,因此这实际上是一个与 lenucksi/aur-malware-check 同宗的新工具,而不是简单地在原有基础上打补丁。
## 截图
## 使用的项目
archcanary 集成并构建于以下项目之上:
| 项目 | 作用 |
|---------|------|
| [lenucksi/aur-malware-check](https://github.com/lenucksi/aur-malware-check) | 起源 —— archcanary 起源的 aur-malware-check 脚本 |
| [musqz/aurscan](https://github.com/musqz/aurscan) | LLM PKGBUILD 扫描器 —— Claude 在 `yay` 构建之前读取每个 PKGBUILD;[manticore-projects/aurscan](https://github.com/manticore-projects/aurscan) 的 fork 版本,经过调整可读取 `~/.config/aurscan/env` 以实现与 archcanary GUI 的集成 |
| [claude-code](https://claude.ai/download) | `claude` CLI —— aurscan 用于分析 PKGBUILD 的 LLM 后端 (`curl -fsSL https://claude.ai/install.sh | bash`) |
| [traur](https://aur.archlinux.org/packages/traur) | 安装前启发式扫描器 —— 涵盖 5 个加权类别的 279 个信号 |
| [yay](https://github.com/Jguer/yay) 13.0 | 支持 Lua 钩子的 AUR 助手 (`~/.config/yay/init.lua`) —— 升级时间警告、离线模式检查、安装日志 |
| [yad](https://github.com/v1cont/yad) | `archcanary-gui` 使用的 GTK 对话框工具包 |
| [bpftool](https://github.com/libbpf/bpftool) (软件包: `bpf`) | 枚举所有已加载的 eBPF 程序以进行 rootkit 检测 |
| [libnotify](https://gitlab.gnome.org/GNOME/libnotify) | `notify-send` —— 扫描到感染结果时在桌面弹出紧急警报 |
| [polkit](https://gitlab.freedesktop.org/polkit/polkit) / pkexec | 用于需要 root 权限检查的 GUI 提权 |
### 检测层
```
User runs `aurscan ` before installing
├── static rules (offline) — known campaign signatures
├── Claude LLM reads PKGBUILD — novel/obfuscated patterns
└── on CLEAN → user runs `yay -S pkg` / `yay -Syu`
└── yay init.lua hooks
├── UpgradeSelect — warn if PKGBUILD modified < 3 days ago
├── AURPreInstall — offline pattern check
└── PostInstall — logs AUR installs
systemd system timer (weekly + on boot + after each pacman tx)
└── archcanary --full --all-time
├── known-bad package list (1900+ JS campaign + 83 Russian spam)
├── pacman.log history (compressed log support)
├── systemd persistence (services, drop-ins, timers)
├── eBPF rootkit traces + bpftool program enumeration
├── npm/bun/yarn/pnpm cache scan
├── PKGBUILD obfuscation patterns
├── ld.so.preload injection
├── XDG autostart + shell RC persistence
└── kernel module / DKMS audit
└── writes /var/lib/archcanary/last-scan.log
systemd user path unit
└── watches last-scan.log → notify-send critical alert on INFECTED
archcanary-gui (on-demand)
└── yad grouped menu, per-session status, polkit for root checks
```
## 快速开始
```
# 检查是否安装了任何受损的包
archcanary
# 完整扫描 — 所有检查(部分需要 root)
sudo archcanary --full --all-time
# 检查设置健康状况
archcanary --doctor
# 从实时 HedgeDoc 刷新包列表,然后进行扫描
archcanary --refresh --full --all-time
# GUI 前端(需要 yad)
archcanary-gui
# 在终端中进行完整扫描 — 无 GUI,输出结构化摘要
archcanary-gui --no-gui
```
每次扫描都会在得出最终结论前打印各项检查的摘要:
```
Check summary
───────────────────────────────────────────────────────
Package list (1943 pkgs) ✅ clean
pacman.log history ✅ clean
Systemd persistence ✅ clean
eBPF rootkit traces ✅ clean
npm cache ✅ clean
bun cache ✅ clean
yarn cache ✅ clean
pnpm cache ✅ clean
PKGBUILD obfuscation scan ✅ clean
eBPF programs (bpftool) ⚠ skipped (needs root)
ld.so.preload injection ✅ clean
XDG autostart + shell RCs ✅ clean
Kernel modules (DKMS) ⚠ skipped (needs root)
───────────────────────────────────────────────────────
============================================================
RESULT: CLEAN - No indicators found.
============================================================
```
## 检查项
| 标志 | 功能描述 | 需要 Root? |
|------|-------------|-------|
| *(默认)* | 将软件包列表与已安装的 AUR 软件包进行匹配 | 否 |
| `--check-systemd` | Systemd 持久化:未知服务、drop-ins、Restart= 定时器 | 否 |
| `--check-ebpf` | eBPF rootkit 痕迹 (`/sys/fs/bpf/hidden_*`) | 否 |
| `--check-npm-cache` | 检查 npm 缓存中的恶意软件包名称 | 否 |
| `--check-bun-cache` | 检查 bun 缓存中的恶意软件包名称 | 否 |
| `--check-yarn-cache` | yarn 缓存扫描 | 否 |
| `--check-pnpm-cache` | pnpm 缓存 + fnm 特定版本的 Node 安装 | 否 |
| `--check-pkgbuild` | AUR 助手缓存 —— 混淆模式 (base64, eval, var-split, printf hex) | 否 |
| `--check-bpftool` | 通过 `bpftool` 枚举所有已加载的 eBPF 程序;标记隐蔽的钩子类型 | 是 |
| `--check-ldso` | `/etc/ld.so.preload` 注入 + 最近的 `/etc/ld.so.conf.d/` 更改 | 否 |
| `--check-autostart` | `~/.config/autostart`、用户 systemd 服务、shell RC 下载并执行模式 | 否 |
| `--check-kmod` | 不属于 pacman 的内核模块;未被追踪的 DKMS 构建 | 是 |
| `--full` | 以上所有项 | 部分 |
| `--all-time` | 跳过 6 月 9-12 日的安装日期窗口 —— 扫描所有历史记录 | — |
| `--refresh` | 从 Arch Linux HedgeDoc 获取实时软件包列表 | — |
| `--doctor` | 健康检查:二进制依赖、systemd 单元、安装路径 | — |
### 退出码
| 代码 | 含义 |
|------|---------|
| 0 | 干净 —— 未发现指标 |
| 1 | 警告(日志扫描问题、文件缺失) |
| 2 | 检测到受感染的软件包或产物 |
## 安装
```
# 用户安装 — 脚本、配置初始化、桌面入口
./install.sh
# 系统安装 — 添加 root 助手、polkit 策略、systemd 自动扫描
./install.sh --system
# 卸载
./install.sh uninstall --system
```
`--system` 会设置:
- Root 系统定时器:每周 + 开机时 + 每次 pacman 事务处理之后
- 用户通知器:监控 `/var/lib/archcanary/last-scan.log`,在检测到 `INFECTED` 时触发桌面警报
- 用于 GUI 触发的 root 权限检查(eBPF, bpftool, kmod)的 pkexec root 助手
有关单元文件的详细信息,请参阅 [docs/systemd.md](docs/systemd.md);有关完整的个人技术栈和重新安装步骤,请参阅 [docs/my-setup.md](docs/my-setup.md)。
## LLM 设置 (aurscan)
[aurscan](https://github.com/musqz/aurscan) 会在 `yay` 构建 PKGBUILD 之前使用 LLM 对其进行扫描。GUI 在 **Utilities → LLM settings** 下公开了其后端配置。
| 字段 | 描述 |
|-------|-------------|
| Backend | `auto` —— 如果设置了 `ANTHROPIC_API_KEY` 则使用 Claude,否则仅使用静态规则
`claude` —— Claude API
`openai` —— 任何兼容 OpenAI 的端点 (Ollama, llama.cpp, vLLM) | | Endpoint URL | `openai` 后端的 URL,例如 `http://localhost:11434/v1` | | Fallback URL | 可选的次要端点 —— aurscan 会自动故障转移至此 | | Model | 发送到端点的模型名称 | | Timeout | 每个请求的预算时间(秒)—— 对于仅依赖 CPU 的本地慢速模型,请调高此值(默认为 180 秒) | 设置将保存到 `~/.config/aurscan/env`,并由 aurscan 在启动时加载。显式的环境变量始终优先于此文件中的配置。 对话框中的 **Model guide** 按钮会显示本地模型大小建议,以及关于 Ollama 的关键 `num_ctx` 警告(Ollama 默认为 2048,这会截断 PKGBUILD 而难以察觉 —— 请将其设置为 ≥ 8192)。 ## 检测到的攻击活动 ### JS 供应链攻击 (2026年6月9日至12日) 攻击者利用提交伪造来冒充 AUR 维护者,向 1600 多个软件包的 PKGBUILD 中注入了恶意的 `npm`/`bun` 安装钩子。有效载荷:信息窃取器和 eBPF rootkit。 **窃取内容:** Discord token、GitHub PAT、npm/Slack/Teams 会话、SSH 密钥、Vault token、Docker 凭据、浏览器 Cookie —— 通过 `temp.sh` 和 Tor C2 外传。 **持久化机制:** 使用 `Restart=always` 的 systemd 服务;eBPF rootkit 在以 root 权限和 CAP_BPF 运行时会隐藏进程、文件和 socket inode。 分为两波攻击: - **第一波 (npm)** —— `atomic-lockfile` / `lockfile-js`;涉及账号 `krisztinavarga`, `franziskaweber`, `tobiaswesterburg`, `ellenmyklebust`。注意:`arojas` 是通过 git 提交伪造被冒充的 —— 他是一位合法的 KDE 维护者([澄清声明](https://chaos.social/@dvzrv/116736017948300691))。 - **第二波 (bun)** —— `js-digest`;涉及账号 `custodiatovar`, `veramagalhaes`。 ### 俄罗斯垃圾信息活动 (2026年6月14日) 另一项独立的活动([由 Sid Karunaratne 报告](https://lists.archlinux.org/archives/list/aur-general@lists.archlinux.org/message/2YQSHTC27MOKDDKHZTH2BJGTEN2CYC7W/)),其中 83 个 AUR 软件包的 PKGBUILD 被修改,在安装时将俄语垃圾信息的 `echo` 语句注入到 `~/.bashrc`、`~/.zshrc` 和其他 shell 配置文件中。不涉及凭据窃取或持久化 —— 仅是恶作剧/宣传性质的有效载荷。已报告给 Arch DevOps;截至 2026-06-14,清理工作正在进行中。 archcanary 通过 `malicious_russian_spam_packages.txt` 检测这些内容(显示在扫描标题中,与 JS 攻击活动的计数并列)。 ## 如果受到感染该怎么办 1. **保护系统** —— 不要关机;使用受信任的介质进行取证获取 2. **轮换所有凭据** —— Discord, GitHub, npm, Slack, Teams, SSH 密钥, Vault token, 云密钥 3. **检查持久化机制** —— `systemctl list-units --type=service --state=running`;运行 `--check-systemd` 4. **检查 eBPF rootkit** —— `ls -la /sys/fs/bpf/hidden_*`;运行 `sudo archcanary --check-bpftool` 5. **检查库注入** —— `cat /etc/ld.so.preload`;运行 `archcanary --check-ldso` 6. **检查用户态持久化** —— 运行 `archcanary --check-autostart` 7. **检查恶意内核模块** —— 运行 `sudo archcanary --check-kmod` 8. **从受信任的介质进行清理** —— 从 Arch ISO 引导,挂载文件系统,移除恶意的 unit 9. **考虑重新安装** —— 一旦 rootkit 激活,系统将不可信 10. **报告** —— https://lists.archlinux.org/archives/list/aur-general@lists.archlinux.org/ ## 文档 - [docs/overview.md](docs/overview.md) —— 生命周期图、概览表 - [docs/systemd.md](docs/systemd.md) —— systemd 单元文件和自动化扫描设置 - [docs/my-setup.md](docs/my-setup.md) —— 完整的个人技术栈、组件连接、重新安装步骤 - [docs/false-positives.md](docs/false-positives.md) —— 已记录的良性信号及验证方法 - [SOURCES.md](SOURCES.md) —— 完整的编号来源参考 ## 许可证 社区工具 —— 无任何担保。使用风险自负。
![]() Main menu — all checks passed |
![]() Full scan output — 1943 packages checked, RESULT: CLEAN |
| 字段 | 描述 |
|-------|-------------|
| Backend | `auto` —— 如果设置了 `ANTHROPIC_API_KEY` 则使用 Claude,否则仅使用静态规则`claude` —— Claude API
`openai` —— 任何兼容 OpenAI 的端点 (Ollama, llama.cpp, vLLM) | | Endpoint URL | `openai` 后端的 URL,例如 `http://localhost:11434/v1` | | Fallback URL | 可选的次要端点 —— aurscan 会自动故障转移至此 | | Model | 发送到端点的模型名称 | | Timeout | 每个请求的预算时间(秒)—— 对于仅依赖 CPU 的本地慢速模型,请调高此值(默认为 180 秒) | 设置将保存到 `~/.config/aurscan/env`,并由 aurscan 在启动时加载。显式的环境变量始终优先于此文件中的配置。 对话框中的 **Model guide** 按钮会显示本地模型大小建议,以及关于 Ollama 的关键 `num_ctx` 警告(Ollama 默认为 2048,这会截断 PKGBUILD 而难以察觉 —— 请将其设置为 ≥ 8192)。 ## 检测到的攻击活动 ### JS 供应链攻击 (2026年6月9日至12日) 攻击者利用提交伪造来冒充 AUR 维护者,向 1600 多个软件包的 PKGBUILD 中注入了恶意的 `npm`/`bun` 安装钩子。有效载荷:信息窃取器和 eBPF rootkit。 **窃取内容:** Discord token、GitHub PAT、npm/Slack/Teams 会话、SSH 密钥、Vault token、Docker 凭据、浏览器 Cookie —— 通过 `temp.sh` 和 Tor C2 外传。 **持久化机制:** 使用 `Restart=always` 的 systemd 服务;eBPF rootkit 在以 root 权限和 CAP_BPF 运行时会隐藏进程、文件和 socket inode。 分为两波攻击: - **第一波 (npm)** —— `atomic-lockfile` / `lockfile-js`;涉及账号 `krisztinavarga`, `franziskaweber`, `tobiaswesterburg`, `ellenmyklebust`。注意:`arojas` 是通过 git 提交伪造被冒充的 —— 他是一位合法的 KDE 维护者([澄清声明](https://chaos.social/@dvzrv/116736017948300691))。 - **第二波 (bun)** —— `js-digest`;涉及账号 `custodiatovar`, `veramagalhaes`。 ### 俄罗斯垃圾信息活动 (2026年6月14日) 另一项独立的活动([由 Sid Karunaratne 报告](https://lists.archlinux.org/archives/list/aur-general@lists.archlinux.org/message/2YQSHTC27MOKDDKHZTH2BJGTEN2CYC7W/)),其中 83 个 AUR 软件包的 PKGBUILD 被修改,在安装时将俄语垃圾信息的 `echo` 语句注入到 `~/.bashrc`、`~/.zshrc` 和其他 shell 配置文件中。不涉及凭据窃取或持久化 —— 仅是恶作剧/宣传性质的有效载荷。已报告给 Arch DevOps;截至 2026-06-14,清理工作正在进行中。 archcanary 通过 `malicious_russian_spam_packages.txt` 检测这些内容(显示在扫描标题中,与 JS 攻击活动的计数并列)。 ## 如果受到感染该怎么办 1. **保护系统** —— 不要关机;使用受信任的介质进行取证获取 2. **轮换所有凭据** —— Discord, GitHub, npm, Slack, Teams, SSH 密钥, Vault token, 云密钥 3. **检查持久化机制** —— `systemctl list-units --type=service --state=running`;运行 `--check-systemd` 4. **检查 eBPF rootkit** —— `ls -la /sys/fs/bpf/hidden_*`;运行 `sudo archcanary --check-bpftool` 5. **检查库注入** —— `cat /etc/ld.so.preload`;运行 `archcanary --check-ldso` 6. **检查用户态持久化** —— 运行 `archcanary --check-autostart` 7. **检查恶意内核模块** —— 运行 `sudo archcanary --check-kmod` 8. **从受信任的介质进行清理** —— 从 Arch ISO 引导,挂载文件系统,移除恶意的 unit 9. **考虑重新安装** —— 一旦 rootkit 激活,系统将不可信 10. **报告** —— https://lists.archlinux.org/archives/list/aur-general@lists.archlinux.org/ ## 文档 - [docs/overview.md](docs/overview.md) —— 生命周期图、概览表 - [docs/systemd.md](docs/systemd.md) —— systemd 单元文件和自动化扫描设置 - [docs/my-setup.md](docs/my-setup.md) —— 完整的个人技术栈、组件连接、重新安装步骤 - [docs/false-positives.md](docs/false-positives.md) —— 已记录的良性信号及验证方法 - [SOURCES.md](SOURCES.md) —— 完整的编号来源参考 ## 许可证 社区工具 —— 无任何担保。使用风险自负。
标签:Cutter, Docker镜像, rizin

