【免费下载链接】opencodex
Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code
opencodex 是一个面向 OpenAI Codex 与 Claude Code 的通用 Provider 代理,能够把 Cursor 等上游作为数据平面接入。本文基于仓库 devlog 工作单元260711_cursor_native_exec(001_wp1_evidence.md 为证据主体,配合 000_plan.md、010_wp2_sandbox_policy.md、011_wp2_evidence.md 同单元文档),完整还原 Cursor 服务器驱动的本地文件读写被默认拒绝的根因、无需重启代理即可热切换配置的解锁流程、基于真实文件落盘的确定性 A/B 激活验证方法,以及后续演进出的nativeLocalExec三态沙箱感知策略门控与对应测试体系。读完你将掌握:如何诊断 Cursor 路由会话"文件读写全部被拦截"的问题,如何通过管理 API 在线翻转 Provider 配置并给出可复现的激活证据,以及如何在"请求文本授权可被伪造"的安全审计结论下设计 fail-closed 的配置级授权模型。
1 问题现场:Cursor 会话"文件读/写全部被拦截"
工作单元记录的真实用户报告是:Codex 会话以danger-full-access沙箱模式运行,经 opencodex 路由到cursorProvider(上游 api2.cursor.sh),但模型反馈"file read/write are all blocked"。代码级根因并不在 Codex 沙箱解析,而在于Cursor 适配器对服务器驱动的本地执行(native local exec)默认全部拒绝,且拒绝逻辑根本不会读取 Codex 会话声明的沙箱模式。
证据链在 000_plan.md 中逐条给出:
- src/adapters/cursor/native-exec.ts 的
handleCursorNativeExec:除非unsafeAllowNativeLocalExec生效,否则每一个服务器驱动的本地执行 case 都会被拒绝,包括readArgs、writeArgs、deleteArgs、lsArgs、grepArgs、shellArgs、shellStreamArgs、backgroundShellSpawnArgs、writeShellStdinArgs、fetchArgs(当前实现见 native-exec.ts)。 - 拒绝文本
NATIVE_LOCAL_EXEC_DISABLED定义在 src/adapters/cursor/native-exec-fs.ts,提示模型改走目录内 shell 桥(shell_command/exec_command/mcp_opencodex-responses_*别名)或apply_patch。 - 开关是每 Provider 级配置
OcxProviderConfig.unsafeAllowNativeLocalExec(src/types/provider.ts),在 src/adapters/cursor/live-transport.ts 中接入执行上下文。 - 用户的
~/.opencodex/config.json中providers.cursor未设置该标志,导致所有经 Cursor 路由的模型对文件操作一律收到策略拒绝;同时全仓搜索确认没有任何地方解析sandbox_mode/danger-full-access,即 Codex 会话的沙箱模式从未被纳入决策。 - 线上流量佐证:
~/.opencodex/usage.jsonl显示 cursor-provider 轮次(gpt-5.6-luna、grok-4.5)完成状态为 200,但模型明确回报文件访问被拦截,另有少量 400/502 传输行。
一句话结论:打开 Cursor 本地执行的唯一钥匙是 Provider 配置上的显式 opt-in 标志,而不是请求方自报的沙箱声明。
2 WP1 方案:不重启代理的热切换(live flag flip)
第一个工作包(WP1)的目标是在运行中的代理上直接翻转配置,而不重启代理进程。重启被明确排除,因为那会杀掉正在驱动的直播流(包括本次工作的会话本身)。
2.1 翻转入口:管理 API
翻转通过管理 API 完成,两条命令配合:
- 打开 Provider 调试帧(可选,用于后续激活证据):
PUT /api/debug {"debug":true}生效后
runtimeOverride.debug=true,即 Provider 帧诊断开启。 - 提交完整 Cursor Provider 对象并附带新标志:
POST /api/providers Content-Type: application/json { "name": "cursor", "provider": { "adapter": "cursor", "baseUrl": "https://api2.cursor.sh", "unsafeAllowNativeLocalExec": true } }返回
{"success":true,"name":"cursor"}。其中provider部分应以config.json中现有完整 Provider 对象为基底再追加标志,避免丢失既有字段。
翻转后的配置 diff 检查证实:变更键仅有['unsafeAllowNativeLocalExec']一个(对比翻转前快照),其余字段原样保留。
2.2 为什么能热生效:闭包共享的内存配置
关键机制是管理端点直接变更服务器闭包共享的内存中配置对象,而不是要求重载文件。相关实现位于 src/server/management/provider-routes.ts:
POST /api/providers读取 JSON body,校验name、adapter、baseUrl、模型显示名、SSRF 目标等,然后调用stripCodexRuntimeProviderFields剥离_codexAccountOverride/_required这类运行时字段;- 由于 Cursor 的 OAuth token 并不存储在 Provider 对象上(
apiKey缺失),覆写不会丢失任何密钥;而多密钥池apiKeyPool的延续由端点专门处理(见 provider-routes.ts); - 校验通过后执行
save(config)持久化到磁盘,同时内存中的共享对象已被变更,后续每个请求都会重新读到新值。
从源码结构看,"内存变更 + 每请求重读"正是热翻转得以成立的两个支点:前者让当前进程内的后续请求立即生效,后者让无需重启即可维持一致性。这也是评审要求(reviewer finding 4)点名验证的存活语义。
3 A/B 激活验证:真实文件读写作为确定性证据
热翻转之后,必须有可复现、不可抵赖的证据证明"本地执行确实被激活了",而不仅是"配置字段变了"。WP1 采用直接POST /v1/responses请求 cursor 路由模型的方式做 A/B 对照。
3.1 BEFORE:标志未设置
先准备测试文件/tmp/ocx-native-exec-test.txt,内容为OCX-NATIVE-EXEC-TEST-2607111905 hello from baseline。以cursor/gpt-5.6-luna发起读取请求(模型在 Cursor 上游通过本地 exec 的readArgs读文件):
- BEFORE(标志未设置):模型原样转述了
NATIVE_LOCAL_EXEC_DISABLED的拒绝文本,即文件内容不可达。 - AFTER(标志已翻转):同一请求返回文件逐字节一致的内容
OCX-NATIVE-EXEC-TEST-2607111905 hello from baseline—— 这正是文件内容本身,只有真实落盘读取才能产生。
3.2 AFTER:写入必须真实落盘
读取之外还要验证写入路径。由于裸 curl 请求没有向模型宣传apply_patch工具,写操作会走 Cursor 原生的writeExec:
- 发起写入请求后,
/tmp/ocx-native-exec-write-test.txt在磁盘上真实创建,内容为精确行OCX-WRITE-OK-2607111920; - 模型回报 DONE。
这一设计刻意避开了"模型假装成功"的可能:文件必须真实存在于本地磁盘且内容精确匹配,才构成 write 激活证据。
4 激活证明:Provider 调试帧中的 exec case 事件流
A/B 往返只能证明"模型答对了内容",不能排除"上游模型恰好自己猜出了答案"。要确定性地证明readArgs/writeArgs确实在本地执行,需要中间层证据。答案来自 Provider 调试帧(Provider debug frames)。
4.1 帧事件从哪来
开启ocx debug provider on后,Cursor 直播传输的每一个服务器帧都会流过debugProviderDiagnostic("cursor","frame",...)诊断通道,exec 帧内部还会携带具体的 exec case(见 live-transport.ts),最终写入调试环形缓冲区,可通过GET /api/debug/logs读取。
4.2 捕获到的事件序列(2026-07-11 KST,证据时间戳)
读轮次(read turn)捕获到:
{"case":"execServerMessage","exec":"readArgs"} // seq 21写轮次(write turn)捕获到完整的"读 → 写 → 复核"链条:
requestContextArgs seq 80 readArgs seq 83 / 143 shellStreamArgs seq 86 writeArgs seq 145 readArgs seq 165即 Cursor agent 通过原生 exec 完成了读取、写入、再读取复核,全部在翻转后的本地执行。加上第 3 节的"内容精确匹配 + 文件真实落盘"往返,两者叠加构成确定性激活证据(A-gate blocker 2 的验收口径)。
4.3 收尾
证据采集完毕后,Provider 调试已恢复关闭(debug回到 off),避免在正式环境中持续输出诊断帧。
5 安全审计转折:请求文本授权可伪造
WP1 完成后,A-gate 第一轮评审(reviewer: sol/Hubble)给出了FAIL + 4 个阻断项,其中最核心的是:
请求文本授权可被伪造:任何能触达 HTTP 数据平面的调用方都可以在 body 里断言沙箱短语(parser.ts:238,319 逐字接受 body 文本),若以请求文本作为授权依据,等同于授权给所有能发请求的人。
这个结论直接否决了最初"请求文本 OR 配置标志"的设计方向。处置决定被完整记录在 000_plan.md 的 A-gate round 1 表格中,并落地为 WP2 的权威设计 010_wp2_sandbox_policy.md:
- 请求文本永远不能单独授权;
- 改为config-selected模式:只有配置所有者能选择策略;
- 默认保持
off,且任何 opt-in 都不会比历史标志放宽更多。
6 WP2 设计:nativeLocalExec三态策略模式
6.1 新配置项与语义
新增 Cursor-only Provider 选项(src/types/provider.ts):
nativeLocalExec?: "off" | "codex-sandbox" | "on";| 取值 | 语义 |
|---|---|
off(默认) | 维持历史行为:所有原生本地执行一律拒绝 |
on | 总是允许,与历史标志unsafeAllowNativeLocalExec: true语义完全一致 |
codex-sandbox | 仅当请求的 instructions/system 或 developer 角色文本声明了 Codex 全访问沙箱(sandbox_mode ... danger-full-access)时放行;严格窄于on |
优先级:显式nativeLocalExec优先;否则历史布尔标志unsafeAllowNativeLocalExec: true映射为"on";否则"off"。该优先级逻辑由 src/adapters/cursor/exec-policy.ts 的resolveCursorNativeExecMode实现,并有专门测试用例覆盖("explicit off beats legacy true" 等)。
6.2 纯函数设计
exec-policy.ts 提供三个纯函数:
resolveCursorNativeExecMode(provider):按上文优先级解析模式;cursorRequestDeclaresFullAccess(request):用正则/sandbox_mode[^\n]{0,80}danger-full-access/i检测声明,carrier 只有 system/instructions 条目和 developer 角色消息,user 角色文本刻意不作为 carrier(调用方可控,不能参与授权);effectiveCursorNativeExecAllow(provider, declared):mode === "on" || (mode === "codex-sandbox" && declared)的真值表。
注意当前仓库 exec-policy.ts 的实现中effectiveCursorNativeExecAllow实际只返回mode === "on",即codex-sandbox被保留为可识别但 fail-closed的拼写:opencodex 没有可信的每请求证明手段来确认调用方提供的 system/developer 文本真的反映了 Codex 沙箱状态,因此按off处理。这与 registry 目录注记一致(见 src/providers/registry/entries-core.ts):"codex-sandbox"accepted for backwards compatibility but fails closed。
6.3 调用链贯通
- src/types/provider.ts 保留历史布尔标志并标注为
"on"的别名,兼容既有配置; CursorTransportFactoryInput增加可选字段requestDeclaresFullAccess?: boolean(src/adapters/cursor/transport.ts);src/adapters/cursor.ts的runTurn在构造CursorRunRequest后计算declared(system + developer 角色消息都经过翻译保留),并传入工厂输入;- live-transport.ts 构造函数与
prepareMcp中,execContext.unsafeAllowNativeLocalExec改由effectiveCursorNativeExecAllow(input.provider, input.requestDeclaresFullAccess === true)构建(构造处 #L563、MCP 准备处 #L598); handleCursorNativeExec与rejectNativeFileMutations本身保持零改动,策略变化只体现在注入的执行上下文布尔值上。
7 拒绝路径与重定向文本(fail-closed 的细节)
即使标志为 false,拒绝也不是干巴巴的一句"no"。NATIVE_LOCAL_EXEC_DISABLED完整文本(native-exec-fs.ts)给出可操作的替代路径:
- 文件读取/列表/搜索:走 catalog 中的 shell 桥工具(
shell_command/exec_command,或mcp_opencodex-responses_*显示别名),并给出 POSIX(cat、head、ls、rg、grep)与 Windows PowerShell(Get-Content、Get-ChildItem、Select-String)等价命令; - 文件编辑:走
apply_patch工具,使 Codex 能审批变更、执行沙箱策略、展示 diff 并记录 rollout; - 附加指令:"Do NOT narrate this redirect, do NOT comment on tool availability, and do NOT re-announce the task — just make the bridge call",避免模型把重定向过程写成大段注释而消耗 token。
拒绝路径的完整分布见 native-exec.ts:未授权时readArgs/writeArgs/deleteArgs/lsArgs/grepArgs/shellArgs/shellStreamArgs/backgroundShellSpawnArgs/writeShellStdinArgs/fetchArgs各有对应的reject*ExecForPolicy拒绝函数;mcpArgs、computerUseArgs、recordScreenArgs等另有通道处理。
8 信任模型与环路安全(C-gate 评审结论)
WP2 补丁经过三轮独立评审(011_wp2_evidence.md):
- Round 1(FAIL):
codex-sandbox信任调用方可控的 system/developer 文本;在免认证的 loopback 绑定上,任何本地进程都能断言该短语。接受的一半:信任模型必须写清楚;部分反驳的一半:保留 loopback 免认证(不破坏 Codex 零配置启动)。 - Round 2(FAIL):反驳前提有误——loopback 不等于同一 OS 用户,多用户机器上其他本地用户也能触达;
isAllowedRequestOrigin默认拦截非 loopback 浏览器来源,但放行 loopback 来源与无来源调用方。 - Round 3(PASS):措辞与实际行为一致,无阻断项。
最终写入配置文档的信任说明(src/types/provider.ts):
"off" (default) rejects server-driven local exec; "on" always allows it for this provider and should be used only for a trusted local experiment on a host where every>赞
【免费下载链接】opencodex
Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code
相关推荐
opencodex Cursor 原生本地执行安全策略:config-selected 三态授权模型(nativeLocalExec)深入解析
opencodex Cursor 原生本地执行安全策略:config selected 三态授权模型(nativeLocalExec)深入解析 本技术指南以 o
Agent Governance Toolkit 入门指南:面向 AI 代理的运行时治理基础设施(策略执行、零信任身份与执行沙箱)
Agent Governance Toolkit 入门指南:面向 AI 代理的运行时治理基础设施(策略执行、零信任身份与执行沙箱) 本文基于仓库 docs/i1
人工智能AI AgentAI 安全治理策略引擎Agent 沙箱认证鉴权tradingview-mcp 回测数据实操指南:3 个工具 + 1 个技能,从策略指标到 AI 绩效报告
tradingview mcp 回测数据实操指南:3 个工具 + 1 个技能,从策略指标到 AI 绩效报告 Pine Script 回测跑完,Strategy
MCP 服务AI 应用人工智能金融科技CLI