你将手机或第二台机器配对到 T3 Code,以便它能打开项目文件。而同一项授权也能打开你的 SSH 密钥。文件读取 API 接受绝对路径或 ~/ 路径,并跳过写入操作仍然遵守的工作区边界限制。相对路径 ../ 仍会被阻止。只读的 MCP 代理不会获得此授权。
类别: 路径遗留问题
可达性: 本地(已配对的 filesystem:read;若所有者授予了该作用域,也可通过已配对的手机或浏览器触发)
T3 Code 61c3794c - Ping
| ID | 暂无 CVE |
| 类别 | 路径遗留问题 |
| 可达性 | 本地(持有 filesystem:read 的已配对客户端) |
| CWE | CWE-22 / CWE-73 |
| CVSS | 中危:6.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N |
| 产品 | T3 Code |
| 受影响版本 | 61c3794c32b0eeebfac09add43e403618c65d2d7(v0.1.6 之后) |
| 认证 | 持有 filesystem:read 的已配对会话或标准授权会话 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 针对 WorkspaceFileSystem 的环回 Vitest;未涉及生产主机 |
需要一个已持有 filesystem:read 的凭据。默认配对包含该作用域,还包含 terminal:operate。访客共享无法触达此 RPC。MCP 只读仅有 orchestration:read。
| 权限 | 方法 / 汇聚点 | 侦察 / 完整性 / 可用性 | 实验验证或推断 |
|---|---|---|---|
| 通过绝对路径读取主机文件 | WorkspaceFileSystem.readFile / RPC projectsReadFile,将 relativePath 设为绝对路径 | 侦察(主机文件) | 实验验证。见证 t3f01w8k2 已返回 |
通过 ~/ 读取主机文件 | 同一汇聚点,在实验 HOME 下将 relativePath 设为 ~/.lab-secret | 侦察 | 实验验证。同一见证 |
| 为绝对媒体路径生成签名资源 URL | assetsCreateUrl media-file | 侦察 | 由源码推断。非本实验的判定依据 |
阴性对照:相对路径 ../ | readFile 使用走出工作区的路径 | 不适用 | 实验验证。WorkspacePathOutsideRootError |
| 阴性对照:绝对路径写入 | writeFile 使用同一绝对机密路径 | 不适用 | 实验验证。被拒绝,机密未变 |
| 阴性对照:MCP 只读 | mcpClientScopes("read-only") 对比 projectsReadFile | 不适用 | 实验验证。被拒绝 |
在此遗留问题下仍保持关闭
| 维度 | 方法 / 汇聚点 | 为何关闭 |
|---|---|---|
| 完整性 | 通过绝对路径进行工作区写入 | resolveWriteTarget 限制在真实根目录内并拒绝 .git |
| 侦察 | 相对路径 ../ 读取 | resolveRelativePathWithinRoot |
| 侦察 | T3 secretsDir 与 stateDir/*.sqlite | isServerInternalPath |
| 侦察 | 访客共享 HTTP | 访客令牌从不进入 SessionStore |
| 侦察 | MCP 只读 /mcp | 无 filesystem:read |
| 完整性 | 未认证的环回 RPC | EnvironmentAuthPolicy 不为 unsafe-no-auth |
产品文档(docs/internals/environment-auth.md)将 filesystem:read 描述为主机读取授权。UI 仍发送工作区相对路径。服务器接受了合法客户端不会产生的输入。标准配对还包含一个 shell。
我固定了 pingdotgg/t3code 61c3794c。resolveReadTarget 会展开 ~/,对绝对路径执行 realpath,并在没有 isInsideRealRoot 的情况下返回它。写入操作会执行该检查。公开 issue #316 仅关闭了写入操作上不受约束的 cwd。
错误方向:将 MCP 只读视为 projectsReadFile 的调用方(并非如此);将此视为未认证的遗留问题(它是已配对授权)。
python3 t3code-abspath-host-read-Abraxas-Labs.py
或:
cd lab
./run.sh
将 pingdotgg/t3code 克隆到 lab/src 的 61c3794c 提交,使用 pnpm 安装,在 lab-home/.lab-secret 下放置一个见证文件,并运行 Vitest。仅限回环地址。Node 26 和 pnpm 12。
IOC abs-read=1
IOC home-read=1
IOC rel-escape=0
IOC write-abs=refused
IOC mcp-readonly-filesystem=denied
IOC secret-unchanged=1
SUCCESS T3-F01-ABSPATH t3f01w8k2
在 realpath 之后,按照 resolveWriteTarget 已有的做法,要求目标位于 realpath(cwd) 之内。在读取和元数据操作时调用 knownWorkspaces.assertContains(input.cwd)。停止为没有项目的绝对路径生成 media-file URL。将 isServerInternalPath 扩展到整个 stateDir。
61c3794c32b0eeebfac09add43e403618c65d2d7WorkspaceFileSystem.resolveReadTargetGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。
Abraxas Labs [email protected]
请将 CVE 致谢归于 Abraxas Labs。