来自 Knostic 的 OpenAnt 是首个基于 LLM 的开源漏洞发现与修复产品(现在称为 harness),帮助防御者主动发现经过验证的安全缺陷,同时最大限度地减少误报和漏报。阶段 1 检测。阶段 2 攻击。存活下来的才是真实的。
请记住,这最初是一个研究项目,随着我们开发新功能,我们经常将其作为 beta 版本发布。我们欢迎贡献。
您可以在 arXiv 上找到我们关于构建 OpenAnt 的研究论文:OpenAnt: LLM-Powered Vulnerability Discovery Through Code Decomposition, Adversarial Verification, and Dynamic Testing,作者为 Nahum Korda 和 Gadi Evron。
当我们首次发布 OpenAnt 时,这是 readme 中的一个相关问题,因为许多其他 harness 已经发布。我们仍然希望,随着 AI 发现的漏洞激增,OpenAnt 能帮助开源维护者领先于攻击者,让他们可以自行使用它。或者免费提交他们的仓库进行扫描。
还有一个事实是,Knostic 的重点是保护 agent 和编码助手,而不是漏洞研究或应用安全,而且我们喜欢开源,因此我们决定在 Apache 2 许可证下发布 OpenAnt。 此外,您可能听说过 OpenAI 的 Aardvark(现为 Codex Security)和 Anthropic 的 Claude Code Security,我们完全没有与它们竞争的意图。
有关技术细节、限制和 token 成本,请查看此博客文章: https://knostic.ai/blog/openant
要提交您的仓库进行扫描: https://knostic.ai/blog/oss-scan
维护者和研究:Gadi Evron
原始研究、构思和原始原型:Nahum Korda。 原始产品化:Alex Raihelgaus、Daniel Geyshis。
感谢:Michal Kamensky、Imri Goldberg、Daniel Cuthbert、Josh Grossman 和 Avi Douglen。
如果您喜欢我们的工作,请了解我们在 Knostic 所做的工作,以保护您的 agent 和编码助手,防止它们删除您的硬盘和代码,并控制相关的供应链风险,如 MCP 服务器、扩展和技能。
构建 CLI 二进制文件(需要 Go 1.25+):
cd apps/openant-cli && make build
这会编译 Go 源代码并将二进制文件输出到 apps/openant-cli/bin/openant。
将其符号链接到你的 PATH 中,这样你就可以在任何地方运行 openant:
ln -sf "$(pwd)/apps/openant-cli/bin/openant" /usr/local/bin/openant
注意:请从仓库根目录运行此命令,以便 $(pwd) 解析为正确的绝对路径。
OpenAnt 通过可配置的(provider, model)对来路由每个流水线阶段。最快的方式是使用交互式向导:
openant setup llm
你为配置命名(例如 my-llm),为每个流水线阶段选择一个提供商(可使用下方任意内置适配器),为每个提供商输入一次其 API 密钥(Bedrock 改用 AWS 凭证链——将密钥留空),向导会在写入 ~/.config/openant/config.json 之前,用 1-token 请求探测每个唯一的提供商+模型组合。使用 --llm-config 对其运行扫描:
openant scan /path/to/repo --llm-config my-llm
向导默认值反映了项目按阶段的推荐配置(检测 / 验证 / 可达性审查使用更强的推理模型;上下文、报告和测试生成使用更轻量的模型)——可随意覆盖任何答案。
| 提供商类型 | API 密钥来源 | 备注 |
|---|---|---|
anthropic | console.anthropic.com | 参考适配器。不包含在 Claude Pro / Max 订阅中——需单独计费。 |
openai | platform.openai.com | 不包含在 ChatGPT / Codex 订阅中——需单独计费。 |
google | aistudio.google.com | 不包含在 Gemini Advanced 中——需单独计费。 |
bedrock | —(AWS 凭证链) | AWS Bedrock 上的 Claude。无 api_key:凭证来自 AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY 环境变量或 ~/.aws 配置文件,区域来自 AWS_REGION。模型 ID 为推理配置文件(us.anthropic.claude-sonnet-4-6、global.anthropic.claude-haiku-4-5-20251001-v1:0 等)——在 Bedrock 控制台的“Model access”下启用它们,并使用 aws bedrock list-inference-profiles 列出它们。由 openant setup llm 提供(将 API 密钥留空——AWS 凭证链,跳过探测)——完整指南:utilities/llm/providers/BEDROCK.md。 |
openrouter | openrouter.ai | 通过一个密钥和一个预付费余额访问众多提供商的网关(也会读取 OPENROUTER_API_KEY)。模型 ID 为 vendor/model 形式的标识(anthropic/claude-sonnet-4.6、openai/gpt-4o-mini 等)——可在 openrouter.ai/models 浏览它们。由 openant setup llm 提供(将基础 URL 留空以使用 OpenRouter 默认值)——完整指南:utilities/llm/providers/OPENROUTER.md。 |
ollama | —(本地服务器) | 通过 Ollama 使用本地模型。无 api_key:将其留空(会自动发送占位符);基础 URL 默认为 http://localhost:11434/v1。必须先拉取模型(ollama pull <model>);模型 ID 与 ollama list 显示的完全一致。本地推理免费——$0 成本报告。由 openant setup llm 提供——完整指南:utilities/llm/providers/OLLAMA.md。 |
它们都支持工具调用,因此其中任何一个都可以驱动使用智能体工具使用循环的 enhance 和 verify 阶段。对于 Ollama,请为这些阶段选择支持工具的模型——非常小的本地模型可能无法可靠地处理工具调用。
如果你只想要当前的按阶段 Claude 默认配置,而不需要其他任何东西,请跳过向导:
openant set-api-key sk-ant-...
openant scan /path/to/repo
这使用内置的 openant-default 配置(已编译进二进制文件,无需 config.json)——检测阶段使用 Claude Opus 4.6,其余阶段使用 Sonnet 4。
向导会为你写入 ~/.config/openant/config.json,但你也可以直接编辑它。每个 llm-config 都必须列出全部七个流水线阶段:
{
"$schema_version": 2,
"default_llm": "my-llm",
"llm_providers": {
"anthropic": {"type": "anthropic", "api_key": "sk-ant-..."},
"openai": {"type": "openai", "api_key": "sk-proj-..."},
"google": {"type": "google", "api_key": "AIza...", "request_timeout": 600}
},
"llm_configs": {
"my-llm": {
"app_context": {"provider": "openai", "model": "gpt-4o-mini"},
"llm_reach": {"provider": "anthropic", "model": "claude-opus-4-6"},
"enhance": {"provider": "openai", "model": "gpt-4o-mini"},
"analyze": {"provider": "anthropic", "model": "claude-opus-4-6"},
"verify": {"provider": "anthropic", "model": "claude-opus-4-6"},
"dynamic_test": {"provider": "google", "model": "gemini-2.0-flash"},
"report": {"provider": "google", "model": "gemini-2.0-flash"}
}
}
}
llm_providers[name].request_timeout(秒,正整数或 null)设置适配器的每请求 HTTP 超时——由 google 提供程序类型使用(唯一一个其 SDK 默认无超时的类型);其他类型如果在启动时设置了该值会发出醒目警告。
提供程序接受自定义 base_url,用于 OpenAI 兼容 / Anthropic 兼容代理(vLLM、Bedrock、内部网关);OpenRouter 有自己的一等 openrouter 提供程序类型。openant-default 配置(所有阶段均使用 Claude)是内置的,无论文件内容如何都始终可用。
OpenAnt 的适配器层是一个小型 Python 配方——一个实现 LLMAdapter Protocol 的 Python 文件、一个用于契约测试框架的工厂,再加上一个注册表条目——仅此就足以从手工编写的配置运行该适配器。若还要让 openant setup llm 向导提供它并通过其保存前探测,请在 apps/openant-cli/cmd/setup.go 中添加几个 Go 触点(受支持的提供程序列表、一个探测 case、各阶段的默认模型映射)以及一个 Go 探测函数。一旦接入,12 个契约测试会自动针对你的适配器运行。
OpenAnt 的解析、增强、分析和报告代码为 Python 3.11+。Go CLI 按以下顺序选择解释器:
OPENANT_PYTHON 环境变量(将其设置为固定特定解释器——例如 OPENANT_PYTHON=python3.11)。~/.openant/venv/ 的托管 venv(首次使用时自动创建)。CLI 在 Linux/macOS 上使用 bin/python,在 Windows 上使用 Scripts\python.exe。PATH 上的 python3 / python。如果以上均未产生 Python 3.11+,命令会退出并报错,指向 python.org。要重建过期的托管 venv(例如升级 Python 后),请删除 ~/.openant/venv/ 并重新运行任意 openant 命令。
OpenAnt 创建两个目录:
~/.config/openant/ — CLI 配置(config.json)。存储你的 API 密钥、活动项目和偏好设置。文件权限限制为 0600。~/.openant/ — 项目数据。每个已初始化的项目在 ~/.openant/projects/<org>/<repo>/ 下获得一个工作区,其中包含 project.json 和一个 scans/ 目录,内有每次提交的输出。将 OpenAnt 指向一个仓库。-l 标志(语言)是必需的——使用 go 或 python。
# Remote — clones the repo
openant init <repo-url> -l go
# Remote — pin to a specific commit
openant init <repo-url> -l go --commit <sha>
# Local — references the directory in-place
openant init <path-to-repo> -l go --name <org/repo>
这会创建一个项目工作区并将其设为活动项目。之后所有命令都会自动作用于活动项目——无需提供路径参数。
每个步骤都会从项目的扫描目录中获取上一步骤的输出:
openant parse
openant enhance
openant analyze
openant verify
openant build-output
openant report -f summary
或者用一条命令运行完整流水线:
openant scan --verify
openant scan —— 以及逐步运行时每个步骤动词(analyze、verify……)——
在发现漏洞时退出码为 1 —— 这是工具在正常工作,而不是失败。契约如下:
| 退出码 | 含义 |
|---|---|
| 0 | 扫描干净 —— 未发现漏洞 |
| 1 | 发现漏洞(一次成功的运行) |
| 2 | 错误 —— 扫描本身失败(检查 stdout 上 JSON 信封中的 errors) |
通用 CI 步骤和进程监控器会将任何非零退出码视为失败,这会把一次正常的发现漏洞运行错误分类。应基于该契约进行门控,而不是解析 stdout: