一、导读
静态扫描器(SAST)的老毛病是「报得多、准得少」:规则命中一堆,安全团队要花几周逐条证伪,真正能利用的那几条反而被淹没。Codex Security 是 OpenAI 把 2025 年 10 月私测的 Aardvark 产品化之后,于 2026 年 7 月以 Apache-2.0 开源的应用安全智能体——它不靠规则匹配,而是先读整个仓库生成可编辑的威胁模型,再顺着「谁控制输入 → 到哪个敏感操作 → 期望的控制点是否真的咬死」这条链找漏洞,最后在沙箱里压测验证,验证不了的不往外报。
本文拆解它的三层架构(宿主、21 个技能的插件层、27 个工具的 MCP 服务)、密封扫描契约如何让每条结论都带 SHA-256 指纹与可复现证据、五套评测框架里唯一公开的 SastBench 口径,以及一个必须正视的现实:开源的是应用层,模型层仍在 OpenAI 手里——默认 gpt-5.6-sol 配 xhigh 推理强度,一次失败扫描就能烧掉 13 美元。
二、项目速览
| 项目 | 内容 |
|---|---|
| 仓库 | openai/codex-security |
| 作者 / 归属 | OpenAI |
| 主语言 | TypeScript(含 Rust 原生插件、Python 工作台脚本) |
| Star 总数 | 12,348 |
| 当日涨星 | 663(2026-11-12 日榜第 5) |
| License | Apache-2.0 |
| 首次发布 | 仓库创建于 2026-07-13;产品线可追溯到 2025-10 的 Aardvark 私测,2026-03-06 更名研究预览 |
| 最新版本 | npm-v0.10.0(2026-11-12 02:18 UTC) |
| 代码规模 | 1,755 个文件;插件层 21 个 SKILL.md、27 个 MCP 工具 |
| 运行门槛 | Node.js 22.13+ / 24.x / 26.x;Python 3.10+(3.10 需 tomli) |
数据来源:GitHub API
/repos/openai/codex-security、/releases、/git/trees?recursive=1,以及 GitHub Trending 日榜,获取日期 2026-11-12。
三、为什么是它:从「规则报警」到「先建模再验证」
传统 SAST 的检测单元是「模式」:eval($_GET['x']) 命中注入规则,os.path.join(base, name) 命中路径穿越规则。这种做法扫描快、成本近乎为零,但把判定责任全部推给了人。安全团队拿到几百条告警,得逐条读上下文、判断可达性、确认控制点,最后往往得出「八成是误报」的结论。告警疲劳的本质,是「检测成本」与「判定成本」被割裂了。
Codex Security 的定位是把判定也交给模型,并且给判定过程留下可审计的痕迹。官方把它称作「应用安全智能体」而非扫描器,工作流分三步:先分析仓库结构生成可编辑的威胁模型,标注系统做什么、哪里最暴露;再基于这份上下文找漏洞并按真实世界影响分级;最后把可疑项放进沙箱压测。
据 OpenAI 官方博客与多家媒体报道,研究预览期 30 天内它扫描了超过 120 万次提交,产出 792 个严重(critical)与 10,561 个高危(high)发现,严重级发现出现在不到 0.1% 的提交里;同一批仓库反复扫描,误报率下降超过 50%。命中项目包括 OpenSSH、GnuTLS、GOGS、Thorium、libssh、PHP、Chromium,其中 14 个已获 CVE 编号(GnuPG 的 CVE-2026-24881/24882、GnuTLS 的 CVE-2025-32988/32989、GOGS 的 CVE-2025-64175/CVE-2026-25242)。
为什么是今天涨星:0.10.0 在 11 月 12 日 02:18 UTC 发布,同日登上日榜。这个版本补的正是社区抱怨最多的三处——补丁被阻断时给出明确原因、被中断的 Standard 扫描可续跑、批量扫描可共享一份预算。涨星不是营销驱动的,是「上次骂过的坑被填了」驱动的。
需要提前说清的边界:这次开源的是应用层(CLI、SDK、插件、技能、工作台脚本),不是模型层。推理仍调用 OpenAI 或其他兼容供应商的模型。所以它不是「免费的安全工具」,而是「把一套昂贵的模型编排逻辑公开出来,让你自己决定花多少钱」。
四、架构原理
4.1 整体架构:三个宿主、一层技能、一个密封契约
它不是一个大程序,而是同一套扫描逻辑的三个包装:Codex 插件、终端 CLI、CI 用的 GitHub Action。三者共享同一个技能目录与同一份扫描契约。
┌───────────────────────────────────────────────────────────┐
│ 宿主层(同一套逻辑的三个入口) │
│ Codex 插件(交互式) │ cs CLI / SDK(终端) │ GitHub Action(CI)│
└──────────┬──────────────────┬──────────────────┬──────────┘
▼ ▼ ▼
┌───────────────────────────────────────────────────────────┐
│ 技能层 plugins/codex-security/skills/(21 个 SKILL.md) │
│ 扫描:security-scan / security-diff-scan / deep-security-scan│
│ 判定:triage-finding / validation / attack-path-analysis │
│ 修复:fix-finding / verify-fix / assess-patch-risk │
│ 治理:define-security-policy / threat-model / check-skills │
└───────────────────────────┬───────────────────────────────┘
│ MCP (stdio)
▼
┌───────────────────────────────────────────────────────────┐
│ MCP 服务层 mcp-app/server.ts(27 个 codex_security_* 工具)│
│ setup / standard_scan / deep_scan / scan_context / │
│ scan_draft / scan_progress / scan_results / scan_usage │
└───────────────────────────┬───────────────────────────────┘
│ 写入
▼
┌───────────────────────────────────────────────────────────┐
│ 密封产物层 scan_dir/ │
│ scan-manifest.json(不可变收据 + 每文件 SHA-256) │
│ findings.json(语义化发现记录) │
│ report.md(由上面两份确定性投影而来) │
│ artifacts/01_context … 05_findings(分阶段证据) │
└───────────────────────────────────────────────────────────┘
这个分层是权限边界,不是美学选择。技能层是「给模型看的指令」,MCP 服务层是「唯一能改状态的通道」,密封产物层是「给审计和下游工具看的事实」。三者分开后,模型即使被提示注入操纵,也只能在技能层说错话,改不了已密封的 scan-manifest.json。
4.2 分层拆解
宿主层负责三件只有宿主能做的事:认证(cs login,或 CI 里直接用 OPENAI_API_KEY)、扫描目录生命周期、把结果投影成可读的 report.md。GitHub Action 额外处理沙箱启动检查(Ubuntu 24.04 上自动装 bubblewrap 与 apparmor-profiles)与 SARIF 上传。
技能层 + MCP 服务层是这套系统真正的「大脑与手脚」。21 个 SKILL.md 按「任务」而非「阶段」切分,frontmatter 只有 name 与 description 两个必需字段,description 明确写「什么时候不该用」——triage-finding 就直说「不要用于发现、重复判定、运行时验证或修复」。27 个 codex_security_* 工具覆盖 setup、standard_scan/deep_scan、scan_context(续跑取回身份与令牌)、scan_draft(写候选与覆盖情况)、scan_progress/scan_results/scan_usage,以及 findings、triage、finding_remediation_* 一整条修复状态机。.mcp.json 里 tool_timeout_sec 设成 349,200 秒(97 小时)——这本身就是设计声明:深度扫描可能跑很久,宿主不能因超时把它掐死。
密封产物层是审计能力的落点。scan-manifest.json 记录扫描 ID、目标、范围、终态、密封时间与 scan.artifacts 里每个文件的 SHA-256。契约写明:manifest 自己不被哈希,适配器读密封文件后单独写报告或导出,不碰原件。终态只有四种——completed、failed、canceled、interrupted,只有 completed 支持「已完成扫描」的结论;其余三种必须保留已有发现与评审状态,并把「没有发现」视为不确定而非清白。
4.3 核心机制一:威胁模型先行,让严重级有依据
多数扫描器给严重级靠「规则自带一个分数」,Codex Security 反过来:先建威胁模型,再按模型算严重级。
references/core-scan.md 定义主流程:解析目标与范围 → 读 SECURITY.md 继承策略 → 用 threat-model.md 映射架构与安全边界 → 把可疑问题按「攻击者 / 受保护资产 / 入口 / 期望控制 / 敏感操作 / 源码锚点」分组 → 并行派给独立调查员 → 每个候选对着源码验证一次 → 组装 scope、threatModel、findings、reviewState。
严重级默认规则在 default-severity-rubric.md,逻辑是三条件同时成立:Critical 要求未认证的互联网攻击者能利用、跨越重要安全边界后能拿到受保护数据或代码执行、且有已演示的利用或强源码验证支撑完整路径;High 要求较低信任度角色能触达、跨越边界后获得实质性新能力、且能指出从现有权限到新能力的现实路径;Medium / Low / Informational 按影响范围与敏感度逐级收敛。
规则里有两句话精确指出了 LLM 安全工具最常犯的错:「缺失证据本身不能证明更广的攻击不可能,不要因为没演示利用就降级」,以及「不要把 Low 当成『不确定但可能很严重』的替代品」。
4.4 核心机制二:密封契约与发现身份
一条安全发现如果不可复现、不可去重,工程上就是负资产。这个仓库用「发现身份」解决。
每条发现带三个稳定字段:ruleId(漏洞家族,格式 <主类别>.<稳定控制家族>,如 path-traversal.archive-extraction)、identity.anchor(语义化根控制锚点)、identity.instance(可独立攻击的同级实例)。契约禁止把行号写进 anchor——行号会随重构漂移。最终化时派生出 fingerprints.primary(目标 ID + 规则 ID + 锚点 + 实例的哈希)、findingId、occurrenceId。
契约还给了一句关键免责:「指纹匹配是协调信号,不是两个发现等价的证明;模糊匹配按未解决处理。」 这把「自动去重」从「我说它们一样」降级成「我提示它们可能一样,人来定」。在漏洞管理场景里这个保守姿态是对的——把两个不同漏洞误合并成一个,比留下两条重复记录危险得多。
report.md 是上述两份 JSON 的确定性投影,同样的 JSON 一定投影出同样的 Markdown。仓库样例 examples/completed-scan/report.md 是一条 CWE-22 / src/extract.py:41-44 的发现,带 Summary、Validation(静态源码复核)、Dataflow(归档提供条目名 → 提取器用它选写入文件)、Reachability(调用方需能提供归档、服务账号需有目标写权限)、Severity(High)、Remediation(归一化路径、拒绝逃逸条目,并附测试断言:提取 ../escape.txt 必须失败且不写出根目录)。
4.5 核心机制三:深度扫描的收敛条件
deep-security-scan 不是「同一个扫描跑 N 遍」,而是带记忆的批量迭代:
codex-security scan . --mode deep --workers 2 --subagents 0 \
--stop-after-no-new 3 --max-discovery-runs 10 --max-time 90
--workers 控制每批并行的 Standard 扫描数,--subagents 控制每个扫描内部的子代理数。同批 worker 可以互相通报正在查什么、请对方复核某个源码位置。每批完成后按启动顺序合并,用「源码位置 + 引用代码 + 弱点描述」三要素匹配重复发现;后续批次会拿到已保留发现的标题与主位置,从而去查其他可达路径而不是重复劳动。--stop-after-no-new 统计「连续多少批没有新增发现」,--max-discovery-runs 封顶总批次数(含失败的),--max-time 到点停止发现并返回已完成批次的结论。
这里有个容易被忽略的取舍:Standard 的时间预算是「建议性」的,Deep 的时间预算是「强制性」的。investigation-time-budget.md 原文写着「这是建议,不是硬超时也不是最短运行时间」,且明确禁止「为了消耗预算而 sleep、忙等、填充输出或编造工作」;而 Deep 的 discovery 时限强制执行,续跑沿用原截止时间。原因不难猜:Standard 是一次性审计,硬掐会丢掉已有结论;Deep 是预算型批量作业,不掐会失控。
4.6 性能优化与设计取舍
成本控制做成显式参数。 --max-cost USD 在估算成本超限后停止扫描与 worker,但进行中的请求可以超额完成;带成本上限的扫描必须拿到完整 token 用量才能返回 completed。批量扫描另有 --max-total-cost 在多个仓库间共享预算。默认模型 gpt-5.6-sol、默认强度 xhigh、多智能体 v2 允许 9 个并发线程(父 + 最多 8 个 worker)——这个默认值在 2026 年 7 月刚开源时引发大量账单事故:HN 上有开发者跑一个小仓库,52 分 47 秒后被「扫描期间仓库 HEAD 发生变化」打断,一小时白跑且消耗了 Pro 套餐周额度的一半;另一位用户刚起步就撞上限流,重试一分钟后放弃,这次失败花了约 13 美元。0.10.0 后给了更多出口:--effort、--model、--max-cost、--max-total-cost、--max-time。
默认只做静态验证,产物保持不可变。 cs validate 能读 checkout,但网络访问与网页搜索被禁用,并跳过构建、测试、PoC 与应用执行。契约同时写着「这个包记录不可变的扫描观察,它不是工作流状态数据库」。两项取舍方向一致:软件只给事实,判断权留给流程。
五、应用场景
场景一:PR 门禁——把「这次改动引入了什么」变成可判定的检查
业务痛点:全仓扫描在 CI 里跑不动(太慢太贵),而 PR 里真正需要看的是「这次改动新引入了什么」。人工 review 对鉴权、路径拼接这类上下文相关的漏洞基本无感——它们语法上完全正常。
怎么解决:security-diff-scan 技能 + cs scan . --diff origin/main。它只审 diff 引入或暴露的漏洞,报告里给出 baseRevision/headRevision,并在 scan-manifest.json 的 scan.review.excludedPaths 里记录被排除的路径。
name: Codex Security PR
on: pull_request
permissions: { contents: read, security-events: write }
jobs:
security:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v7
with: { persist-credentials: false, fetch-depth: 0 } # diff 需要 base commit
- uses: openai/codex-security@<reviewed-commit-sha>
with:
scope: diff
model: gpt-5.6-sol
effort: high
max-cost: "3"
fail-on-severity: high
env:
OPENAI_API_KEY: ${{ secrets.CODEX_SECURITY_API_KEY }}
收益与量化指标:退出码三个值——0 扫描完成且未触发阈值,1 发现达到 --fail-on-severity 阈值,2 执行、目标完整性或必需输出失败。这个三值设计让「扫描没跑起来」和「跑了但发现了问题」在 CI 里可区分,避免把基础设施故障误判成安全通过。官方示例的 max-cost 估每次 5 美元;按第三方博客用 --effort medium 的自测,小范围路径扫描大致在 1–3 美元区间(非官方定价,仅供规划参考)。
适用边界:diff 扫描只覆盖「改动引入或暴露」的问题;--diff 用两点比较(base..head),而 PR 的三点比较用 merge base,两者在分支分叉后可能给出不同文件集——官方专门提醒过,排查漏扫时要按两点比较核对 artifacts/02_discovery/in_scope_files.txt。
场景二:存量仓库的定期深度审计——把「一次性扫描」变成「逐轮收敛」
业务痛点:一个跑了五年的单体仓库,第一次全仓扫描必然产出大量候选,人工处理不完;只跑一次又容易漏掉深层的跨文件漏洞(比如「鉴权写了但放行判断没咬死」)。
怎么解决:deep-security-scan 的批量迭代 + 发现身份去重 + 跨扫描比对。
# 第一轮:深度扫描,预算与轮次双封顶
cs scan . --mode deep --workers 2 --stop-after-no-new 3 --max-discovery-runs 10 --max-time 90 --max-cost 40
# 三个月后再扫一次,做漂移比对
cs scan . --mode deep --max-cost 40
cs scans compare <SCAN_ID_BEFORE> <SCAN_ID_AFTER>
收益与量化指标:scans compare 把两次扫描的发现分类成 new、persisting、reopened、not observed、resolved、unknown,语义很克制——「后来的范围里没出现」记为 not observed,不等于已修复;只有显式关闭为「已修复」才算 resolved。这直接对应审计场景的核心诉求:别把「没扫到」当成「没问题」。
适用边界:Deep 的 discovery 时限是强制的,到点就停;如果时限在任何源码复核完成之前就到期,保存的报告与 manifest 会明确记录这个限制。所以「跑完了但什么都没发现」与「超时了什么都没跑」在产物里可区分,后者不能当作「仓库干净」的证据。
场景三:把外部扫描器的告警接进来做分诊
业务痛点:多数团队已经有 Snyk / Semgrep / Sonar / Trivy / Checkmarx / Veracode / Wiz 之类的工具,告警堆在工单系统里。换工具成本极高,继续用又处理不完。
怎么解决:triage-finding 接受 SARIF、CVE、公告、扫描器工单、bug bounty 报告,甚至自由文本的漏洞声明,对每条给出 confirmed、not_actionable、needs_review 三选一的静态证据裁决。它明确不做发现、不做重复判定、不做运行时验证、不改仓库文件。
cs import --provider semgrep ./semgrep.sarif
cs import --provider trivy ./trivy-report.json
cs validate findings.json --effort medium --context "检查租户边界"
收益与量化指标:仓库自带 SastBench 评测口径,数据集 2,737 条发现(299 条真阳性、2,438 条假阳性)。它同时报两套指标:strict(把 needs_review 和解析错误都算错)与 decided-only(只统计有效裁决)。这个双口径设计很诚实——只看 decided-only 会显得很准,但 decided_coverage(有效裁决占比)一低,质量就是虚高的。此外还有 true_positive_retention(真告警没被自动关掉)、unsafe_closure_rate(真告警被误判为 not_actionable)、remaining_analyst_workload 等 workflow 指标。
重要说明:仓库公开了这套评测的口径、数据集规模与指标定义,但没有在 README 里公布具体分数。本文不编造这些数字;要拿到分数必须自己配好模型账号跑
eval:sastbench。
适用边界:分诊是静态的——读源码、读策略,不跑 PoC、不做动态验证。needs_review 不是失败,而是「静态证据不足以定论」的正确表达。SastBench 衡量的是「给定告警的判定准确率」,不衡量仓库级漏洞发现能力,两者不能混着引用。
场景四:提交前闸门与安全策略资产化
业务痛点:编码智能体让代码产出速度提升一个量级,安全 review 的速度没变;同时 SECURITY.md 通常只是写给人和漏洞报告者看的文档,扫描器读不懂它,「哪些不在范围内」的判断只能靠人重复做。
怎么解决:cs install-hook 装 git pre-commit 钩子跑 --working-tree 扫描;define-security-policy/threat-model 生成可被扫描自动继承的策略与威胁模型,最近的嵌套策略优先。
codex-security install-hook /path/to/repository --fail-on-severity high
cs policy . --path services/api --knowledge-base architecture.md # 草稿存在仓库外
cs export --scan SCAN_ID --artifact threat-model --output threatmodel.md
收益与量化指标:core-scan.md 有一条明确的优先级规则——知识库事实覆盖生成的假设与仓库策略,但永不覆盖用户的显式指令。你可以把架构文档、合规要求、内部威胁模型作为 --knowledge-base 喂进去,让模型的判断锚定在真实系统上。
适用边界:钩子用 checkout 的常规索引看已暂存与未暂存改动,所以可能包含部分提交之外的改动,也可能漏掉只在独立索引里暂存的内容;官方原文就是「本地钩子是可选执行的,强制力要靠 CI」。另外 SECURITY.md 放在 .github/ 或 docs/ 下通常只含「怎么报告漏洞」的说明,不会自动成为全仓扫描的指导,要放仓库根或组件目录才生效。
明确不建议使用的场景
- 把「零发现」当成安全认证。契约本身就说得很清楚:
completed且零发现的报告仍可能列出排除路径或未解决问题;failed/canceled/interrupted的产物必须把「没有发现」当作不确定。 - 需要确定性、可重复、零成本的合规扫描。它是 LLM 驱动的,同一份代码两次扫描的结论可能不同,而且每次都要花钱。
- 供应链与依赖漏洞。它能导入 Trivy / Snyk / Dependabot / GHSA 的结果并做分诊,也有
resolve-dependency-alert去追「是哪个包被拉进来的」,但它自己不是 SCA 工具,不维护漏洞库。 - 没有模型预算的团队。默认配置下一次全仓扫描的成本是「美元级」而非「美分级」,与传统 SAST 的成本模型完全不同。
六、快速上手
# 环境:Node.js 22.13+ / 24.x / 26.x,Python 3.10+(3.10 需 tomli)
npm install --global @openai/codex-security
cs login # CI 场景免登录,设 OPENAI_API_KEY 即可
cs scan . # 全仓标准扫描
cs scan . --path src --path tests # 只看指定路径
cs scan . --diff origin/main # 只看提交改动
cs scan . --mode deep --workers 2 \
--stop-after-no-new 3 --max-discovery-runs 10 # 深度多轮
cs scan . --max-time 15 # 15 分钟建议性预算
扫描完成后终端打印 REPORT 路径,打开那个 Markdown 就是可读报告。
// TypeScript SDK
import { CodexSecurity } from "@openai/codex-security";
const security = new CodexSecurity();
try {
const result = await security.run("/path/to/repository");
console.log(result.reportPath);
} finally { await security.close(); }
# 项目配置(比命令行更适合长期维护)
cs init # 生成 codex-security.yaml
cs info -c codex-security.yaml --json # 查看生效设置及其来源
cs scan . -c codex-security.yaml --dry-run --json # 先干跑
scan:
scope: { paths: [src] }
knowledge_base: [SECURITY.md, docs/architecture.md]
mode: deep
max_time_minutes: 30
deep: { workers: 2, subagents_per_worker: 1, stop_after_no_new: 2, max_discovery_runs: 4 }
policy:
fail_on_severity: high
配置文件里有一条安全提醒值得抄下来:原生 Codex 设置可以启动 MCP 服务器、改变模型请求的去向,所以要选一个你信任的配置文件,在 CI 里把它放在被扫描 checkout 之外的操作员控制位置。
cs export --scan SCAN_ID --artifact findings --format sarif --output findings.sarif
cs scans list --scan-root /path/to/security-scans
cs scans resume SCAN_ID # 续跑被中断的 Standard/Deep 扫描
七、横向对比
| 维度 | Codex Security | 传统 SAST(Semgrep / Sonar) | 通用编码智能体裸用 | Cloudflare security-audit-skill |
|---|---|---|---|---|
| 检测单元 | 威胁模型 + 源码到汇点的攻击路径 | 规则 / 模式匹配 | 你让它看什么它看什么 | 18 份 Markdown 契约编排的多阶段流程 |
| 是否验证 | 默认静态复核;可接运行时环境做动态验证 | 不做(部分商业版有污点分析) | 视提示词而定 | 对抗式验证者反证每个候选 |
| 误报治理 | 严重级按威胁模型算;指纹去重;漂移比对 | 靠规则调优与人工分诊 | 无内建机制 | 三元裁决(确认/待验证/已排除) |
| 产物形态 | 密封包:manifest + findings.json + report.md + SARIF/CSV | 厂商私有格式,通常导出 SARIF | 聊天记录 | 报告 + 覆盖账本 |
| 成本模型 | 按 token 计费,默认 gpt-5.6-sol + xhigh,单次美元级 |
按席位 / 按代码行数,边际成本近零 | 按 token | 按 token |
| 可复现性 | 高(确定性投影 + SHA-256 指纹),但模型判定非确定 | 高(规则固定) | 低 | 中 |
| 开源程度 | Apache-2.0,应用层全开、模型层不开 | 多为商业闭源;Semgrep 社区版开源 | 部分开源 | MIT,纯 Markdown 契约 |
| 最适合 | 已有 AppSec 流程、想降低人工分诊量的团队 | 合规基线、零成本全量扫描 | 个人开发者随手看 | 想自建流水线且不想被厂商锁定 |
怎么读这张表:Codex Security 的差异化不在「能不能发现漏洞」,而在把「判定」和「证据」做成了工程产物。传统 SAST 在「覆盖广度 / 成本 / 确定性」三项上仍全面占优,它不该被替换掉,而应放在前面当粗筛、把 Codex Security 放后面当精判。
八、局限、风险与社区观察
维护活跃度(正面信号):仓库 2026-07-13 创建,pushed_at 为 2026-11-12 22:00 UTC。版本节奏极快:0.8.0(10-28)→ 0.8.1/0.8.2(10-29)→ 0.8.3(11-03)→ 0.9.1(11-10)→ 0.10.0(11-12)。0.9.0 是「源码发布但 macOS 签名失败、未上 npm」的事故,官方在 0.9.1 里说明并让用户改用签名版——把失败写进 Release Notes 值得肯定。1,755 个文件、21 个技能、27 个 MCP 工具、5 套评测框架,工程完整度远超一般「开源个 CLI」的水平。
风险一:成本不可预测,且默认值很贵。 默认 gpt-5.6-sol + xhigh + 最多 9 个并发线程。--max-cost 只能拦住「估算已超限」的新请求,进行中的请求仍会超额。官方明确说「带成本上限的扫描需要完整的 token 用量才能返回 completed」,预算校验失败会直接让扫描不算完成。
风险二:模型层不开源,供应商锁定是结构性的。 它支持 OpenAI、Bedrock、OpenRouter、Fireworks、Cheaper Inference 五家,也支持 Hugging Face 兼容端点与 Vertex AI 成本估算,「锁定」不是绝对的。但默认模型、默认强度、评测基线全部围绕 OpenAI 自家模型设计,换供应商后行为会漂移。
风险三:LLM 判定天然非确定,与合规审计的确定性要求冲突。 官方用 scans compare 的 unknown 类别承认了这点:锚点不同但共享唯一规则与首个源码范围的发现会被标记出来,但「模糊匹配按未解决处理」。这意味着同一仓库两次扫描的发现集合不会完全一致,做趋势统计时要小心。
风险四:权限与提示注入面。 插件能力声明是 Interactive / Read / Write,它能改文件。assess-patch-risk 里有一条很硬的规定:补丁内容、文件名、仓库指令、工单、PR 正文、评论、测试、工具输出全部当作「数据」而不是「指令」。check-skills 则专门在安装第三方技能前做只读审查,返回 PASS/REVIEW/BLOCK/INCOMPLETE。这说明团队清楚「让 AI 读不可信内容」的风险,但风险没有消失——只是被写成了流程约束。
风险五:社区实测与官方叙事的落差。 2026 年 7 月刚开源时,HN 的主流反馈是「贵、慢、失败了不能续跑」。0.10.0 补上了续跑与批量预算,但「贵」没有本质改变——只是从「不可控的贵」变成「可控的贵」。另有第三方博客声称在 16.2 万行生产代码上做过对比(Codex Security 真阳性率 74% vs Snyk 28% vs Semgrep 20%),该数字未见官方出处,标注为待确认。
License:Apache-2.0,允许商用与修改,附带专利授权条款。但注意「开源的是应用层」——模型调用的费用与条款仍受各供应商约束。
生产可用性判断:从 0.1.x 到 0.10.0 用约四个月,版本号仍是 0.x,CHANGELOG.md 连续几个版本都在修「路径归一化」「符号链接跟随」「Windows 卷 ID 校验」这类基础问题。它适合作为第二道防线进入生产流程,不适合作为唯一防线。
九、小结与行动建议
-
先算钱,再上线。 别用默认
xhigh跑全仓。第一次接入用--effort medium --max-cost 3扫一个子目录,把实际成本与发现质量摸清楚,再决定是否放开到全仓与deep模式。 -
把「零发现」和「扫描失败」在流程里分开。 用退出码三值(0/1/2)做分支,别把
2(执行或目标完整性失败)当成通过。同时读scan-manifest.json的scan.review.excludedPaths——零发现但有大量排除路径,等于没扫。 -
从「分诊」而不是「发现」开始用。 已有的 Snyk / Semgrep / Trivy 告警堆是现成输入,
triage-finding的三选一裁决能立刻降低人工队列。跑顺了再上全仓发现。 -
把
SECURITY.md当成一等公民来写。 扫描会自动继承根目录与组件目录的策略,最近的嵌套策略优先。把「哪些算漏洞、哪些不在范围、哪些是可信输入」写清楚,比调提示词有效得多。 -
对 AI 生成的补丁保持怀疑。
verify-fix给出fixed/still_vulnerable/inconclusive三态结论,assess-patch-risk把「错了的影响」「回归可能性」「回归保护」「可恢复性」「置信度」五个概念分开评估。这五个概念不能互相替代——测试通过只降低「可能性」,不降低「错了的影响」。
数据来源与获取日期:仓库结构、技能清单、MCP 工具列表、扫描契约、严重级规则、CLI 参数、评测口径均来自 github.com/openai/codex-security 的 main 分支原始文件(README.md、CHANGELOG.md、docs/、plugins/codex-security/references/、plugins/codex-security/skills/、evals/、sdk/typescript/docs/、github-action/README.md),抓取日期 2026-11-12。Star 数、License、创建时间、Release 列表来自 GitHub API(/repos、/releases、/git/trees?recursive=1),同日获取。当日涨星 663 来自 GitHub Trending 日榜(since=daily)2026-11-12 快照。1.2M 提交 / 792 严重 / 10,561 高危 / 误报率下降超 50% / 14 个 CVE 等数字来自 OpenAI 官方研究预览公告及 The Hacker News、CSO Online、ThaiCERT、AI Business 等媒体报道(2026-03)。HN 账单事故(52 分 47 秒被打断、约 13 美元失败扫描)来自 2026-07 开源时的媒体报道转述。第三方成本估算(1–3 美元/小范围路径扫描)与「16.2 万行代码真阳性率 74% vs Snyk 28% vs Semgrep 20%」均来自第三方博客,未经官方确认,标注为待确认。SastBench 的具体分数仓库未公开,本文不提供。
读者留言
COMMENTS 暂无还没有留言,来说第一句?