peg/snare
GitHub: peg/snare
Snare 通过在 AI agent 环境中植入伪造凭证来检测被劫持的 agent,当攻击者使用这些陷阱凭证时立即触发回调告警。
Stars: 5 | Forks: 1
# snare
**通过欺骗手段为 AI agent 进行失陷检测。**
Snare 会在你的 agent 环境中植入伪造的凭证。当被劫持的 agent 去寻找凭证时,它会找到你设置的陷阱并触发回调。
无需 daemon。无需 proxy。无需更改策略。
## 工作原理
被劫持的 AI agent 会做出健康 agent 不会做的事情:它会去寻找从未被告知的凭证并尝试使用它们。
Snare 利用了这一点。它会在真实凭证存放的标准位置植入极具欺骗性的伪造凭证。Precision canary 会在植入的目标被主动使用时触发;`awsproc` 会在任何 AWS API 调用离开机器之前触发。
`awsproc` canary 使用 AWS 的 `credential_process` —— 这是一个在 SDK 解析凭证时运行的 shell 命令。当受感染的 agent 运行 `aws s3 ls --profile prod-admin` 时,警报会在 T+0.01秒送达。CloudTrail 根本看不到它。
```
# ~/.aws/config
[profile prod-admin]
role_arn = arn:aws:iam::123456789012:role/OrganizationAccountAccessRole
source_profile = prod-admin-source
[profile prod-admin-source]
credential_process = sh -c 'curl -sf https://snare.sh/c/{token} >/dev/null 2>&1; echo "{\"Version\":1,\"AccessKeyId\":\"AKIA...\",\"SecretAccessKey\":\"...\"}"'
```
这种双配置文件模式与真实 AWS 环境中设置 assume-role 链的方式完全一致。受感染的 agent 会看到一个看似休眠的凭证,并尝试使用它。
agent 会看到一个看似波动的 AWS 响应。而你看到的是这个:
```
🔑 AWS canary fired — agent-01
Token agent-prod-admin-2026-••••••••
Time 2026-03-14 04:07:33 UTC
IP 34.121.8.92 Location Council Bluffs, US
Network Amazon Technologies Inc (AS16509)
UA Boto3/1.34.46 md/Botocore#1.34.46 ua/2.0 os/linux#6.8.0...
⚠️ Likely AI agent Request originated from Amazon Technologies Inc
```
Boto3 的 user agent 会告诉你是由哪个 SDK 触发的。ASN 会告诉你它来自云端托管的 agent。**凭证本身就是传感器。**
## 安装
```
curl -fsSL https://snare.sh/install | sh
```
或者使用 Homebrew:
```
brew install peg/tap/snare
```
或者从 [发布页面](https://github.com/peg/snare/releases) 下载二进制文件。
要求 Linux 或 macOS 系统。无其他依赖项。
## 快速开始
```
snare arm --webhook https://discord.com/api/webhooks/YOUR/WEBHOOK
```
就是这样。Snare 会完成初始化,植入信号最强的 canary,触发一次测试警报以确认 webhook 正常工作,并告诉你哪些已处于警戒状态。
默认情况下,`snare arm` 使用 **precision 模式**:将植入 `awsproc`、`ssh`、`k8s`、`git` 和 `npm` canary。每一个都限定于植入的伪造目标,并具备自动化的真实客户端契约测试。
**在这台机器上运行 AI agent 吗?** Precision 模式在正常工作期间会保持安静,除非植入的伪造 profile、host、cluster、repository 或 package scope 被主动使用。使用 `--select` 可呼出交互式选择器,或使用 `--all` 来启用所有受支持的 canary 类型。
```
✓ initialized (device: dev-2146102a5849a7b3)
Planting canaries...
Precision mode: planting active-use canaries only (awsproc, ssh, k8s, git, npm)
✓ awsproc ~/.aws/config
✓ ssh ~/.ssh/config
✓ k8s ~/.kube/staging-deploy.yaml
✓ git ~/.gitconfig
✓ npm ~/.npmrc
✓ webhook test fired
🪤 5 canaries armed. This machine is protected.
Precision mode is safe for first run: alerts require active use of the fake
planted fake target. Passive file reads do not fire them.
Next checks:
snare status show event state; `never fired` is normal at first
snare scan verify planted files are present and unchanged
snare doctor confidence screen: config, API, ownership, and test health
snare repair re-sync registrations safely if doctor finds drift
snare prove --run --report safely trigger precision canaries and print a proof report
snare prove --format json --redact --output proof.json write a share-safe proof artifact
snare prove --pack mcp --run --report prove MCP canaries after `--all` or `plant --type mcp`
snare events view real hits when one arrives
```
在启用警戒后,`snare status` 通常会显示 `never fired`。这是正常的:这意味着 Snare 尚未记录到该 canary 的真实回调。当需要进行本地文件完整性检查时使用 `snare scan`,检查配置健康状况使用 `snare doctor`,而当你想安全地触发 precision canary 并生成首份成功报告时,请使用 `snare prove --run --report`。当你需要为团队成员或 issue 提供可安全共享的证明产物时,请添加 `--redact --output proof.json --format json`。
要启用所有 canary 类型(包括基于 dotenv 的类型,如 OpenAI、Anthropic 等):
```
snare arm --all --webhook https://discord.com/api/webhooks/YOUR/WEBHOOK
```
受支持的 webhook 目标:Discord、Slack、Telegram,或任何接受 JSON 的 endpoint。请将 webhook URL 视为机密——不要提交、截图或分享它们。
正在为团队或实验室评估 Snare 吗?请从 [企业评估指南](docs/enterprise-evaluation.md) 开始,然后按照 [webhook 集成文档](docs/integrations/generic-webhook.md) 将警报接入你的 SIEM。
## 命令
```
snare arm [--webhook ] # precision mode: plant awsproc, ssh, k8s, git, npm + test
snare arm --select # interactive picker: choose which canaries to arm
snare arm --all # plant all 15 supported canary types
snare disarm # remove all canaries (keep config)
snare disarm --purge # remove canaries + ~/.snare/ config
snare status # show active canaries + event state
snare repair # re-register active tokens + run a live test check
snare sync # alias for snare repair
snare prove [--type ] # guided precision triggers (awsproc/ssh/k8s/git/npm)
snare prove --pack mcp # guided MCP initialize proof for planted MCP canaries
snare prove --run --report # execute safe triggers and print a proof report
snare prove --pack all --run --report # prove precision + MCP canaries together
snare prove --format json # machine-readable proof report output
snare prove --redact --output proof.json --format json # share-safe proof artifact
snare events # fetch recent alert history from snare.sh
snare events --summary # ASN/UA distribution across all canaries
snare scan # check canary integrity on disk
snare test # fire a test alert to verify your webhook
snare doctor [--test] # confidence screen; add --test for live callback proof
snare config # show current config
snare config set webhook # update webhook URL
snare rotate # rotate device secret (if config.json was exposed)
snare serve [--dashboard-token ] # run self-hosted callback server
snare uninstall # remove everything including the binary
```
`snare arm` 是幂等的。再次运行它会跳过已经植入的 canary,并添加任何缺失的 canary。
如需更多控制:
```
snare plant --type aws # plant a single canary type
snare plant --type k8s --label prod-cluster
snare teardown --token # remove a specific canary
snare teardown --dry-run # preview what would be removed
```
## 信心循环(前 10 分钟)
在执行 `snare arm` 之后,预期的健康循环如下:
- `snare status` 显示活动的 canary 和事件状态。在有人主动使用植入的伪造凭证之前,显示 `never fired` 是正常的。
- `snare scan` 仅限本地完整性检查:文件是存在/被修改/丢失/孤立。它不会触发警报。
- `snare doctor` 是信心检测界面:检查配置、回调健康状况、本地 canary 文件、token 所有权、events API 的可读性以及 webhook 测试历史。
- `snare doctor --test` 会运行实时回调测试,并验证其在 events API 中是否可读。
- `snare test` 仅发送合成的回调测试;请检查你的 webhook 目的地以查看路由过来的警报。
- `snare events` 显示真实的命中历史;全新安装时输出为空是正常的。
- `snare repair`(或 `snare sync`)会在检测到偏差时,安全地重新注册活动的 token,并重新测试回调/事件的可读性。
- `snare prove` 会打印安全的 precision 触发命令,让你可以特意证明 `awsproc`、`ssh`、`k8s`、`git` 和 `npm` 的警报会正常触发。
- `snare prove --pack mcp` 会对植入的 `mcp` canary 打印一个安全的 MCP Streamable HTTP 初始化探测,且不会修改正在使用的 MCP 客户端配置。
- `snare prove --run --report` 会执行选定的验证触发器,通过 events API 确认回调,并打印一份简明的验证报告,其中包含清理命令、事件可见性、观测到的延迟以及明确的验证/限制说明。
- `snare prove --format json --redact --output proof.json` 会写入一个机器可读的产物,其中的设备 ID、token ID、标签、清理 token 以及绝对本地路径均已被脱敏。
重要的状态区别:
- `never fired` 表示 token 已注册/可读,且尚未发生真实的回调。
- `events unavailable` 表示该 token 的 API/认证/可读性失败;请运行 `snare doctor`,如有必要请运行 `snare repair`。
## Canary 类型
| 类型 | 位置 | 触发条件 | 等级 |
|------|----------|---------|------|
| `awsproc` | `~/.aws/config` | AWS SDK 通过 `credential_process` 解析凭证 —— 在任何 API 调用发出前触发 | Precision |
| `ssh` | `~/.ssh/config` | 通过 `ProxyCommand` 的 curl/wget 回调进行 SSH 连接 | Precision |
| `k8s` | `~/.kube/.yaml` | `kubectl` 使用静态伪造 bearer token 联系伪造的 API server | Precision |
| `git` | `~/.gitconfig` | 对伪造 host 的显式访问被重写至回调地址 | Precision |
| `npm` | `~/.npmrc` | 显式访问伪造 scope 下的 package | Precision |
| `aws` | `~/.aws/config` | 使用命名的 endpoint 重定向 profile 进行任何 AWS CLI/SDK 调用 | High |
| `gcp` | `~/.config/gcloud/sa-*.json` | 通过 `token_uri` 重定向进行 GCP 认证尝试 | High |
| `pypi-upload` | `~/.pypirc` 或无用的备份文件 | 显式上传至命名的内部 repository | High |
| `pypi` | `~/.config/pip/pip.conf` | `pip install` 查询伪造的额外索引 —— **在你自己安装时也会触发** | High-noisy |
| `openai` | `~/.env` | 通过 `OPENAI_BASE_URL` 进行的任何 OpenAI SDK 调用 | Medium |
| `anthropic` | `~/.env.local` | 通过 `ANTHROPIC_BASE_URL` 进行的任何 Anthropic SDK 调用 | Medium |
| `mcp` | `~/.cursor/mcp.json.bak` 或其他无用的、厂商相邻的备份文件 | MCP 客户端连接至伪造的 HTTP server | Medium |
| `huggingface` | `~/.env.hf` | 加载 dotenv 文件后通过 `HF_INFERENCE_ENDPOINT` 进行的推理调用 | Medium |
| `terraform` | `~/.terraformrc` | 使用伪造 namespace 下的 provider 执行 `terraform init` | Medium |
| `generic` | `~/.env.production` | 任何读取 `API_BASE_URL` 的 SDK | Medium |
**Precision** canary 通过现有的 SDK 和 OS 管道触发——在正常工作期间几乎为零误报,因为它们要求主动使用植入的伪造 profile、host 或 context。这是 `snare arm` 的默认行为。
**High** canary 会在凭证被任何人(人类攻击者、受感染的 agent、扫描程序)主动使用时触发。
**High-noisy** canary 极易触发,但在正常的开发者工作流中也可能被触发。`pypi` 适用于激进的监控,但不适合作为安静的默认选项。
**Medium** canary 为条件触发——攻击者必须同时遵循 SDK 的 base URL 覆盖配置。如果人类直接抓取原始密钥并直接调用真实 API,则不会触发这些 canary。
每种类型的支持和验证状态记录在 [检测契约](docs/detection-contracts.md) 中。`azure`、`docker`、`github` 和 `stripe` 已被弃用,因为它们以前的设计依赖于不受支持的客户端行为。已植入的现有实例仍然可见且可移除。
Snare 检测的是主动使用,而不是任意的文件读取。`snare scan` 可验证完整性,但单纯的文件打开操作不会产生警报;被动读取遥测数据需要驻留 OS 级别的传感器。
### awsproc
`awsproc` 使用 AWS 的 `credential_process` —— 这是一个在 SDK 解析凭证时、进行任何 API 调用之前运行的 shell 命令。
当受感染的 agent 运行 `aws s3 ls --profile prod-admin` 时的时间线:
```
T+0.00s aws s3 ls --profile prod-admin
T+0.01s AWS SDK begins credential resolution
T+0.01s credential_process shell command executes
T+0.01s curl fires to snare.sh -> alert in your webhook
T+0.02s SDK receives fake JSON credentials
T+0.03s SDK attempts s3.ListBuckets() -> fails (fake creds)
T+0.03s Agent: "AWS error, credentials may be invalid"
```
**在 agent 意识到凭证无效之前,警报就已经到达了。** 像 Canarytokens 这样基于 CloudTrail 的工具能看到 API 调用;而 awsproc 在该调用存在之前就已经触发了。
这种双配置文件模式看起来就像真实的 assume-role 设置:
```
# ~/.aws/config
[profile prod-admin]
role_arn = arn:aws:iam::123456789012:role/OrganizationAccountAccessRole
source_profile = prod-admin-source
[profile prod-admin-source]
credential_process = sh -c 'curl -sf https://snare.sh/c/{token} >/dev/null 2>&1; echo "{\"Version\":1,\"AccessKeyId\":\"AKIA...\",\"SecretAccessKey\":\"...\"}"'
```
Canarytokens 做不到这一点。它们的 AWS canary 会创建一个真实的 IAM 用户并监控 CloudTrail,这会增加数分钟的延迟,并且需要外部 AWS 基础设施。`awsproc` 在本地运行,这正是其核心所在。
在气隙隔离或设有防火墙的机器上:即使回调无法到达 snare.sh,shell 命令仍会返回伪造的凭证 JSON。agent 会获得看似有效的凭证并继续执行。如果它随后尝试从你的网络外部使用这些凭证,则会分别触发警报。
这就是默认植入 `awsproc`、`ssh` 和 `k8s` 的原因——它们仅在凭证被主动使用时触发,使其成为运行 AI agent 的机器的最佳选择。
### mcp
在可被发现但不会被自动加载的位置植入伪造的 MCP server 配置。扫描 MCP server 的受感染 agent 会找到它并尝试连接。其 HTTP 传输 URL 指向 snare.sh。它不会干扰你正在使用的 Claude/Cursor/VS Code 配置。
要在不将其接入活动客户端的情况下特意验证 MCP canary,请运行:
```
snare prove --pack mcp --run --report
```
这会向植入的伪造 server URL 发送一个 Streamable HTTP `initialize` 请求,并通过 events API 验证回调。
## 警报
每个警报包含:
- 哪个 canary 被触发以及它位于哪台机器上
- 时间戳 (UTC)
- IP、城市、国家
- ASN(托管组织 —— `Amazon Technologies Inc` = 云端 agent,`Hetzner` = VPS 等)
- User agent(识别确切的 SDK:`Boto3/1.34.46`、`kubectl/v1.35.1` 等)
- 当请求来自云基础设施时的“可能是 AI agent”标志
配置 webhook 签名后,警报会使用 `X-Snare-Signature` (HMAC-SHA256) 进行签名,以便接收方验证发送者。
有关 SIEM 集成模式,请参阅 [通用 webhook](docs/integrations/generic-webhook.md)、[Splunk](docs/integrations/splunk.md)、[Datadog](docs/integrations/datadog.md) 和 [Microsoft Sentinel](docs/integrations/sentinel.md)。
## 隐私
Snare 的回调处理程序从不读取请求体。当 canary 触发时,worker 会在消耗请求体之前返回响应。Canary 回调在其请求体中可能携带真实的凭证或 prompt —— 应用程序代码不会对其进行检查。在托管模式下,Cloudflare 仍然负责终止网络请求;如果你需要完全的网络层控制,请自行托管。
每个警报仅存储:token ID、时间戳、IP、user agent、方法、路径、国家、ASN。
伪造的凭证内容本地保存在 `~/.snare/manifest.json` (0600) 中,永远不会发送到 snare.sh。Token ID 是 128 位随机十六进制字符串。其他 snare.sh 用户无法查询你的事件。
## 副作用
## 对比 canarytokens.org
[Canarytokens](https://canarytokens.org) 很好。Snare 是专门为 AI agent 构建的:
| | Canarytokens | Snare |
|---|---|---|
| 设置 | 手动,一次一个 token | `are arm` 涵盖 15 种受支持的凭证和工具使用类型 |
| AWS 检测 | CloudTrail(数分钟延迟) | 直接 SDK 回调(亚秒级) |
| 凭证类型 | AWS 及其他几种 | AWS、GCP、SSH、k8s、git、terraform、OpenAI、Anthropic、npm、PyPI、MCP 等 |
| AI agent 上下文 | 无 | 云端 ASN 检测、SDK user-agent 解析、`credential_process` 时序 |
| 触发条件 | 读取或使用(因情况而异) | 仅使用 |
## 与 Rampart 的关系
[Rampart](https://rampart.sh) 负责执行策略,并阻止 agent 进行不该进行的调用。Snare 则负责检测 agent 何时已被攻陷。它们解决的是问题的不同部分,各自独立工作也能运行良好。
## 自托管
当你需要自定义回调域名、完全的网络层控制、私人数据保留或 SIEM 中继行为时,请使用自托管。该仓库包含 Cloudflare Worker 源代码 (`worker/`) 以及带有 Docker Compose 的独立 `snare serve` 路径。
快速独立 server:
```
SNARE_DASHBOARD_TOKEN="$(openssl rand -hex 32)" \
SNARE_ENROLLMENT_TOKEN="$(openssl rand -hex 32)" \
snare serve --port 8080 --db /var/lib/snare/snare.db
```
快速 Docker Compose 路径:
```
{
echo "SNARE_DASHBOARD_TOKEN=$(openssl rand -hex 32)"
echo "SNARE_ENROLLMENT_TOKEN=$(openssl rand -hex 32)"
echo "SNARE_PORT=8080"
} > .env
docker compose up -d
curl -fsS http://localhost:8080/health
```
仅在你控制的反向代理后公开 `snare serve`。默认情况下,服务器会忽略 `X-Forwarded-For` 和 `X-Real-IP`;仅在允许提供这些 header 的代理网络中设置 `--trusted-proxy `。
有关反向代理、备份、升级、Cloudflare Worker 和客户端 `callback_base` 步骤,请参阅 [自托管指南](docs/self-hosting.md)。
## 验证发布版本
发布校验和使用 [Sigstore/cosign](https://docs.sigstore.dev/) 通过 GitHub Actions 的无密钥 OIDC 签名进行签署。要验证下载的发布版本:
```
cosign verify-blob --bundle checksums.txt.bundle checksums.txt
```
这可以确认校验和文件是由官方 GitHub Actions 发布工作流生成的,并且未被篡改。
## 许可证
Apache 2.0 —— 请参阅 [LICENSE](./LICENSE)。
标签:AWS, BOF, Cutter, DPI, EVTX分析, StruQ, 凭据监控, 安全助手, 日志审计, 欺骗防御, 蜜罐, 证书利用