结论:临时排查、本机扫描和 CI 命令行接入,优先使用 Codex Security CLI;已有 TypeScript 项目需要内嵌扫描、获取报告路径时,再选择 TypeScript SDK。npx @openai/codex-security scan . 跑不起来时,先查运行时版本、认证方式和 Codex Security 访问权限,不要一上来就怀疑仓库代码。
GitHub 趋势中的 codex-security 对应 OpenAI 的安全扫描工具,npm 包名是 @openai/codex-security。它覆盖漏洞发现、验证、补丁生成和 PR 创建,但发布时仍处于早期阶段,参数和行为可能继续调整。
scan . 跑不起来时先查版本、认证和权限
先确认命令能运行,再看扫描结果。可以在项目中安装包,并通过当前版本的帮助信息确认命令和参数:
npm install @openai/codex-security
npx @openai/codex-security@latest --help
调用时统一使用带 scope 的包名 npx @openai/codex-security,不要把 npm 包名、旧命令别名和不同资料里的参数混在一起。旧文章出现过的参数如果不在当前 --help 中,就不应直接写进 CI 脚本。
-
先确认命令调用的是正确的包。如果提示找不到命令,先确认安装的是
@openai/codex-security,再重新运行npx @openai/codex-security@latest --help。不要因为文档里出现过npx codex-security,就直接把它当成完全等价的包名。 -
再核对 Node.js 和 Python 是否满足要求。现有资料对版本范围略有差异:一份列出 Node.js 22.13.0 或更高版本、24.x 和 26.x,另一份概括为 Node.js 22 以上和 Python 3.10 以上。保守做法是准备 Node.js 22.13.0 与 Python 3.10,发布前再核对仓库 README 中当前支持的版本线。
bash
node --version
npm --version
python3 --version
- 本地交互登录和 CI 认证需要分别处理。本地交互式使用可以执行:
bash
npx @openai/codex-security login
CI 则不应等待交互登录,而应通过 CI Secret 注入 OPENAI_API_KEY 或 CODEX_API_KEY:
bash
export OPENAI_API_KEY="<your-key>"
# 或 export CODEX_API_KEY="<your-key>"
项目资料称,环境变量中的 API 密钥会直接传给当前扫描,不写入 Codex 凭据目录或系统密钥环;即便如此,也不要把密钥写进仓库、命令行参数或 CI 日志。
-
检查账号是否拥有 Codex Security 权限。安装成功和认证成功并不等于账号已经获得扫描权限。资料还提到,部分网络安全请求需要在
chatgpt.com/cyber申请“网络可信访问”审批。如果请求明确被权限或网络审批拦截,应先完成对应授权,再重试扫描。 -
检查扫描状态目录是否可写。扫描历史会保存在 Codex Security 工作目录。如果默认目录不可写,可以将
CODEX_SECURITY_STATE_DIR指向另一个可写位置:
bash
export CODEX_SECURITY_STATE_DIR="/path/to/writable/codex-security-state"
当前资料没有给出可直接硬编码的默认目录结构,因此排查时先检查目录权限和该环境变量,不要猜路径。
- 没有代码差异、补丁或 PR 时,先确认是否只执行了普通扫描。
scan .本身不会修改仓库文件,只有显式加入--patch才会进入修改阶段。生成 PR 还需要--create-pr,并确认目标发现没有被严重性阈值排除、补丁通过验证,以及当前账号具备提交分支和创建 GitHub Pull Request 的权限。
排除前五项后,在仓库根目录执行第一次扫描:
npx @openai/codex-security scan .
扫描结束后会显示发现结果摘要。交互式流程会询问是否打开发现结果浏览器,其中可以查看完整详情、设置严重性阈值、选择单个发现,并为选中的结果添加补丁指令。这些命令和检查本身都不会改动仓库代码。
项目资料称,该工具会结合代码语义和潜在攻击路径验证漏洞并过滤误报,但这不代表固定准确率,也不能替代人工复核。扫描结果更适合作为候选安全发现,而不是漏洞已经被证明的结论。
CLI 与 TypeScript SDK:选入口,也别混淆报告位置
CLI 和 TypeScript SDK 是同一类 Codex Security 能力的两个入口,不是两套彼此独立的安全结论来源。区别主要在调用方式:
| 场景 | Codex Security CLI | TypeScript SDK |
|---|---|---|
| 本机排查 | 交互式摘要与发现结果浏览器 | 不如 CLI 直接 |
| 一次性全仓扫描 | 适合从仓库根目录执行 | 可嵌入现有 TypeScript 流程 |
| CI 接入 | 命令行、JSON 输出、退出码由流水线处理 | 适合已有 Node.js 服务或任务系统 |
| 结果取得 | 终端输出、JSON、报告路径 | 运行扫描并取得扫描报告路径 |
如果团队只是临时检查一个仓库,或者要在 GitHub Actions、GitLab CI 等流水线里执行扫描,没有必要先引入 SDK。只有当现有 TypeScript 项目确实需要控制调用时机、归档报告路径或把扫描纳入内部任务系统时,SDK 才更合适。
当前资料没有提供可以核实的 SDK import、类名和方法签名,因此不应该凭印象写一段可能无法编译的示例代码。应以当前 SDK 文档为准,先确认调用入口、参数、返回对象和错误处理方式。
排查结果保存问题时,还要分清三件事。一次扫描结束后拿到的是扫描报告,SDK 的已知能力之一是取得这个报告路径;多次运行的跟踪信息属于扫描历史,资料称它保存在 Codex Security 工作目录;CODEX_SECURITY_STATE_DIR 则是默认状态目录不可写时的迁移入口。找到一份报告,并不代表历史记录丢失,反过来也一样。
CI 中需要机器可读输出时,可以使用:
npx @openai/codex-security scan . --json
现有资料没有列出 JSON 的具体字段,也没有给出发现漏洞时对应哪个退出码。因此,CI 解析器、失败判定和门禁规则都需要根据当前官方文档或实际行为自行验证,不能直接假设“输出里有 finding”就一定返回非零状态。
“接进 CI”也不等于“自动阻止合并”。退出码如何解释、哪些严重性需要阻断、是否保护主分支,仍需团队自行配置。在确认这些行为之前,更稳妥的做法是先保存 JSON 输出和报告路径,把扫描结果接入看板或告警,再逐步增加阻断规则。
--patch 之后的验证、PR 与边界
普通扫描不会修改仓库,只有 --patch 才会让工具进入补丁生成阶段。需要同时发现漏洞、生成补丁并输出机器可读结果时,可以组合使用:
npx @openai/codex-security scan . --patch --patch-severity high --json
这里 --patch-severity high 是补丁流程的严重性门槛。目标发现没有达到设定条件,就不会进入对应的补丁处理;所以扫描结束后没有代码差异,不能简单归结为工具没有识别漏洞。
项目资料称,补丁生成后还会验证修复效果及相关测试,用来判断补丁是否解决问题、有没有引入回归。但这只代表工具执行了相应验证,不代表项目全部测试必然通过;相关资料也没有给出固定的测试命令和通过标准。最终仍应查看差异并运行项目自己的测试:
git status --short
git diff
补丁验证完成后,再用 --create-pr 提交已验证文件并打开 GitHub Pull Request:
npx @openai/codex-security scan . --patch --patch-severity high --create-pr
这条命令有两层副作用:先修改本地代码,再向远端仓库提交内容并创建 PR。执行前应确认当前分支、提交身份、远端仓库和 GitHub 权限,避免把未审查的改动直接推到受保护分支。
如果补丁或 PR 没有生成,可以逐项核对 --patch、--patch-severity、--create-pr 是否组合正确,目标发现是否进入阈值,补丁是否完成验证,以及账号是否拥有仓库写入和创建 PR 的权限。当前资料没有提供这些场景的稳定错误码,不应凭报错文案猜测原因。
工具发布时仍是早期版本,官方表示会根据反馈继续改进;自动生成的补丁应当作为待审核的安全建议,而不是可以无条件合并的结论。网络可信访问审批仍可能影响部分请求。资料中还出现过 --mode deep、--workers 以及模型和 effort 参数,它们都不应在未经当前 --help 和仓库 README 确认的情况下写死进生产流水线。
最稳妥的下一步顺序是:检查 Node.js 与 Python 版本,确认 Codex Security 权限并完成认证,在仓库根目录完成一次本地扫描,验证 JSON 输出能否稳定解析,最后才启用 --patch、人工审查差异并尝试 --create-pr。这样可以把环境故障、扫描结果、补丁副作用和远端 PR 分开定位,避免一次把整条链路都推到自动提交阶段。













暂无评论内容