@0xrootRE:你可以试试这个 https://github.com/cn0xroot/ArgusBPF…… 使用 eBPF 方案来监控系统主机的所有操作行为……
摘要
ArgusBPF 是一个基于 eBPF 的单二进制系统监控工具,能实时监控主机所有操作行为,并自动识别 Claude Code、Codex、Cursor 等 10 种主流 AI 编程代理 CLI 的活动,同时以专业模式和通俗语言两种方式呈现事件。
查看缓存全文
缓存时间: 2026/10/04 17:17
cn0xroot/ArgusBPF
来源:https://github.com/cn0xroot/ArgusBPF
ArgusBPF
看清楚你的操作系统——以及运行在它上面的每一个 AI 编码 agent——到底在做什么:通过 eBPF 实现,用大白话解释,而不是堆砌 syscall 术语。
名字取自希腊神话中的“百眼巨人“Argus(阿尔戈斯):这个工具所做的正是如此——直接挂接到内核(eBPF),同时还能识别出它所监视的活动是否专门属于某个 AI agent CLI。
ArgusBPF 是一个单一的 Go 二进制文件。在以 root 运行的 Linux/amd64 上,它通过 eBPF 直接挂接内核(CO-RE,运行时无需内核头文件);在其他情况下(其他操作系统、其他架构、非 root),它会自动回退到基于 gopsutil(https://github.com/shirou/gopsutil)构建的跨平台轮询采集器。
Web UI 支持在 专业模式(syscall 格式、内存地址、扇区号、原始字段)和 大白话模式(用日常语言和类比解释同样的事件)之间切换。这与 CC-Monitor(https://github.com/)等工具的理念相同——它们监视 AI 编码 agent 对你的机器做了什么——只是把这一思路应用到了操作系统本身,并扩展到可以识别具体是哪个 AI agent CLI 在操作。
截图
概览
概览
AI 活动
AI 活动
实时事件
实时事件
时间线
时间线
网络
网络
磁盘
磁盘
内存
内存
进程
进程
告警
告警
术语表
术语表
设计
- 单一内核侧调度器,而非逐进程 ptrace。 一个 CO-RE 程序(
bpf/monitor.c)挂接到raw_syscalls/sys_enter以及module_load/block_rq_issue跟踪点,覆盖全系统所有进程,避免了 ptrace 逐进程附加的开销,并且无需重新编译即可跨内核版本工作(运行时无需内核头文件)。 - 按进程身份识别 AI agent。 10 个主流 AI 编码 agent CLI 会与内置表进行匹配;被识别的事件带有
agent字段、在实时流中显示徽标,并拥有专属的时间线泳道,让你能看清某个 agent 到底动了什么。 - TLS/DNS/SQL 明文捕获。 采用 eCapture 式的 uprobe,对
SSL_read/SSL_write/getaddrinfo/exec_simple_query进行探测,在目标进程自身的内存中恢复明文(加密前/加密后),无需 MITM 代理或证书处理。 - 每个事件两种呈现。 每个事件都有真实的 syscall 格式专业渲染,以及单独生成的大白话解释和日常类比,由离线模板/查找引擎生成(不调用 LLM,完全确定性,完全离线也能工作)。
- 单一二进制,跨平台。 纯 Go 实现,任何地方都不使用 CGO(SQLite 亦然)。root + Linux/amd64 获得完整的 eBPF 管线;任何其他操作系统、架构或非 root 环境则回退到基于 gopsutil 的轮询器。
特性
- AI agent 识别 — 每个事件的进程都会与主流 AI 编码 agent CLI 对照表进行检查(Claude Code、Codex、Cursor、Gemini CLI、Grok CLI、Aider、OpenCode、ZCode、OpenClacky、Antigravity CLI——与 CC-Monitor 开发分支追踪的名单一致);匹配的事件带有
agent/agent_display字段、在实时流中显示 🤖 徽标,时间线页面还有专门的“按 AI agent“泳道,让你能看到某个 agent 具体动了什么,与机器上运行的其他一切分开呈现。 - 实时事件流 — 每次 exec、文件打开/写入/删除/重命名、网络连接/监听、mmap/mprotect/ptrace/跨进程内存访问、内核模块加载以及块设备 IO,均通过 WebSocket 推送。
- 风险规则 — 一个小型 JSON 规则集(可编辑、可被用户覆盖),标记读取
/etc/shadow、W+X 内存页、ptraceattach、跨进程内存写入、内核模块加载、SSH 活动等行为,分为 info/low/medium/high 四级。 - 大白话解释 — 每个事件都同时拥有技术单行描述(
mprotect(addr=0x7f.., prot=RWX))和通俗易懂的英文解释与日常类比,由离线模板/查找引擎生成(不调用 LLM,完全确定性)。 - eCapture 式应用探针 — 对
getaddrinfo(DNS)、OpenSSLSSL_read/SSL_write(TLS 明文)和 Postgresexec_simple_query(SQL 文本)进行尽力而为的 uprobe 探测,当目标库/二进制存在时自动挂接;如果不存在,每项都会优雅降级(并在/api/info中说明)。 - 完整的 Web 仪表盘 — 概览页含实时 CPU/内存/磁盘/网络图表、实时事件表格、泳道时间线(按类别、按进程或按 AI agent)、网络连接、磁盘 IO(含扇区级散点图)、逐进程内存映射(
/proc//maps可视化并逐区域解释)、进程树、告警视图以及术语表——风格类似 Grafana(深色面板网格、图例、时间范围选择器),但完全自包含,无需安装 Grafana。 - 跨平台设计 — 纯 Go,无 CGO(SQLite 通过
modernc.org/sqlite)。可为 darwin/windows/linux 的 amd64/arm64 构建;只有 eBPF 采集器是 linux/amd64 专属,其余功能处处可运行。 - 可选的 PTY Web 终端(
--enable-terminal,默认关闭)— 在仪表盘中直接打开一个真正的终端,在其中运行任何东西(AI agent CLI、shell),支持多个并发会话和网格视图同时观察多个终端。这与本工具其余的只读性质是真正不同的信任模型——它可以启动并驱动真实进程——这也是它需要显式 flag 开启、而非仅由仪表盘 UI 控制的原因。如果你开启它,请同时设置--token,并保持--listen绑定在 localhost(默认)或你自己的反向代理上——任何能访问该端口的人都可以打开一个 shell。 - 面向 AI 客户端的 MCP 服务器(
--mcp)— 运行argusbpf --mcp作为 Model Context Protocol(https://modelcontextprotocol.io/)的 stdio 服务器,让 AI 助手(Claude Code、Claude Desktop、任何 MCP 客户端)可以直接查询这台机器:hardware_info(CPU/内存/磁盘/主机)、busybox_applets(BusyBox 实际提供了什么,在/bin大多是同一个 BusyBox 二进制的嵌入式/车载镜像中尤其有用)、recent_events和event_stats(与仪表盘展示的捕获活动相同,可按类别/风险/agent/时间窗口过滤)。它以只读方式读取仪表盘自身的 SQLite 数据库,因此无需 root、无需开放端口、也无需--token——参见下文使用 MCP 服务器。
支持的 AI agent CLI
识别依据是进程 comm/exe 身份(见 internal/agents),与 CC-Monitor 开发分支追踪的名单一致。可在 API/UI 中通过 ?agent= 过滤上述任意一个,也可以在时间线的“按 AI agent“泳道中查看。
| Agent | id | 识别方式(comm / exe) |
|---|---|---|
| Claude Code | claude-code | claude |
| Codex CLI | codex | codex、codex-x86_64-*、codex-aarch64-* |
| Cursor | cursor | cursor-agent |
| Gemini CLI | gemini-cli | gemini |
| Grok CLI | grok-cli | grok |
| Aider | aider | aider |
| OpenCode | opencode | opencode |
| ZCode | zcode | zcode、zcode-cli |
| OpenClacky | openclacky | openclacky、clacky |
| Antigravity CLI | antigravity-cli | agy、antigravity-cli |
新增 agent 只需在 internal/agents/agents.go 中加一行——欢迎为缺失的项目提交 PR。
快速开始
# 构建(无需 clang/bpftool——eBPF 对象已预编译并随仓库提供)
make build
# 以 root 运行以启用 eBPF 采集器;非 root 会自动回退到轮询模式
sudo ./argusbpf
# 打开仪表盘
open http://127.0.0.1:1024
常用参数:
| 参数 | 默认值 | 含义 |
|---|---|---|
--listen | 127.0.0.1:1024 | HTTP 监听地址——默认仅限 localhost;传入非回环地址(0.0.0.0:1024、局域网 IP、:1024)会将其暴露到网络,并在启动时记录警告 |
--token | (无) | 要求请求携带 X-Token 头 / ?token= 查询参数 |
--db | ~/.argusbpf/events.db | SQLite 数据库路径 |
--rules | ~/.argusbpf/rules.json | 覆盖内置风险规则集 |
--enable-terminal | false | 启用 PTY Web 终端(见上文“特性“——若开启,请同时设置 --token) |
--mcp | false | 以 MCP stdio 服务器模式运行,而非 Web 仪表盘(参见使用 MCP 服务器) |
使用 MCP 服务器
argusbpf --mcp 作为独立的 MCP(https://modelcontextprotocol.io/)stdio 服务器运行,取代仪表盘——它读取仪表盘所写入的同一个 SQLite 数据库(若使用非默认路径则为 --db),并暴露四个工具:hardware_info、busybox_applets、recent_events、event_stats。它不需要 root、不开放网络端口、也不需要 --token——客户端会按协议标准的 stdio 传输方式将其作为短生命周期子进程启动。
对于 Claude Code,可以这样添加:
claude mcp add argusbpf -- /usr/local/bin/argusbpf --mcp
或者直接配置(Claude Code 的 .mcp.json、Claude Desktop 的 claude_desktop_config.json,或任何其他 MCP 客户端):
{
"mcpServers": {
"argusbpf": {
"command": "/usr/local/bin/argusbpf",
"args": ["--mcp"]
}
}
}
如果仪表盘使用了非默认的 --db 路径,请在此传入相同的路径("args": ["--mcp", "--db", "/path/to/events.db"]),以便 MCP 服务器读取正确的文件。hardware_info/busybox_applets 不需要仪表盘正在运行(它们直接读取运行中的机器);recent_events/event_stats 则需要数据库已经存在,也就是说仪表盘至少需要运行过一次。
从源码构建 eBPF 程序
仓库中已提交预编译的 internal/collector/monitor_x86_bpfel.o,因此 make build 从不需要 clang。如果你修改了 bpf/monitor.c:
make vmlinux # 将当前内核的 BTF 导出到 bpf/vmlinux.h(需要 bpftool)
make bpf # 重新编译 monitor.c -> .o/.go 文件对(需要 clang、llvm-strip)
make build
架构
完整设计参见 DESIGN.md:事件模型、采集管线、风险规则、大白话/专业解释引擎,以及 web/ 所使用的 HTTP/WebSocket API 契约。
发布历史参见 CHANGELOG.md。
collector (eBPF | poller) -> pipeline (rules + explain + 1s aggregation) -> SQLite + WebSocket hub -> web UI
平台支持
| 操作系统 / 架构 | 采集器 | 说明 |
|---|---|---|
| Linux/amd64,root | eBPF(CO-RE) | 完整细节:syscall 参数、内存地址、扇区号 |
| Linux/amd64,非 root | 轮询 | 自动回退 |
| Linux/arm64 | 轮询 | eBPF syscall 编号表目前仅针对 amd64 |
| macOS、Windows | 轮询 | 通过 gopsutil 进行进程/网络差分 |
已知局限
- 尚未实现 MySQL 的
dispatch_commandSQL 捕获——其参数布局随版本变化过大,无法安全发布;Postgres(exec_simple_query,稳定的单个char*签名)已支持。 - 尚无
bash readline命令审计 uprobe。 - 入站连接(
accept)未被 eBPF 路径单独捕获;磁盘页面的“IO 最高的文件“目前还没有数据来源(仅有逐进程 IO 和扇区散点图)。 - 发行版打包的 Postgres 二进制通常经过 LTO 构建并去除了符号,因此
exec_simple_query无法按名称挂接;install.sh的 uprobe 逻辑会在已安装匹配的-dbgsym调试包时回退到解析其地址,而在没有调试包的情况下该能力就完全不可用了。
ferstar (@ferstar_org): 天天在终端里跑 Claude Code、Cursor、Codex,大家心里其实都有个犯嘀咕的事:
Agent 本质上就是你机子上的一个普通子进程。你的终端有什么权限它就有什么权限。读写当前代码正常,但如果它随手读一下 ~/.ssh/id_rsa、扫一眼 ~/.aws/credentials,或者翻翻隔壁商业项目,操作系统根本不会有任何拦截。
相似文章
@GitHub_Daily: 用 Claude Code 和 Codex 同时开好几个任务,在终端里切来切去查看,效率实在低。 最近找到 Orca,用来统一管理多个 AI 编程智能体,让它们并行干活,结果集中在一个界面里查看。 核心是支持并行工作区,把一个需求同时发给…
Orca 是一个统一的 AI 编程智能体管理工具,支持并行工作区,可同时向 Claude Code、Codex 等 AI 助手发送任务,各在独立 git 分支中生成代码并对比结果,并配有手机 App 实时跟进。
Epherem
Epherem 是一款免费的源代码安全扫描工具,专为 AI 构建的应用设计,可检测认证、数据库访问、API 密钥泄露和依赖漏洞等问题,并支持导出报告给 Claude Code、Cursor 等 AI 编码助手。
@xiangxiang103: 卧槽,Anthropic 这次真的翻大车了。 有人在 Claude Code 的二进制里挖出了隐藏代码——专门检测你是不是中国用户、或者代理走了中国。不是普通遥测,是故意混淆、发行说明不写、用户完全不知情的那种。 过程很骚: - 检测到你…
有人在 Claude Code 的二进制中发现隐藏代码,专门检测中国用户或代理,并偷偷修改 system prompt 添加水印,引发对开发者工具信任的广泛质疑。
@howlemont: 这篇 arXiv 的《Dive into Claude Code》,感觉最有用的地方是讲清楚了,其实Claude Code这种系统一旦进入真实环境,工程重点立刻就变的很现实。 Claude Code当然是个 coding agent,会跑…
该文章分析了arXiv上《Dive into Claude Code》论文,讨论了Claude Code这类编码Agent系统在真实环境中的工程实现重点,包括shell执行、文件修改和外部服务调用等功能。
我构建了 Betrox AI:一个多工作代理的智能体系统,可将单条高层指令转化为完整的操作系统级执行。
Poorna Singh Baghel 介绍 Betrox AI:一个采用多工作单元架构的自主智能体系统,可将单条高层次自然语言指令拆解并交给专门的后台工作单元,同时操作桌面应用、浏览器、终端和本地文件,实现完整的操作系统级控制。