
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-hook-impersonate
クラス: 特権の残存 到達範囲: ローカル
VFS for Git master ab95cf51 (タグ v2.0.26259.1) - Microsoft
ネイティブ git フック (read-object、virtual-filesystem、post-index-changed) は、CreateFileW と dwFlagsAndAttributes = 0 で、enlistment ごとのマウントパイプを開きます。これにより SECURITY_SQOS_PRESENT が省略されるため、Windows はクライアントをデフォルトで SecurityImpersonation に設定します。残存 #2 が使用するのと同じパイプ ACL は、BUILTIN\Users に ReadWrite | CreateNewInstance を付与します。
2 人目のローカルユーザーは、\\.\pipe\GVFS_<ENLISTMENT> を追加インスタンス化または占有し、ImpersonateNamedPipeClient を実行して、被害者として書き込むことができます。
| ID | CVE 未割り当て |
| クラス | 特権の残存 (名前付きパイプの偽装) |
| 到達範囲 | ローカル |
| CWE | CWE-284, CWE-300 |
| CVSS | High: 7.1 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 製品 | VFS for Git |
| 影響を受けるバージョン | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (リリース v2.0.26259.1 に対しても現行)。Windows のみ。 |
| 認証 | ローカル。被害者は GVFS enlistment を持つ。攻撃者は任意の BUILTIN\Users プリンシパル。被害者は後で git を実行する。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ。how=gadget (ライブ Windows VM / インストール済み VFS for Git なし)。 |
これはローカルです。SYSTEM ではありません。残存 #4 の Automount は別のパイプ (GVFS.Service.pipe) です。この同じマウントパイプ上の Dehydrate/unmount は残存 #2 です。
被害者は GVFS enlistment を持つ。攻撃者は任意の BUILTIN\Users プリンシパル。被害者は後で git を実行する (status、checkout、VFS フックを発火させるあらゆる操作)。
| 特権 | メソッド / シンク | 付与されるもの | 偵察 / 完全性 / 可用性 | ラボ実証済みまたは推測 |
|---|---|---|---|---|
| 被害者を偽装してそのプロファイルに書き込む | \\.\pipe\GVFS_C_\REPOS\FOO を追加インスタンス化 / 占有; フック CreateFileW flags=0; ImpersonateNamedPipeClient; %USERPROFILE%\VFS-HOOK-IMPERSONATE-WITNESS を作成 | 被害者 UID として書き込み | 完全性 | ガジェット上でラボ実証済み。Witness の所有者は被害者 uid。デフォルトフラグは SecurityImpersonation。攻撃者 uid は偽装なしではそのホームに書き込めない |
| 占有後も git を動作させ続ける | MPL|1 に S|\x03 を返信し、GVFS.VirtualFileSystemHook がハングしないようにする | Git が継続 | 被害者 git の可用性 | ラボ実証済み。脆弱パスとパッチ適用パスの両方でフック reply_ok |
| enlistment ルートからパイプ名を推測する | GetGVFSPipeName が CWD から .gvfs まで遡り、CharUpper、: -> _、プレフィックス \\.\pipe\GVFS_ | 推測可能な IPC 名 | 偵察 | ラボ実証済み。C:\Repos\Foo\src -> \\.\pipe\GVFS_C_\REPOS\FOO |
| ライブインスタンスを奪取せずにパイプを再ターゲットする | 追跡対象の src\.gvfs ディレクトリを設置し、遡りが別の名前をバインドするようにする | マウントと競合せずに占有 | 完全性 | common.windows.cpp の遡りから推測。ラボでは実際の enlistment .gvfs を使用 |
MPL だけでなく DLO / PICN にも応答する | 同じパイプ、ReadObjectHook / PostIndexChangedHook | オブジェクトについて偽る / skip-worktree | 完全性 | 推測。ラボは MPL|1 のみ送信 |
2 バイトの S\x03 でフックをクラッシュさせる | VirtualFileSystemHook の messageLength -= 2 の後 -= 1 でアンダーフローし、fwrite が約 4GiB を書き込む | クラッシュ / OOB 読み取り | 可用性 | main.cpp 69-90 から推測。これはオラクルではない。このクラッシュを出荷しないこと |
ここで除外: SYSTEM (マウントは enlistment ユーザー)。リモート未認証 RCE。ライブ Windows VM / インストール済み VFS for Git (このラボはコピーされた関数のガジェット)。
同じピンの残存: vfs-quote-breakout、vfs-mount-dehydrate、vfs-clone-acl、vfs-service-sid、vfs-install-cwd。
2026-09-28 のマージ後、VFSForGit master ab95cf51 をピン留めしました。ネイティブフックは flags 0 で CreateFileW を呼びます。すると Windows はデフォルトで SecurityImpersonation になります。マウントパイプはすでに Users に追加インスタンス化を許可しています。これが残存です。
すでに記録済みの誤った道: これを残存 #2 の dehydrate として扱う (同じ ACL、異なるシンク: トークンであり、MoveDirectory ではない); SYSTEM と主張する; 4GiB アンダーフローをオラクルとして出荷する。茶番です。ネイティブ Windows が欠けていたため、ラボはそれらの関数のガジェットです。Unix ソケットが名前付きパイプの代役を務めます。
python3 vfs-hook-impersonate-Abraxas-Labs.py
または
cd lab
./run.sh
ガジェット HTTP は 127.0.0.1:19670。GetGVFSPipeName、CreatePipeToGVFS のフラグ、Users の CreateNewInstance ACL、および MPL|1 / S| フックプロトコルをコピーします。SQOS identification を備えたパッチ適用済みクライアントは witness に書き込みません。最終行は how=gadget を使用します。
SUCCESS vfs-hook-impersonate how=gadget createfile-flags=0 impersonation=SecurityImpersonation extra-instance=yes owner=victim patched-sqos-ident-no-write=yes VFS-HOOK-IMPERSONATE-WITNESS
フックの CreateFileW で SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION を渡します。CreatePipeByName を enlistment 所有者 SID と LocalSystem に制限します。Users に対する CreateNewInstance を削除します。フック応答長を境界チェックします。
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3acommon.windows.cpp CreatePipeToGVFSWindowsPlatform.cs CreatePipeByNameGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。