
T3 Code 61c3794c のローカルパス残留。ペアリングされた filesystem:read クライアントは、絶対パスまたは ~/ パスでホストのファイルを開くことができます。書き込みはワークスペース内に留まります。ループバックラボ。
T3 Code にスマートフォンや別のマシンをペアリングすると、プロジェクトファイルを開けるようになります。その同じ許可が、あなたの SSH キーを開けてしまいます。ファイル読み取り API は絶対パスまたは ~/ パスを受け付け、書き込みが今も守っているワークスペースの境界を回避します。相対パスの ../ は引き続きブロックされます。読み取り専用の MCP エージェントにはこの許可は与えられません。
クラス: パスの取り残し
到達範囲: ローカル(ペアリング済みの filesystem:read。オーナーがそのスコープを付与していれば、ペアリング済みのスマートフォンやブラウザからも可能)
T3 Code 61c3794c - Ping
| ID | CVE 未割当 |
| クラス | パスの取り残し |
| 到達範囲 | ローカル(filesystem:read を持つペアリング済みクライアント) |
| CWE | CWE-22 / CWE-73 |
| CVSS | Medium: 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 が返却された |
~/ でホストファイルを読み取る | 同じシンクで relativePath にラボの HOME 配下の ~/.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 は依然としてワークスペース相対パスを送信します。サーバーは、正規のクライアントが生成しない入力を受け入れます。標準のペアリングにはシェルも含まれます。
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 を 61c3794c で lab/src にクローンし、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 にお願いします。