
node9-proxy v1.67.3
面向智能体时代的执行安全层。为自主AI代理提供确定性的“Sudo”治理与审计日志。
🛡️ Node9
你的 AI 代理到底做了什么?查清楚。
Node9 位于你的 AI 代理及其可使用的工具之间——发现它已经做了什么,防护实时风险行为,审查任意时间窗口内发生的事件。
适用于 Claude Code · Codex CLI · Antigravity (agy) · GitHub Copilot CLI · Gemini CLI · Cursor · Windsurf · VSCode · Claude Desktop · Opencode · Pi · Hermes Agent · 任意 MCP 服务器。
Node9 的功能
- 🔍 发现 — 扫描所有历史 AI 会话,查找凭据泄露、代理循环、被阻止的操作,以及当前代理可触及磁盘上的每个机密
- 🛡 防护 — 在风险命令执行前审查或阻止 —
rm -rf、git push --force、DROP TABLE、凭据读取、curl | bash、AWS/GitHub/Stripe 密钥泄露 - 📊 审查 — 按周期生成报告(今天/本周/本月/90天)—— 每个代理的成本、常用工具、触发的护盾、影响范围
回顾性扫描
这是我自己的机器——在构建 Node9 的 90 天内。评分 25/100,AI 代理当前可直接访问 5 个凭据文件。
npx node9-ai scan # 安装前运行,约 10 秒,不上传任何内容
node9 scan # 安装后运行,输出相同
Node9 扫描评分卡
安全态势评分卡
node9 posture 评估该机器遭受被入侵代理时的暴露程度——隔离、出站、磁盘上的机密、供应链、权限——并为你提供修复每个发现的确切命令。
node9 posture # 评分卡,附首要风险及每个发现的修复命令
node9 posture --ship # 将脱敏快照发送至你的 node9 仪表盘(集群视图)
发现的项按 谁能修复 分组:🔒 表示 node9 可降低的(只需运行命令)和 🧱 表示只有你能修复的。每项都附带通俗易懂的 what/why/who 以及实际的修复措施——例如,"代理在宿主机上无沙箱运行" 的发现直接指向 node9 sandbox run(见下文)。
🛡️ Node9 Posture — agent on this host Score: 100/100 (Good)
2 advisories below don't affect the score — OS-level exposure, yours to weigh.
🟢 node9 is already protecting you
✅ Secrets node9 DLP is blocking this
✅ Egress node9 egress is approval-gating this
✅ Approval gate node9 is blocking this
✅ Privilege node9 is approval-gating this
🔒 node9 reduces these — run the command, the rest is yours
⚠️ Isolation Running directly on the host — no container
The agent runs loose on your whole machine, not in a sandbox.
→ node9 sandbox run <agent> — jail it: kernel egress + scoped mounts + node9 inside
→ node9 shield enable project-jail — or shrink the blast radius, keep host access
⚠️ Network exposure 4 services on 0.0.0.0 (node :3000/:4000, PostgreSQL :5432, Redis :6379)
Reachable from your whole network, not just this laptop.
→ node9 shield enable postgres|redis — node9 blocks DROP TABLE / FLUSHALL
→ bind to 127.0.0.1 / firewall the port (your part)
✅ Supply chain no issues found
✅ Coverage no issues found
Track this across your fleet & keep it green → node9.ai
扫描仓库——代理-CI 安全
node9 scan-repo 检查任意仓库(或本地文件夹)中是否存在 AI 代理(与 GitHub Actions 集成)可能被外部攻击者劫持的途径——可注入的工作流、代理可触及的机密、未固定版本的 MCP 服务器、权限过大的代理配置以及被投毒的命令文件。静态解析:仅读取已提交的配置,绝不执行仓库代码。对于公开仓库无需安装或令牌。
npx node9-ai scan-repo <owner/repo> # 任意公开仓库,无需安装
node9 scan-repo . # 本地检出——无网络请求
node9 scan-repo <owner/repo> --json # 机器可读格式
🛡️ node9 scan-repo · node9-ai/agent-security-demo · ⚠️ agent-security risk found
inspected 2 config file(s), 2 finding(s)
🔴 CRITICAL Injectable agent workflow — untrusted input reaches a tool-using agent with secrets
.github/workflows/vulnerable-example.yml · CI-2
• runs with base-repo secrets (pull_request_target)
• checks out the untrusted PR head into the workspace root
• allowed_non_write_users: "*" — any user can trigger the agent
• no effective actor gate
🔴 CRITICAL Exfiltratable secrets reachable by an injectable agent
.github/workflows/vulnerable-example.yml · CI-4
• agent has arbitrary shell (bare Bash) → can read env and exfiltrate
检查项:
| 检查项 | 标志 |
|---|---|
| CI-1 | 已提交的代理配置预授权了广泛工具或运行远程钩子 |
| CI-2 | 可注入的代理工作流——外部攻击者可触发代理并劫持它 |
| CI-3 | 未固定版本 / @latest 的 MCP 服务器或内联凭据(供应链) |
| CI-4 | 被注入代理可能窃取的机密 |
| CI-6 | CLAUDE.md / AGENTS.md / skills 中被投毒或危险的指令 |
拦截每个 PR——相同的引擎以 GitHub Action 运行,因此可劫持的配置无法被合并:
# .github/workflows/agent-security.yml
- uses: node9-ai/agent-security-action@v1
with:
fail-on: high # or 'never' to just comment
实时监控
Node9 监控仪表盘
node9 monitor 打开一个交互式终端仪表盘,包含两个视图:
[1]实时 — 动态活动、审批、安全警报、当前风险评分[2]报告 — 周期汇总:成本、常用工具、触发的护盾、影响范围
报告
在 monitor 中按 [2] 查看周期汇总。通过 [T]今天 · [W]本周 · [M]本月 · [N]90天 切换窗口——面板与上述扫描相同,数据来自你安装后的审计日志。
Node9 monitor [2] Report
node9 monitor # 按 [2] 查看报告视图
node9 report --period 7d # 命令行形式,无 TUI
安装
# macOS / Linux
brew tap node9-ai/node9 && brew install node9
# 或通过 npm(任意平台)
npm install -g node9-ai
node9 init # 自动连接所有检测到的代理和 MCP 服务器
node9 doctor # 验证所有连接是否正确
需要 Node.js 18+。
护盾——精选规则包
每个护盾是针对某个服务或领域的精选规则集。仅启用你需要的。
| 护盾 | 捕获内容 | 启用 |
|---|---|---|
project-jail | 阻止读取 ~/.ssh、~/.aws、.env、通过 Bash 和 Read 工具读取凭据 | node9 shield enable project-jail |
bash-safe | curl | bash、rm -rf /、磁盘覆写、eval 远程内容 | node9 shield enable bash-safe |
postgres | DROP TABLE、TRUNCATE、DROP COLUMN、无 WHERE 的 DELETE | node9 shield enable postgres |
mongodb | dropDatabase、drop()、deleteMany({})、删除索引 | node9 shield enable mongodb |
redis | 在线上服务器上执行 FLUSHALL、FLUSHDB、CONFIG SET | node9 shield enable redis |
aws | S3 删除、EC2 终止、IAM 变更、RDS 销毁 | node9 shield enable aws |
k8s | 删除命名空间、helm uninstall、清除集群角色 | node9 shield enable k8s |
docker | system prune、volume prune、rm -f 容器 | node9 shield enable docker |
github | gh repo delete、远程分支删除、设置变更 | node9 shield enable github |
filesystem | chmod 777、写入 /etc/、/boot/、/usr/ 目录 | node9 shield enable filesystem |
mcp-tool-gating | 未经批准的 MCP 工具静默激活新能力 | node9 shield enable mcp-tool-gating |
node9 shield list # 显示所有护盾及其状态
始终开启——无需配置
- Git — 捕获
git push --force、git reset --hard、git clean -fd - SQL — 捕获无
WHERE的DELETE/UPDATE、DROP TABLE、TRUNCATE - Shell — 捕获
curl | bash、未授权的sudo - DLP — 在任何工具参数、文件内容或 shell 配置(
~/.zshrc、~/.bashrc)中标记 AWS 密钥、GitHub 令牌、Stripe 密钥、PEM 私钥 - 响应 DLP — 后台扫描器读取 Claude 的对话历史,并在 Claude 在响应文本中写入了机密时向你发出警报
- 自动撤销 — 每次 AI 文件编辑前进行 git 快照 →
node9 undo回退 - 技能锁定 — 对安装的 Claude 技能/插件在会话间进行 SHA-256 验证
审查提示——在代理内联审批
当 node9 将一个操作标记为审查(例如 git push --force、DROP TABLE)时,批准/拒绝提示会在代理对话中内联显示——不会冻结会话、无需单独终端窗口、没有钩子超时竞争。node9 仍然运行完整的评估器并做出决策;只是提示界面移到了代理中。
- 默认开启 适用于 Claude Code 和 GitHub Copilot CLI——这些代理的钩子契约支持原生的
ask。所有其他代理(Codex、Gemini、Antigravity、Hermes、Cursor、OpenCode、Pi)使用 node9 自己的审批器。 - 控制它 通过
~/.node9/config.json中的reviewChannel设置(或为钩子添加--no-ask):
{
"settings": {
"reviewChannel": "ask", // "ask" = 内联代理提示(默认)| "approver" = node9 自己的审批器
},
}
- 团队设置: 当配置了云端/团队审批器(
approvers.cloud: true)时,审查将路由到该审批器——node9 不会允许内联自我批准绕过路由/第二方审批。
沙箱——在隔离环境中运行代理
当监控不够时,node9 sandbox 在一个可丢弃的容器中运行代理,并带有一个内核强制出站允许列表和限定挂载范围——同时 node9 的钩子管理和审计箱内每个工具调用。这是强硬的防护版本:代理只能触及你挂载的文件夹和允许的主机;其他一切都在内核层面被丢弃。
cd ~/my-project
node9 sandbox new # 写入 node9.sandbox.yaml——要挂载的内容和允许的主机
node9 sandbox run # 构建并启动被隔离的代理(你的项目位于 /workspace)
node9 sandbox tail # 从宿主机实时查看代理的操作
- 可丢弃 — 容器在退出时销毁;你的项目编辑内容会写入真实磁盘,其他内容不会保留。
- 相同策略 — 你现有的护盾/出站规则/审批在箱内同样适用,并流式传输到相同的审计日志和仪表盘。
- 闭合态势循环 — 运行它会使隔离/出站发现项变为绿色。
诚实范围(阶段 1):单容器,Claude 优先(Codex 下一步);代理在箱内仍然持有自己的凭据(出站墙将其限制在允许的主机)——"代理永不持有机密" 是路线图上的凭据代理阶段。需要 Docker。
MCP 网关
透明地包装任意 MCP 服务器。代理看到相同的服务器——Node9 拦截每个工具调用。
{
"mcpServers": {
"postgres": {
"command": "node9",
"args": ["mcp", "--upstream", "npx -y @modelcontextprotocol/server-postgres postgresql://..."]
}
}
}
或者直接运行 node9 init——它会自动包装你现有的 MCP 服务器。
🔐 MCP 工具固定——防止拉地毯攻击
MCP 服务器可以在会话之间更改其工具定义。一个被入侵或恶意的服务器可能在你首次信任它之后静默地添加、删除或修改工具——这就是拉地毯攻击。
Node9 在首次使用时固定工具定义:
- 首次连接 — 网关记录每个工具的名称、描述和模式的 SHA-256 哈希
- 后续连接 — 比较哈希;如果工具发生变化,该会话被隔离,所有工具调用被阻止,直到人类审查并批准变更
- 损坏的固定状态 — 故障关闭(阻止),绝不静默重新信任
node9 mcp pin list # 显示所有已固定的服务器和哈希
node9 mcp pin update <serverKey> # 移除固定,在下次连接时重新固定
node9 mcp pin reset # 清除所有固定
其他命令
除了上述三个流程命令(scan / monitor / report)之外:
| 命令 | 功能 | 使用时机 |
|---|---|---|
node9 blast | 显示 AI 代理当前可触及的内容——文件、凭据、环境变量 | 在任何机器上首先运行 |
node9 tail | 实时流式输出每个工具调用(纯文本,无 TUI) | 管道到其他工具、CI、日志 |
node9 sessions | 会话历史,包含提示、工具调用轨迹、成本、快照 | 审查交接或过去的工作 |
node9 dlp | Claude 响应文本中的凭据泄露发现 | 任何时候 DLP 桌面警报触发 |
node9 mask | 从本地会话历史文件中脱敏明文机密 | 在 DLP 发现后——清理本地磁盘 |
此外,在 Claude Code 的状态行中还有一个实时 HUD:
🛡 node9 | standard | [bash-safe] | ✅ 12 allowed 🛑 2 blocked 🚨 0 dlp | ~$0.43
📊 claude-opus-4-7 | ctx [████████░░░] 54% | 5h [██░░░░░░░░] 12% | 7d [█░░░░░░░] 7%
🗂 2 CLAUDE.md | 8 rules | 3 MCPs | 4 hooks
解读数据——数字的含义
Node9 揭示了信号。以下是一些值得关注的模式:
| 信号 | 可能含义 |
|---|---|
一周内 Would have blocked ≥ 5 次 | 代理正在尝试高影响操作;值得检查护盾 |
单个 review-git-push 规则占发现的 50% 以上 | 你自己的规则按预期触发——不是风险,只是监督 |
user-prompt 工具中的 DLP 发现 | 你将一个机密粘贴到了自己的提示中——轮换该密钥 |
| 同一文件上的代理循环 ×50+ 次 | 代理陷入编辑/测试/修复循环——检查上下文或降低速度 |
| MCP 工具固定不匹配 | 服务器更改了其工具——重新信任前需审查 |
| MCP 响应过大警告 | 该服务器正在为后续每个回合膨胀你的上下文窗口 |
Response DLP 警报 | Claude 在其响应文本中写入了机密——未阻止,立即轮换 |
tool-result 中的 DLP 发现 | Claude 读取了包含机密的文件(.env、凭据)——轮换密钥并运行 node9 mask |
[Shell] 中的 DLP 发现 | ~/.zshrc 或 ~/.bashrc 中有明文机密——每个 AI 会话都能看到它 |
偶发的信号是正常的;持续的模式才是你需要采取行动的。
Python SDK——管理任意 Python 代理
from node9 import configure, protect
configure(agent_name="my-agent", policy="require_approval")
@protect("bash")
def run_command(cmd: str) -> str:
...
底层原理
- 扫描 直接从
~/.claude/projects/、~/.gemini/tmp/、~/.gemini/antigravity-*/brain/、~/.copilot/session-state/、~/.codex/sessions/读取原始代理历史——无需 API 调用,完全离线 - 运行时 通过执行前钩子(Claude Code、Codex、Antigravity、GitHub Copilot CLI、Gemini CLI、Opencode、Pi)或通过 MCP 网关(Cursor、Windsurf、VSCode、Claude Desktop)拦截工具调用。所有决策原子性地写入
~/.node9/audit.log - MCP 网关 是一个 stdio 代理;拦截
tools/list+tools/callJSON-RPC,转发其余内容 - 策略引擎 使用 mvdan-sh 进行 bash AST 分析——可对抗通过反斜杠转义、变量替换、eval 远程下载等手段的混淆
- 用于自动撤销的影子仓库 位于
~/.node9/snapshots/<hash16>/——绝不触碰你的.git - 沙箱 生成一个 Dockerfile + 入口点,使用
ipset/iptables默认拒绝出站墙进行密封,然后降级为非 root 代理,其中 node9 的守护进程和钩子在内部运行;仅挂载代理的凭据文件,绝不会挂载整个~/.claude
完整文档
配置参考、智能规则、有状态规则、受信任主机、批准模式、CLI 参考——请访问 node9.ai/docs。
相关项目
- node9-python — Python SDK
- node9-pr-agent — 通过 Node9 审查 PR 的 GitHub Action
企业版
Node9 Pro 增加了治理锁定、SAML/SSO、集中审计导出和 VPC 部署。请见 node9.ai。
许可证
Apache-2.0
用 ☕ 和健康的偏执构建。