abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-mount-dehydrate
クラス: 特権の残留 到達範囲: ローカル
VFS for Git master ab95cf51 (タグ v2.0.26259.1) - Microsoft
CreatePipeByName は、enlistment ごとのマウントパイプ上で BUILTIN\Users に ReadWrite | CreateNewInstance を付与する。所有者 SID のチェックも ImpersonateNamedPipeClient も存在しない。HandleDehydrateFolders は攻撃者のフォルダ名を Path.Combine し、ProcessStartInfo.Arguments 経由で git に渡す。CLI の dehydrate パスは IsFolderValid を実行する。マウントハンドラは実行しない。
Users 内で \\.\pipe\GVFS_<ENLISTMENT> を推測できる者は誰でも、ProjFS をアンマウントし、マウントユーザーとしてディレクトリを移動し、git reset HEAD --hard を強制できる。
| ID | CVE 未割当 |
| クラス | 特権の残留 (名前付きパイプ ACL) / パストラバーサル / 引数インジェクション |
| 到達範囲 | ローカル |
| CWE | CWE-284, CWE-22, CWE-88 |
| CVSS | High: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 製品 | VFS for Git |
| 影響を受けるバージョン | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a; インストーラタグ v2.0.26229.1 / v2.0.26259.1。Windows のみ。 |
| 認証 | ローカル。被害者にマウントがある間の任意の BUILTIN\Users プリンシパル |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ。how=gadget (Windows VM / 実 ProjFS なし)。 |
パイププロトコル: UTF-8 の Header または Header|body、バイト 0x03 で終端。パイプ名は GVFS_ + 大文字化された enlistment ルートで、: は _ に置換される (例 C:\Repos\Foo -> \\.\pipe\GVFS_C_\REPOS\FOO)。
被害者は既知のルートで gvfs mount を実行している。攻撃者は同じマシン上の別の Users プリンシパルである。被害者としての完全性と可用性。SYSTEM ではない。それ自体ではシェルではない。
| 特権 | メソッド / シンク | 付与されるもの | 偵察 / 完全性 / 可用性 | ラボ実証済みか推測か |
|---|---|---|---|---|
| 被害者のマウントパイプに接続 | CreatePipeByName ACL BuiltinUsers ReadWrite | CreateNewInstance; 所有者チェックなし | マウント IPC と対話 | パイプの偵察 | ラボ実証済み (gadget ACL)。攻撃者 SID が受け入れられる; 所有者のみモードは接続拒否を返す |
| enlistment パス、キャッシュパス、RepoUrl を読み取る | GetStatus | 残留 #1 / #4 に使うルートを漏洩 | 偵察 | ラボ実証済み。ステータス JSON に RepoUrl と GVFS_C_\REPOS\FOO が含まれていた |
ProjFS をアンマウントし gvfs.mount を終了 | メッセージ Unmount | enlistment を停止 | 可用性 | ラボ実証済み。Ack の後に Complete を返信; マウント状態は Unmounted |
| パース失敗時にアンマウント | 空ボディの ReleaseLock -> RequestData == null -> UnmountAndStopWorkingDirectoryCallbacks + Environment.Exit | 同じアンマウントに加えてプロセス終了 | 可用性 | ラボ実証済み。空の ReleaseLock| でアンマウントされた |
| 被害者の作業ツリーを破棄 | Dehydrate|{"Folders":"--hard",...}。ソースディレクトリが存在しなくても movedFolders.Add。Reset("HEAD", "\"--hard\" ") はクォート除去後に git reset HEAD --hard になる | ダーティな追跡ファイルを破壊 | 完全性 / 可用性 | ラボ実証済み。ダーティな追跡ファイルが witness 文字列を失った |
| 被害者としてフォルダを作業ツリー外へ移動 | Path.Combine(WorkingDirectoryBackingRoot, folder) + MoveDirectory で BackupFolderPath へ | 作業ツリーフォルダを窃取 / 移転 | 完全性 | ラボ実証済み。keepme が src から消え、攻撃者のバックアップパスの下に現れた |
.. をトラバース (CLI の IsFolderValid は使われない) | 同じ Combine; ..\secret | マウントユーザーが書き込める兄弟を移動 | 完全性 | ラボ実証済み。兄弟の secret が攻撃者のバックアップパスの下に着地した。IsFolderValid を適用するとブロックされた |
| 他の被害者が書き込めるディレクトリを窃取または破壊 | enlistment 外に解決される ..\ チェーンを使った同じ移動 | マウントユーザーとしてのより広範な移動 | 完全性 | Combine からの推測。このラボは使い捨てツリーのみを使用 |
| 被害者としてのコード実行 | このパイプ | 攻撃者イメージのプロセス生成 | 完全性 | クローズ。この残留での攻撃者イメージのプロセス生成はなし (vfs-service-sid と vfs-hook-impersonate を参照) |
| SYSTEM | マウント IPC | LocalSystem | 完全性 | クローズ。マウントは enlistment ユーザーとして実行される |
--hard は .. パスではない。CLI の IsFolderValid は依然としてこれを許可する。修正ではオプション風のフォルダ名も拒否する必要がある。
同じピンでの残留: vfs-quote-breakout, vfs-clone-acl, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd。
2026-09-28 のマージ後に VFSForGit master ab95cf51 をピン留めした。サービスパイプと enlistment ごとのマウントパイプは CreatePipeByName を共有している。CLI の dehydrate はフォルダを検証する。マウントハンドラは検証しない。
すでに記録済みの誤った道: --hard をパストラバーサルとして扱うこと (これはクォート除去後の引数インジェクションである); SYSTEM の主張; リバースシェル。すべて見せかけである。ネイティブ Windows がなかったため、ラボはこれらの関数の gadget と使い捨ての git ツリーで構成されている。
python3 vfs-mount-dehydrate-Abraxas-Labs.py
または
cd lab
./run.sh
127.0.0.1:19640 でパイプメッセージ形式を話す gadget HTTP。コンテナ内の使い捨て git ツリー。リバースシェルなし。実際のプロファイルパスなし。最終行は how=gadget を使用。
SUCCESS vfs-mount-dehydrate how=gadget unmount=yes reset-hard=yes dirty-gone=yes move-inside=yes move-dotdot=yes pipe-acl=users-no-owner is-folder-valid-not-on-pipe=yes VFS-MOUNT-DEHYDRATE-WITNESS
CreatePipeByName を enlistment 所有者 SID と LocalSystem に制限する。Users に対する CreateNewInstance を削除する。クライアントを偽装し、所有者を要求する。HandleDehydrateFolders で IsFolderValid を複製し、git オプションに見える名前を拒否する。ReleaseLock のパース失敗をプロセス終了として扱わない。
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3aWindowsPlatform.cs CreatePipeByNameInProcessMount.cs dehydrate / unmount / ReleaseLockDehydrateVerb.cs IsFolderValidGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。