musqz/archcanary

GitHub: musqz/archcanary

一款面向 Arch Linux 的分层安全检测工具,扫描 AUR 恶意软件包并审计 systemd、eBPF、内核模块等多层系统持久化威胁。

Stars: 0 | Forks: 0

# archcanary [![发布](https://img.shields.io/github/v/release/musqz/archcanary?sort=semver)](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 GUI — main menu
Main menu — all checks passed
Archcanary scan output — RESULT: CLEAN
Full scan output — 1943 packages checked, RESULT: CLEAN
## 使用的项目 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** 下公开了其后端配置。 LLM Settings dialog | 字段 | 描述 | |-------|-------------| | 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