bitdeep/agent-safe-guard

GitHub: bitdeep/agent-safe-guard

一个以 C++ 原生守护进程形式运行的 AI 代理安全中间层,在 Claude Code 与操作系统之间实施默认拒绝的工具调用拦截,防止破坏性命令执行、敏感信息泄露,并提供完整审计追踪。

Stars: 1 | Forks: 0

# agent-safe-guard [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8517b8a2e5220253.svg)](https://github.com/regen-dev/agent-safe-guard/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) Linux 上 [Claude Code](https://docs.anthropic.com/en/docs/claude-code) 的原生安全钩子。 `agent-safe-guard` 位于 Claude Code 及其工具调用之间。它能拦截破坏性命令、精简冗余输出、保护大型文件读取、强制执行子代理预算、记录审计事件,并提供原生的规则/包控制台。 ## 为什么需要它 AI 编码代理会代表你执行 shell 命令、读取文件并做出权限决策。如果没有防护措施,一次产生幻觉的 `rm -rf /` 或泄露的 `.env` 读取都可能造成真正的破坏。`agent-safe-guard` 增加了一个默认拒绝(fail-closed)的执行层,会在每次工具调用触达你的系统之前运行。 ## 当前版本 - 优先支持 Linux,仅原生运行时(C++20 守护进程 + 钩子客户端) - 目前支持源码安装 - 计划支持 `.deb` 和 AppImage - Windows 和 macOS 的支持正在路线图中,排在传输层抽象之后 ## 功能特性 - 拦截破坏性的 shell 模式(`rm -rf /`、fork 炸弹、`curl | bash`、强制推送到受保护分支) - 对于可能会淹没上下文的命令,要求使用静默标志 - 拒绝对捆绑、生成、二进制或超大文件目标的 `Read` 操作 - 将大型 `Read` 输出压缩为结构化摘要 - 自动决策安全与不安全的权限请求 - 在读取文件时掩盖密码和凭证 - **在 SessionStart 注入基于排序的 tree-sitter 仓库映射,让 Claude 停止在每次会话中重复读取文件**(新增 — 见下方 [Repo Map](#repo-map-primer)) - 跟踪会话指标、规则匹配、工具延迟、压缩和子代理使用情况 - 支持从远程目录(应用市场)安装扩展包 - 允许你使用 `asg-cli` 在包和规则级别检查并覆盖策略 ## 截图 ### 规则 浏览包及其规则。可单独开启/关闭规则。 ![Rules view](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/a94c53c68c220255.png) ### 规则详情 检查规则元数据、匹配统计和覆盖状态。 ![Rule detail](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/bf0af76c30220257.png) ### 目录 从远程目录同步扩展包并进行安装。 ![Catalog view](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/185db0deb6220258.png) ### 包详情 查看已安装包的信息、版本、标签及包含的规则。 ![Package detail](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/ead897c732220300.png) ### 设置 开启/关闭防御功能并查看各项控制内容。包含 **Repo Map Primer**(tree-sitter SessionStart 上下文 — 见 [Repo Map](#repo-map-primer))。 ![Settings view](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c910ab00b0220301.png) ## 快速开始 环境要求: - Linux (x86_64) - `jq` - `coreutils` - `cmake` 3.20+ - C++20 编译器 (`g++` 10+ 或 `clang++` 13+) 从源码安装: ``` git clone https://github.com/regen-dev/agent-safe-guard.git cd agent-safe-guard git submodule update --init --recursive # required — tree-sitter grammars + doctest + bats cmake -S . -B build/native -DSG_BUILD_NATIVE=ON cmake --build build/native -j$(nproc) ./build/native/native/asg-install ``` 注意事项: - 安装程序会在 `~/.claude/hooks/asg-*` 中创建原生钩子符号链接。 - 它会将 `asg-cli`、`asg-statusline`、`asg-repomap`、`asg-install` 和 `asg-uninstall` 安装到 `~/.local/bin`。 - 它会尝试为 `sgd` 安装并启用用户的 `systemd` socket 单元。 - `~/.local/bin` 应包含在你的 `PATH` 中。 - 安装后启动一个新的 Claude Code 会话。 如果你的环境中没有正常运行的 `systemd --user` 会话,请使用手动守护进程路径: ``` ./build/native/native/asg-install --no-enable-systemd-user ./build/native/native/sgd --socket /tmp/agent-safe-guard/sgd.sock ``` 原生客户端已经会探测 `/tmp/agent-safe-guard/sgd.sock`,因此这种手动模式无需额外的钩子更改即可工作。 ## 验证安装 检查已安装的入口点: ``` ls -l ~/.claude/hooks/asg-pre-tool-use ls -l ~/.local/bin/asg-cli ~/.local/bin/asg-install ~/.local/bin/asg-uninstall ``` 检查公共 CLI: ``` asg-install --help asg-uninstall --help asg-cli --print-rules ``` ## 日常命令 安装或重新安装: ``` asg-install ``` 打开策略控制台: ``` asg-cli ``` 非交互式打印包和规则状态: ``` asg-cli --print-rules ``` 卸载钩子和启动器,同时保留本地配置/状态: ``` asg-uninstall ``` ## 工作原理 热路径执行是原生的: 1. Claude Code 在标准输入上发出 JSON 格式的钩子事件。 2. 原生钩子客户端 (`sg-hook-*`) 通过 Unix socket 将 payload 转发给 `sgd`。 3. 守护进程评估内置规则和已编译的目录模式,然后返回钩子 JSON。 4. Claude Code 接收决策(拒绝、允许、修改输出、停止会话)。 所有执行都是默认拒绝的:如果守护进程不可达,钩子客户端将拒绝工具调用,而不是让其通过。 仓库结构: ``` config.env # Default thresholds and limits native/ # Native daemon, hook clients, CLI tools queries/ # Tree-sitter tag queries (TS/JS) for the repo map hooks/ # Legacy/reference Bash implementation, not installed systemd/ # User systemd socket + service unit templates third_party/ # Pinned submodules (tree-sitter + grammars, doctest) docs/ # Architecture, roadmap, and feature docs tests/ # bats-core integration tests (547 tests) screenshots/ # README assets ``` ## 配置与状态 主要配置文件和状态目录: - `~/.claude/.safeguard/config.env` - `~/.claude/.safeguard/features.env` - `~/.claude/.safeguard/policy/packages.json` - `~/.claude/.safeguard/policy/installed.json` - `~/.claude/.safeguard/policy/catalogs.json` - `~/.claude/.safeguard/policy/stats/` - `~/.claude/.statusline/events.jsonl` 实用的事件检查命令: ``` rg '"event_type":"rule_match"' ~/.claude/.statusline/events.jsonl rg '"event_type":"blocked"' ~/.claude/.statusline/events.jsonl rg '"event_type":"permission_decision"' ~/.claude/.statusline/events.jsonl rg '"event_type":"read_guard"' ~/.claude/.statusline/events.jsonl ``` ## 测试 安装不需要 git 子模块。但测试需要。 ``` git submodule update --init --recursive make native-build make test ``` 实用的测试目标: - `make test` — 所有 547 个测试,并行执行 - `make test-unit` — 仅单元测试 - `make test-integration` — 仅集成测试 - `make coverage` — 附带行覆盖率报告 - `make test-native-pre-smoke` — 针对原生守护进程的预工具使用冒烟测试 - `make test-native-rule-audit` — 验证所有规则均已编译并与预期输入匹配 测试套件在隔离的临时主目录中运行。它不会触碰你真实的 `~/.claude` 状态。 ## Repo Map 入门指南 这是 [aider](https://github.com/Aider-AI/aider) 的 `RepoMap` 移植到原生 C++20 的实现,已集成到现有的守护进程中。 在会话开始时,守护进程使用 tree-sitter 遍历你的仓库,通过交叉引用的 PageRank 对文件进行排序,并将排名靠前文件的紧凑型 `path:line kind name` 映射注入到 Claude 的 `additionalContext` 中。Claude 在每次会话开始时就已经知道类、接口、函数和方法的位置 — 无需预热 Read/Grep 交互。 ![Repo Map in the asg-cli Settings tab](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c910ab00b0220301.png) 通过 `asg-cli` → 设置 → "Repo Map Primer" 实时切换。 **示例。** 此功能生效后,在全新会话中询问“这个仓库有 `Promises` 类吗?”可以直接从 primer 中获得即时解答,无需任何文件 I/O: ``` > o repo tem uma classe Promises? em qual arquivo e linha? Sim, há duas cópias — ambas definem class Promises na linha 4: - app-gps-INOVA/src/Promises.js:4 - app-gps-SAMU/src/Promises.js:4 ``` ### 工作原理 1. Tree-sitter 解析每个 `.ts` / `.mts` / `.cts` / `.js` / `.mjs` / `.cjs` 文件(计划在 v0.3 中支持 TSX 和更多语言)。声明文件 (`.d.ts`) 会被跳过。 2. 从跨文件的标识符引用构建文件图,并通过名称形态启发式方法进行加权。 3. 手写的 PageRank 算法(50 次迭代,阻尼系数 0.85)对文件进行排序。 4. 排名靠前的 N 个标签被渲染为 `rel_path:line kind subkind name` 形式的行,其大小通过在 N 上进行二分搜索控制在 `SG_REPOMAP_MAX_TOKENS`(默认 4096)以内。每文件的标签上限(默认 40)可防止批量重新导出耗尽预算。 5. 结果缓存在 `/.asg-repomap/tags.v1.bin`。在 git 仓库中,首次构建会将 `.asg-repomap/` 追加到 `.git/info/exclude`。后续的会话启动会对每个文件进行 mtime 检查,仅重新解析发生更改的文件 — 即使在包含 3k 文件的仓库中,典型的热更新也低于 100 ms。 ### 性能测量 在 Ryzen 9 9950X3D、单线程环境下,针对真实的 TS/JS 工作仓库: | 仓库大小 | 冷启动构建 | 热更新 | 缓存 | 渲染 (预算 4096) | |--- |--- |--- |--- |--- | | 370 个源文件 | 3.3 s | 10 ms | 1.0 MB | 4 个文件 / 160 个标签 | | 1 227 个源文件 | 10.0 s | 40 ms | 3.1 MB | 3 个文件 / 120 个标签 | | 3 235 个源文件 | 21.6 s | 100 ms | 6.8 MB | 3 个文件 / 120 个标签 | 一旦存在缓存,渲染本身的耗时将低于 200 ms。 ### 配置 所有配置项均为可选。默认配置为启用状态。 ``` # ~/.claude/.safeguard/features.env SG_FEATURE_REPOMAP=1 # toggle the SessionStart injection # ~/.claude/.safeguard/config.env (或环境变量) SG_REPOMAP_MAX_TOKENS=4096 # chars/4 budget for the injected map SG_REPOMAP_MAX_FILE_BYTES=524288 # skip source files > 512 KB SG_REPOMAP_MAX_TAGS_PER_FILE=40 # per-file tag cap (0 = unlimited) ``` 通过 `asg-cli` → 设置标签页 → "Repo Map Primer" 进行交互式切换。 ### 直接使用 CLI `asg-repomap` 二进制文件可单独用于调试、脚本编写或预热缓存: ``` asg-repomap build --root ~/src/my-repo # full cache build asg-repomap update --root ~/src/my-repo # incremental (mtime-skip) asg-repomap render --root ~/src/my-repo # print the map asg-repomap render --root ~/src/my-repo --budget 8192 asg-repomap stats --root ~/src/my-repo # files, tags, cache size asg-repomap clean --root ~/src/my-repo # rm -rf .asg-repomap/ asg-repomap build --file some.ts --tags # single-file inspection ``` 完整详情请参阅 [docs/repomap.md](docs/repomap.md)。 ## 扩展包(目录) `agent-safe-guard` 支持从远程目录安装额外的规则包。默认目录托管在 [regen-dev/agent-safe-guard-rules](https://github.com/regen-dev/agent-safe-guard-rules)。 通过 `asg-cli` 的目录标签页同步并安装,或非交互式地执行: ``` asg-cli --catalog-sync asg-cli --catalog-install cloud-defense ``` 目录包使用 SHA256 完整性检查。守护进程在启动时会将目录规则模式编译为正则表达式匹配器。 ## 路线图 分发和平台规划详见 [docs/distribution-roadmap.md](docs/distribution-roadmap.md)。 当前方向: - 优先发布干净稳定的源码版本 - 为 Debian/Ubuntu 用户添加 `.deb` 打包 - 添加 AppImage 以支持便携式 Linux 安装 - 将 Windows 和 macOS 作为探索性工作保留在路线图中,排在传输层/服务抽象检查点之后 ## 文档 - [native/README.md](native/README.md) — 原生运行时、协议、事件日志 - [docs/repomap.md](docs/repomap.md) — 仓库映射算法、CLI、配置、性能测量 - [docs/rule-engine-architecture.md](docs/rule-engine-architecture.md) — 阶段模型、ModSecurity 风格的引擎 - [docs/policy-catalog-console-plan.md](docs/policy-catalog-console-plan.md) — 目录和控制台 UX 设计 - [docs/distribution-roadmap.md](docs/distribution-roadmap.md) — 打包和平台计划 - [docs/memory-safety.md](docs/memory-safety.md) — 面向贡献者的不可妥协的内存与资源安全契约(修改涉及分配器的代码前必读) ## 安全 有关漏洞报告,请参阅 [SECURITY.md](SECURITY.md)。 ## 许可证 MIT。详见 [LICENSE](LICENSE)。
标签:AI代理防护, Bash脚本, C++, C++20, Claude Code, DevSecOps, Fail-closed, Tree-sitter, 上游代理, 云计算, 人工智能安全, 代理监控, 代码安全, 合规性, 命令拦截, 大语言模型安全, 守护进程, 安全助手, 安全策略, 安全钩子, 开源, 提示词设计, 数据擦除, 文件访问控制, 机密信息遮蔽, 机密管理, 权限管理, 模型越狱, 沙箱, 漏洞枚举, 端点防护, 网络安全, 网络安全审计, 规则引擎, 资源限制, 防御破坏性命令, 隐私保护, 预算控制