cdbkk/vuln-monkey

GitHub: cdbkk/vuln-monkey

vuln-monkey 是一款利用 LLM 对 API 端点进行安全模糊测试的工具,通过自动生成攻击 payload 并分析响应来发现接口逻辑缺陷。

Stars: 14 | Forks: 1

vuln-monkey — AI-powered API security fuzzer

npm license node >=20 security hardened

vuln-monkey terminal demo

vuln-monkey 使用 LLM 来分析 API endpoint,生成攻击 payload,发送它们,并对响应进行分类。它会生成终端摘要以及 Markdown 和 JSON 报告。**v0.3.0** 版本增强了该 pipeline 的安全性和正确性。 ## 快速开始 ``` # one-shot npx vuln-monkey "curl -X POST https://api.example.com/users -H 'Authorization: Bearer tok_xxx' -d '{\"name\":\"test\"}'" # 或全局安装 npm install -g vuln-monkey vuln-monkey "curl -X GET https://api.example.com/users/42 -H 'Authorization: Bearer tok_xxx'" ``` 默认模型是 `claude-cli`(你本地的 Claude Code CLI)。报告会存放在 `./reports/` 目录中。 使用 OpenAPI 替代 curl: ``` vuln-monkey --spec https://api.example.com/openapi.json \ -H "Authorization: Bearer $API_TOKEN" \ --credential-origin https://api.example.com \ --model openai --concurrency 10 ``` ## 提供者 使用 `--model` 选择后端(默认:`claude-cli`)。 ### CLI 后端(进程内无需 API key) | 模型 | 要求 | |:------|:---------| | `claude-cli` *(默认)* | `PATH` 中的 `claude` CLI | | `gemini-cli` | `PATH` 中的 `gemini` CLI | | `codex-cli` | `PATH` 中的 `codex` CLI | ``` vuln-monkey --model gemini-cli "curl https://api.example.com/users" vuln-monkey --model codex-cli "curl https://api.example.com/users" ``` CLI prompt 会通过 stdin 从一个新创建的临时目录中发送。Claude 会收到一个空的工具列表,Gemini 会收到一个全部拒绝(deny-all)的工具策略,而 Codex 会保持 `--full-auto` 模式,但所有工具功能都会在一个只读的临时 sandbox 中被禁用。 ### API 后端 | 模型 | 提供者 | 环境变量 | |:------|:---------|:----| | `claude` | Anthropic | `ANTHROPIC_API_KEY` | | `gemini` | Google Generative AI | `GEMINI_API_KEY` | | `openai` | 兼容 OpenAI 的 HTTP API | `OPENAI_API_KEY`(可选 `OPENAI_BASE_URL` / `OPENAI_API_BASE`) | ``` ANTHROPIC_API_KEY=sk-... vuln-monkey --model claude "curl https://api.example.com/users" OPENAI_API_KEY=sk-... vuln-monkey --model openai "curl https://api.example.com/users" GEMINI_API_KEY=... vuln-monkey --model gemini "curl https://api.example.com/users" ``` ### 本地 / 自托管 | 模型 | 默认 base URL | 说明 | |:------|:-----------------|:------| | `ollama` | `http://localhost:11434/v1` | 默认模型名称为 `llama3.1` | | `local` | `http://localhost:1234/v1` | LM Studio, vLLM, llama.cpp server 等 | 两者都使用兼容 OpenAI 的客户端。如果 `OPENAI_BASE_URL` 或 `OPENAI_API_BASE` 指向**本地**主机(`localhost`、`127.*`、`::1`、……),则会使用该 URL 而不是默认 URL。 ``` vuln-monkey --model ollama "curl https://api.example.com/users" OPENAI_BASE_URL=http://localhost:1234/v1 vuln-monkey --model local "curl https://api.example.com/users" OPENAI_MODEL=qwen3:8b vuln-monkey --model ollama "curl https://api.example.com/users" ``` 有效的 `--model` 值:`claude-cli`、`gemini-cli`、`codex-cli`、`claude`、`gemini`、`openai`、`ollama`、`local`。 ## 输入 **Curl 命令**(位置参数)—— 解析为 method、URL、headers、body 和 auth: ``` vuln-monkey "curl -X POST https://api.example.com/login -d '{\"user\":\"a\",\"password\":\"b\"}'" ``` **OpenAPI / Swagger JSON** —— 获取远程 JSON spec 并对提取的每个 endpoint 进行模糊测试: ``` vuln-monkey --spec https://api.example.com/openapi.json \ -H "Authorization: Bearer $API_TOKEN" \ --credential-origin https://api.example.com ``` 你必须传递一个 curl 字符串**或者** `--spec `,不能同时传递两者。可以重复使用 `-H` 为 OpenAPI 操作提供凭证或 headers,并通过 `--credential-origin` 显式允许每个接收方;spec 无法将这些凭证重定向到另一台服务器。除非你显式传递 `--allow-private`,否则私有和本地地址会被阻止。 ### CLI 选项 | 选项 | 说明 | 默认值 | |:-------|:------------|:--------| | `[curl]` | 要进行模糊测试的 Curl 命令 | — | | `--spec ` | OpenAPI/Swagger JSON spec URL | — | | `--model ` | LLM 后端(见上文) | `claude-cli` | | `--output ` | 报告输出目录 | `./reports` | | `--concurrency ` | 并行请求工作线程,最大为 100 | `5` | | `--timeout ` | 单次请求超时时间 | `10000` | | `-H, --header
` | 应用于每个 endpoint 的 header;可重复使用 | — | | `--credential-origin ` | 允许接收 `-H` 凭证的 origin;可重复使用 | — | | `--allow-private` | 允许私有/本地的 spec 和目标地址 | off | | `--fail-on ` | 发现达到或超过指定严重级别的问题时以非零状态退出 | `none` | | `--dry-run` | 仅生成 payload;不发送请求 | off | ``` vuln-monkey --dry-run "curl https://api.example.com/users" vuln-monkey --model ollama --timeout 20000 --output ./out "curl -X POST https://api.example.com/login -d '{}'" ``` ## 工作原理 1. **解析** —— curl 或 OpenAPI → endpoint 列表(method、URL、headers、body、auth)。 2. **分析** —— LLM 为每个 endpoint 建议潜在的漏洞类型。 3. **生成 payload** —— LLM 构建攻击请求;如果生成失败或未返回任何内容,内置的回退机制会合成常见的探测请求(例如 auth-bypass / mass-assignment 风格的变体)。 4. **执行** —— 同源 payload 在 DNS pinning、可配置的并发量以及端到端 DNS + HTTP 超时的控制下发送(`--dry-run` 会在此步骤之前停止)。 5. **报告** —— 具有证据支持的非通过(non-pass)结果将成为发现(findings);被阻止或失败的请求将作为未验证项单独报告。 ### 输出 - **终端** —— 实时的单条 payload 行输出及摘要(目标、模型、扫描的 endpoint、发送的 payload、发现、风险分数/评级、持续时间)。 - **Markdown** —— `./reports/…​.md`(或 `--output`)。 - **JSON** —— 用于 CI / 自动化的 `./reports/…​.json`。 风险评级为 `Fail`、`Needs Attention` 或 `Acceptable`(分数 0–100)其中之一。 对于 CI,请使用 `--fail-on high`(或 `critical`、`medium` 或 `low`)。带有未验证 payload 的不完整扫描也会以非零状态退出。 ## 安全与防护 这是一个**安全测试工具**。仅对你获得授权测试的系统运行此工具。 v0.3.0 专注于增强安全性,而不是增加新的攻击面: - **SSRF 防护**,包含 DNS pinning、全局地址验证以及同源 payload 强制执行 - 通过 `--allow-private` 实现**显式的私有网络同意(opt-in)** - 在调用模型和写入报告前进行**密钥脱敏** - 针对 target、OpenAPI spec 以及兼容 OpenAI 的提供者的**响应大小限制** - **LLM 输出验证**以及针对无 auth 探测的显式标记 - **隔离的 coding-CLI 执行**,使用 stdin prompt 和临时工作目录 此外:解析为敏感系统目录(`/etc`、`/proc`、……)的报告路径会被拒绝;终端输出会清理控制字符。 ## 限制 - 结果由 **LLM 驱动** —— 建议和 payload 会因模型而异,可能会遗漏问题或产生无用的噪音。 - OpenAPI 输入当前**仅支持 JSON**,不支持 YAML。 - 查询字符串 API key 方案需要凭证已经存在于 spec 中;`-H` 用于提供 header/cookie 凭证。 - 你需要一个可用的 **CLI 后端、API key 或本地兼容 OpenAI 的服务器**。 - 在将分类和发现视为确认的漏洞之前,需要**人工筛查**。 - 密钥清理涵盖了常见的凭证字段和模式,但任意业务数据可能仍然敏感;请妥善保护生成的报告。 - 回退 payload 是通用的;它们是一个安全兜底措施,不能完全替代优秀的模型输出。 ## 环境要求 - Node.js **≥ 20** - 以下之一:Claude / Gemini / Codex CLI,或 Claude / Gemini / 兼容 OpenAI 的 API key,或本地模型服务器(Ollama, LM Studio, ……) ## 贡献 欢迎在 [github.com/cdbkk/vuln-monkey](https://github.com/cdbkk/vuln-monkey) 提交 Issue 和 PR。 ``` git clone https://github.com/cdbkk/vuln-monkey.git cd vuln-monkey && npm install npm test npm run dev -- --help ``` ## 许可证 [MIT](LICENSE)
标签:AI风险缓解, API安全, CISA项目, DLL 劫持, GNU通用公共许可证, JSON输出, LNA, MITM代理, Node.js, 大语言模型, 安全测试, 攻击性安全, 暗色界面, 自动化攻击