
Codex Router 安全设计深度剖析凭证隔离、600权限与 Caller Key 轮换的 6 道防线【免费下载链接】codex-routerExternal-model router for Codex with guided Kimi OAuth/API, DeepSeek, safe migration, and rollback.项目地址: https://gitcode.com/gh_mirrors/co/codex-routerCodex Router是一个本地模型路由器让 Codex 等 AI 编程客户端可以安全地调用 Kimi、DeepSeek 等外部模型。对新手来说最容易忽略的问题是这些 API Key 到底存在哪、会不会被别的程序偷走。本文带你拆解它的安全设计——凭证隔离、600 文件权限、回环网络边界与 Caller Key 轮换共 6 道防线全部在官方 SECURITY.md 中有详细说明。先搞清楚为什么路由器需要一套独立保险柜Codex Router 的核心思路是信任根分离它不复用 Codex 自己的凭证体系而是建立一套独立的本地密钥随机 Caller Key、内部服务密钥、私有状态目录。这样即使某一方的凭证泄露也不会牵连另一方。所有敏感状态默认存放在$CODEX_HOME/codex-router目录下关键文件路径定义在 paths.mjs文件用途权限internal-secret随机回环服务密钥600caller-secret客户端请求用的随机能力密钥600kimi-api-key.secret等各提供商 API Key600migrations/回滚快照私有防线一凭证隔离——不同的钥匙只开不同的门这是整套设计中最重要的原则每一类凭证都有专属路径且只能发往对应厂商的端点 Kimi Code OAuth 只从官方 Kimi CLI 目录读取只发往 Kimi 管理端点 DeepSeek API Key 只发往配置的 DeepSeek 端点 ChatGPT 认证仅对原生 GPT、图像、独立联网搜索请求放行。更关键的是不泄漏承诺外部请求永远不会拿到 ChatGPT 账号 ID、Codex 安装 ID 或调用者的授权头任何提供商凭证都不会写进模型注册表、目录、日志或健康检查响应中。详见 SECURITY.md 的 Credential separation 一节。防线二600 私有权限 原子写入杜绝半截密钥POSIX 系统上所有私钥文件都强制600权限仅当前用户可读写。核心实现是 file-security.mjs 中的两个函数protectPrivateFile把文件chmod到0o600writePrivateFile采用临时文件 → 收权限 → 原子替换三步走见 file-security.mjs保证任何时刻磁盘上都不存在一个权限宽松的半成品密钥文件。Windows 用户同样不用担心写入时会通过 PowerShell 重建 ACL把继承规则剥离只授予当前用户 SID 完全控制权限见 file-security.mjs并且会校验文件确实受保护privateFileIsProtected——校验失败就报错而不是静默放行。防线三只监听 127.0.0.1 的回环网络边界路由器和转发器只绑定127.0.0.1不监听任何外部网卡。配合模型请求必须走 JSON、拒绝带浏览器来源头的请求、不返回 CORS 头可以直接挡掉路过式浏览器攻击和同机器上无权限的进程。官方也明确提醒这条边界不防同用户的恶意代码不要改成0.0.0.0、不要做端口隧道SECURITY.md Network boundary 一节。防线四随机 Caller Key 藏在 URL 路径里每个受管客户端的接入地址形如http://127.0.0.1:端口/_codex-router/随机密钥/v1。密钥由 48 字节密码学随机数生成secret.mjs校验时使用恒定时间比较防止时序侧信道caller-auth.mjs。好处很直观密钥本身就是路径的一部分猜不到 URL 就进不了门也不需要把密钥塞进环境变量或配置文件。防线五Caller Key 轮换——带进度存档的原子操作这是全文最值得细看的部分。轮换密钥听起来简单但如果中途崩溃客户端会指向一个永远 401的地址。Codex Router 用三件套解决这个问题操作日志Journalcaller-key-rotation-journal.mjs 定义了严格的状态机prepared → service-stopped → secret-swapped → clients-refreshed → service-started → verified每一步落盘崩溃后重启可精确续跑或回滚互斥锁caller-key-rotation-lock.mjs 保证同一时间只有一个轮换在跑避免两个进程互相覆盖原子交换与回滚swapCallerCapability 先备份旧密钥再替换新密钥任一步失败就把旧密钥换回来并报错恢复流程 recoverPendingCallerKeyRotation 还会先验证回滚密钥的摘要和权限不匹配就失败关闭绝不动正在健康运行的服务。完成后系统还会双向验证新密钥能拿到模型列表旧密钥必须返回 401verifyCallerRotation。防线六脱敏输出——密钥不跟着截图和日志跑即使前 5 道防线都守住了密钥也可能出现在错误信息里漏网。redactCallerUrl 会把所有含密钥的 URL 替换成[REDACTED]覆盖 doctor 输出、支持包和错误消息。配置管理器同样会在首次修改 Codex 配置前生成.pre-codex-router备份并原子重写、收紧权限SECURITY.md Configuration safety 一节。新手自查清单如何验证自己的安全状态✅ 运行doctor命令检查权限与配置输出经过脱敏✅ 查看状态目录权限internal-secret、caller-secret应为600secret.mjs 提供状态检查✅ 确认监听地址是127.0.0.1而非0.0.0.0✅ 分享截图前检查 URL必要时手动打码生成路径✅ 需要轮换时执行caller-key rotate全流程自动备份、验证、可回滚。总结6 道防线各管一段防线一句话概括核心源码凭证隔离每把钥匙只开自己的门SECURITY.md600 权限原子写入 严格 ACLfile-security.mjs回环边界只监听 127.0.0.1SECURITY.mdCaller Key随机密钥藏进 URL 路径caller-auth.mjs安全轮换状态机日志 锁 回滚caller-key-rotation.mjs脱敏输出密钥永不进入日志caller-auth.mjs对普通用户而言这套设计意味着你只管正常接入各家模型密钥的存储、权限、轮换与泄漏防护已由 Codex Router 在本地默默完成。【免费下载链接】codex-routerExternal-model router for Codex with guided Kimi OAuth/API, DeepSeek, safe migration, and rollback.项目地址: https://gitcode.com/gh_mirrors/co/codex-router创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考