aiconnai/agentshield

GitHub: aiconnai/agentshield

一款离线 Rust SAST 扫描工具,用于在 AI Agent 和 MCP 扩展发布前发现命令注入、凭证泄露等高风险行为。

Stars: 9 | Forks: 1

# AgentShield **在 MCP 和 AI agent 扩展发布前,发现其中的高风险行为。** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/a1beb08a11065821.svg)](https://github.com/limaronaldo/agentshield/actions/workflows/ci.yml) [![License: MIT OR Apache-2.0](https://img.shields.io/badge/License-MIT%20OR%20Apache--2.0-blue.svg)](LICENSE-MIT) [![Crates.io](https://img.shields.io/crates/v/agent-shield.svg)](https://crates.io/crates/agent-shield) [![docs.rs](https://img.shields.io/docsrs/agent-shield)](https://docs.rs/agent-shield) AgentShield 是一款离线的 Rust 扫描工具,专为跨当前 agent 技术栈交付支持工具调用的 agent 的团队设计。原生适配器覆盖了 MCP 服务器、OpenClaw 技能、Hermes Agent 配置、CrewAI、LangChain/LangGraph、GPT Actions 和 Cursor Rules;相同的检查机制也有助于加固基于 OpenAI Agents SDK、Claude Code、Claude Desktop MCP 设置、Browser Use、FastMCP、GitHub MCP Server、Playwright MCP 以及其他重度依赖 MCP 的工作流构建的代码库。它能够在 agent 实际调用这些工具之前,捕获命令注入、凭证泄露、SSRF、不安全的文件访问、运行时包安装、prompt 注入面以及依赖项卫生问题。 它可以作为 CLI、GitHub Action 或库运行,将源代码保留在本地机器上,并输出控制台、JSON、用于 GitHub Code Scanning 的 SARIF 以及独立的 HTML 报告。当前的发布版本号为 `0.8.7`。 ## 概览 | 领域 | AgentShield 的作用 | |------|------------------------| | 扫描面 | 将七个框架/客户端系列标准化为一种 IR:MCP、OpenClaw、Hermes Agent、CrewAI、LangChain/LangGraph、GPT Actions 和 Cursor Rules。 | | 检测 | 运行 18 条内置规则,检测命令执行、凭证泄露、SSRF、文件系统风险、运行时安装、prompt 面、依赖项卫生、不安全的反序列化、机密泄漏等。 | | 工作流适配 | 在本地、CI 以及 GitHub Code Scanning 中均可运行,且无需将源代码发送至托管服务。 | | 边界 | AgentShield 不是托管监控服务、运行时沙箱或白名单市场。实验性的 runtime guard 入口在选择性启用的 feature flag 之后提供;稳定的契约是静态扫描与策略评估。 | 有关 runtime guard 的范围和路线图,请参见 [docs/RUNTIME_GUARD.md](docs/RUNTIME_GUARD.md)。 ## 适用范围 只要 agent 可以调用本地工具、远程 API、浏览器自动化、文件操作、shell 命令或 MCP 服务器,AgentShield 就能发挥重要作用。 | 生态系统 | AgentShield 如何提供帮助 | |-----------|-----------------------| | Claude Desktop 和 Claude Code | 在将 MCP 服务器和工具仓库添加到 Claude MCP 配置或编程 agent 工作流之前,对其进行扫描。 | | Cursor 和 Cursor Rules | 检测可能触及文件、命令或网络的高风险 agent 指令、MCP 服务器定义和工具代码。 | | OpenAI Agents SDK | 扫描 OpenAI agent 应用程序使用的工具实现、OpenAPI/GPT Actions 接口以及连接 MCP 的代码仓库。 | | LangGraph 和 LangChain | 在 agent 执行工具之前,分析 Python/TypeScript 工具代码及其依赖项暴露面。 | | CrewAI | 检查 Python CrewAI 工具项目是否存在命令执行、凭证泄露、SSRF 以及不安全的文件访问。 | | FastMCP、GitHub MCP Server 和 Playwright MCP | 在发布或安装之前,扫描 MCP 服务器代码、清单、schema、依赖项和来源。 | | Browser Use 和浏览器自动化 agent | 在启用工具的自动化代码仓库中,捕获高风险的命令、网络、文件和依赖项模式。 | 可运行的示例位于 [examples/](examples/README.md) 目录下,并提供了针对 [Claude MCP 安全](docs/claude-mcp-security.md)、[MCP 安全扫描](docs/mcp-security-scanner.md) 和 [OpenAI Agents 安全](docs/openai-agents-security.md) 的专题指南。 ## 为什么选择 AgentShield? AI agent 正被连接到各种工具上,这些工具能够执行命令、读写文件、发起 HTTP 请求、安装包以及调用外部服务。一个恶意的或编写不当的扩展可能会导致: - **泄露凭证**:通过读取环境变量或本地机密文件,并将其发送到攻击者控制的 endpoint。 - **执行任意命令**:将用户可控的输入传递给 shell 或进程 API。 - **在运行时安装后门**:在工具处理程序内部通过包管理器调用来实现。 - **代理 SSRF 请求**:通过获取源自工具参数的 URL。 - **向模型上下文泄漏敏感数据**:通过不受保护的 prompt、工具结果或规则文件。 AgentShield 通过静态分析、框架适配器、策略评估、抑制、基线、egress 策略生成、证明以及用于 GitHub Code Scanning 的 SARIF 输出来捕获这些模式。 ### 功能对比 | 功能 | AgentShield | mcp-scan | Invariant Labs | |---------|:-----------:|:--------:|:--------------:| | Rust 单一二进制文件 | 是 | 否 | 否 | | 离线 / 本地优先 | 是 | 部分 | 否 | | 多框架适配器 | 是 | 专注于 MCP | 专注于 MCP | | 静态分析 | tree-sitter + 定向解析器 | 基于正则表达式 | 基于运行时/云端 | | 跨文件净化器分析 | 是 | 否 | 否 | | SARIF 输出 | 是 | 否 | 否 | | GitHub Action | 是 | 否 | 否 | ## 快速开始 ### GitHub Action 添加至 `.github/workflows/security.yml`: ``` name: Agent Security on: [push, pull_request] jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: aiconnai/agentshield@main with: path: '.' fail-on: 'high' ignore-tests: true upload-sarif: true ``` 当启用 SARIF 上传时,扫描结果将显示为 PR 注释,并位于代码仓库的 **Security > Code scanning** 标签页下。 ### CLI ``` # 从 GitHub 安装包含完整功能集的当前版本 cargo install --git https://github.com/limaronaldo/agentshield --tag v0.8.7 --features full --force # 首次运行设置:配置 + 首次扫描说明 agentshield quickstart # 了解 gate、coverage、confidence 和后续操作 agentshield scan . --ignore-tests --fail-on high --explain # 添加 GitHub Actions workflow agentshield ci install # 在现有 repo 中采用,而不阻塞已知的 findings agentshield scan --write-baseline .agentshield-baseline.json agentshield ci install --baseline .agentshield-baseline.json # 生成独立的 HTML 报告 agentshield scan ./my-agent-extension --format html --output report.html # 列出所有 rules agentshield list-rules # 创建初始 config agentshield init ``` 如果您只需要在已发布的 crates.io 版本中进行静态扫描,同样支持使用 `cargo install agent-shield`。当您需要在 crates.io 更新之前使用最新的发布版本时,请使用上文提到的 GitHub tag 命令。 ### 预构建二进制文件 从 [最新发布版本](https://github.com/limaronaldo/agentshield/releases/latest) 下载适用于 Linux、macOS 和 Windows 目标平台的文件。 对于容器用户,发布镜像标签为: ``` ghcr.io/aiconnai/agentshield:0.8.7 ``` ### Docker GHCR 镜像使用 `full` feature 集进行构建,包括运行时 `wrap` 支持和实验性的 runtime guard 命令。该镜像针对 `linux/amd64` 和 `linux/arm64` 平台发布。 ``` docker pull ghcr.io/aiconnai/agentshield:0.8.7 docker run --rm -v "$PWD:/scan" ghcr.io/aiconnai/agentshield:0.8.7 scan . docker run --rm ghcr.io/aiconnai/agentshield:0.8.7 --version ``` 如果 GHCR 包在您的组织中是私有的,请先进行身份验证: ``` gh auth refresh -h github.com -s read:packages gh auth token | docker login ghcr.io -u "$(gh api user --jq .login)" --password-stdin ``` ### 从源码构建 ``` git clone https://github.com/limaronaldo/agentshield.git cd agentshield cargo build --release ./target/release/agentshield scan /path/to/agent-extension ``` ## 使用 RTK 进行 Token 优化的本地检查 AgentShield 在本地开发过程中可能会产生冗余的命令输出,特别是来自 `cargo test`、`cargo clippy` 以及输出 JSON 或 SARIF 的扫描任务。如果已安装 `rtk`,可以使用可选的包装器来减少展示给人类和编程 agent 的输出内容: ``` scripts/rtk-check.sh quick scripts/rtk-check.sh test scripts/rtk-check.sh clippy scripts/rtk-check.sh scan-fixture ``` 该包装器专用于本地。RTK 仅过滤本地命令输出。它绝不能更改被用户、客户端、CI 或 GitHub Code Scanning 使用的 AgentShield JSON、SARIF、HTML 或控制台输出契约。 在进行调试、审计和安全决策时,请使用原始输出: ``` scripts/rtk-check.sh raw -- cargo test scripts/rtk-check.sh raw -- cargo run -- scan tests/fixtures/mcp_servers/safe_calculator --format sarif --output target/agentshield/scan.sarif ``` 策略: - 使用过滤后的输出以获得快速的本地反馈。 - 在排查测试失败、解析器错误、检测器行为或安全敏感的扫描结果时,使用原始输出。 - 当客户端或 CI 需要消费报告时,务必将完整的 `json` 和 `sarif` 报告写入文件中。 ## 支持的框架 AgentShield 会在代码仓库中运行所有匹配的适配器,而不是在匹配到第一个时即停止。 | 框架 | 状态 | 适配器覆盖范围 | |-----------|--------|------------------| | MCP (Model Context Protocol) | 支持 | MCP 服务器清单、Python/TypeScript/JavaScript 源码、工具 schema、依赖项、出处 | | OpenClaw | 支持 | `SKILL.md` 技能文件及相关源码/依赖项暴露面 | | Hermes Agent | 支持 | Hermes 配置/配置文件、`mcp_servers`、`.hermes.md`、技能树、可选的 MCP 清单 | | CrewAI | 支持 | 通过依赖项元数据或 import 检测到的 Python 项目 | | LangChain / LangGraph | 支持 | LangChain/LangGraph 依赖项元数据、import 以及 `langgraph.json` | | GPT Actions | 支持 | 用于自定义 GPT 集成的 Action/OpenAPI 风格接口 | | Cursor Rules | 支持 | Cursor 规则文件及相关 agent 指令暴露面 | ## CLI 命令 | 命令 | 用途 | |---------|---------| | `agentshield scan [path]` | 扫描 agent 扩展目录并输出控制台、JSON、SARIF 或 HTML 格式的结果。 | | `agentshield scan [path] --explain` | 打印仅供控制台显示的门禁、覆盖率、置信度、分组扫描结果、后续操作和限制摘要。 | | `agentshield quickstart [path]` | 创建首次运行配置,建议 CI 设置,运行首次扫描并解释结果。 | | `agentshield ci install` | 为 AgentShield 生成 GitHub Actions 工作流。 | | `agentshield ci install --baseline ` | 生成通过基线文件过滤已知扫描结果的工作流。 | | `agentshield list-rules` | 以表格或 JSON 格式列出可用的检测规则。 | | `agentshield doctor [path]` | 打印环境、配置、编译特性和适配器的诊断信息。 | | `agentshield init` | 生成初始的 `.agentshield.toml` 配置文件。 | | `agentshield suppress ` | 添加抑制条目(需提供原因,可选过期时间)。 | | `agentshield list-suppressions` | 显示在 `.agentshield.toml` 中配置的抑制项。 | | `agentshield certify [path]` | 为扫描结果生成 DSSE 证明信封。 | | `agentshield wrap --policy -- ` | 在使用 `runtime` feature 构建时,通过本地 HTTP 代理实施 egress 策略。 | | `agentshield guard --stdin` | 在使用 `runtime-guard` feature 构建时,评估单个 runtime 事件的 JSON 文档。 | | `agentshield guard --mcp-proxy [-- ]` | 实验性功能:在使用 `runtime-guard` feature 构建时,评估换行符分隔的 MCP JSON-RPC `tools/call` 消息,阻止不安全的调用,并发出转发标记,或者将 stdio 桥接到生成的下游 MCP 服务器。 | 实用的 `scan` 选项包括 `--config`、`--format`、`--fail-on`、`--output`、`--ignore-tests`、`--explain`、`--baseline`、`--write-baseline` 和 `--emit-egress-policy`。 配置的 `[scan] include` 和 `[scan] exclude` 过滤器会在检测器运行前,界定源码和基于元数据生成的扫描结果的范围。 对于已有扫描结果的成熟代码库,请先写入基线,然后在 CI 中使用它: ``` agentshield scan --write-baseline .agentshield-baseline.json agentshield scan --baseline .agentshield-baseline.json --explain agentshield ci install --baseline .agentshield-baseline.json ``` `--explain` 是特意设计为仅供控制台显示的。它不会将文本追加到 JSON、SARIF 或 HTML 输出中。Explain 输出包含扫描根目录(如不同则包含元数据根目录),以及针对集中阻断性扫描结果的热点摘要。 ## 检测规则 AgentShield 内置了针对命令执行、凭证泄露、SSRF、任意文件访问、运行时包安装、自我修改、prompt 注入面、过度权限、依赖项卫生、动态代码执行、元数据服务访问、下载并执行流程、过宽的文件系统能力、不安全的反序列化、归档文件目录穿越以及机密泄漏的规则。 请使用 CLI 获取您所安装版本的权威规则列表: ``` agentshield list-rules agentshield list-rules --format json ``` ## 输出格式 | 格式 | 标志 | 用例 | |--------|------|----------| | 控制台 | `--format console` | 本地开发默认值 | | JSON | `--format json` | 程序化消费与指纹提取 | | SARIF | `--format sarif` | GitHub Code Scanning 及兼容工具 | | HTML | `--format html` | 可分享的独立报告 | ## 配置 ### 信任工作流 AgentShield 包含关于基线、抑制、认证证明和 egress 执行的信任工作流文档: - `docs/BASELINES.md`:为已知扫描结果编写并使用 `.agentshield-baseline.json`。 - `docs/SUPPRESSIONS.md`:通过指纹抑制单个扫描结果,需提供原因并可选过期时间。 - `docs/CERTIFICATION`:生成未签名或 Ed25519 签名的 DSSE 证明。 - `docs/EGRESS.md`:发出 `agentshield.egress.toml` 并使用 `agentshield wrap` 执行该策略。 发布的二进制文件使用 `full` feature 集构建,包括 Python 解析、TypeScript 解析、运行时 `wrap` 支持以及实验性的 runtime guard 命令。如果从源码构建,请使用 `cargo build --features full --release` 以包含 `agentshield wrap` 和 `agentshield guard`。 在项目根目录创建 `.agentshield.toml` 或运行 `agentshield init`: ``` [policy] # 使扫描失败的最低严重级别:info、low、medium、high、critical fail_on = "high" # 完全跳过的 rules ignore_rules = ["SHIELD-008"] # 降级特定的 rules [policy.overrides] "SHIELD-012" = "info" [scan] # 在解析前跳过测试文件 ignore_tests = true # 可选的路径过滤器相对于扫描根目录。 # 空的 include 意味着所有支持扫描的文件都符合条件。 # 使用 ** 匹配递归目录;* 和 ? 保持在单个路径段内。 include = ["src/**", "tools/**"] exclude = ["legacy/**", "**/generated/**", "vendor/**"] [runtime.proxy] # 运行时 MCP 代理 guard 阻塞阈值:block、warn 或 never。 fail_on = "block" [[runtime.proxy.tool]] name = "calculator.add" fail_on = "never" ``` 在从 JSON 输出中获取扫描结果指纹后,可以通过 `agentshield suppress --reason "..."` 添加抑制项。 当 `include` 和 `exclude` 同时匹配同一个文件时,`exclude` 优先生效。请使用 `agentshield scan . --explain` 来确认当前生效的路径过滤器及解析到的源文件数量,然后再在 CI 中依赖于聚焦范围的扫描。 路径过滤匹配区分大小写,在所有平台上均接受 `/`,会将开头的 `./` 或 `/` 视为相对于扫描根目录,并将诸如 `legacy/` 这样的末尾斜杠视为匹配该目录的内容。 ## 退出代码 | 代码 | 含义 | |------|---------| | 0 | 扫描通过,没有超过阈值的扫描结果 | | 1 | 扫描失败,存在超过阈值的扫描结果 | | 2 | 扫描错误,例如配置无效或未找到支持的适配器 | | 3 | Runtime guard 阻止了操作,或在遇到无效的 runtime 输入时安全关闭(failed closed) | ## 语言支持 | 语言 | 解析器 | 特性标志 | |----------|--------|--------------| | Python | tree-sitter AST 结合正则表达式源/汇模式 | `python` (默认) | | TypeScript/TSX | tree-sitter AST 结合回退模式 | `typescript` (默认) | | JavaScript/JSX | 通过 TypeScript 语法支持使用 tree-sitter AST | `typescript` (默认) | | Shell | 正则表达式解析器 | 始终开启 | | JSON Schema / OpenAPI 风格的 schema | Schema 解析器 | 始终开启 | 两个 tree-sitter 解析器都受特性控制: ``` cargo build --no-default-features cargo build --features python cargo build --features full ``` `full` feature 启用了语言解析器,以及被 `agentshield wrap` 和实验性 runtime guard 命令所使用的运行时代理。 ## 架构 ``` CLI / GitHub Action / Library API | v Scan Engine -> ScanReport | v Adapters -> Parsers -> Cross-file analysis -> Unified IR (ScanTarget) | v Rule Engine -> Policy / Suppressions / Baseline filtering | v Console / JSON / SARIF / HTML / DSSE attestation ``` 适配器将特定于框架的文件转换为统一的中间表示。检测器仅消费该 IR,因此无需重写每一条规则即可添加新框架。策略、抑制和基线独立于检测机制,从而确保扫描结果保持可解释和可重复。 ## 开发 ``` cargo test cargo clippy -- -D warnings cargo fmt --check cargo run -- scan tests/fixtures/mcp_servers/vuln_cmd_inject cargo run -- list-rules ``` 有关特定版本的说明,请参阅 `docs/releases/0.8.6.md`、 `docs/releases/0.8.7.md` 和 `docs/RELEASE_CHECKLIST.md`。
标签:AI Agent安全, CISA项目, GitHub Action, MCP, Rust, SAST, 可视化界面, 安全合规, 盲注攻击, 网络代理, 网络流量审计, 请求拦截, 通知系统, 静态代码扫描