
VFS for Git ab95cf51 - 高 - リモート - RCE - core.virtualfilesystem シングルクォートラップ
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-quote-breakout
クラス: RCE 到達範囲: リモート
VFS for Git master ab95cf51 (タグ v2.0.26259.1) - Microsoft
CloneVerb.GetCloneRoot は URL の最後のパスセグメントをデフォルトのエンリストメントフォルダとして使用し、引用符を除去しない。RequiredGitConfig はその後、core.virtualfilesystem を単純なシングルクォートで囲んだフックパスとして書き込む。microsoft/git はその値を use_shell=1 で実行する。製品のコメントには bash と明記されている。
最後のセグメントが pwn';witness;' であるクローン URL は 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe' になる。bash はこれを 3 つのコマンドとして解釈する。中央のコマンドはクローンを実行したユーザーとして実行される。
| ID | CVE 未割当 |
| クラス | RCE (core.virtualfilesystem のシングルクォートラップ) |
| 到達範囲 | リモート (UI:R 攻撃者 URL のクローン、または細工されたディレクトリ配下でのローカル git worktree add) |
| CWE | CWE-78, CWE-116 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| 製品 | VFS for Git (microsoft/git が必要) |
| 影響 | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (タグ v2.0.26259.1)。Windows のみ。 |
| 認証 | 被害者が攻撃者 URL をクローン (または細工されたディレクトリ配下で git worktree add) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ。how=gadget (Windows VM / ライブ ProjFS なし)。 |
クローンまたは git を実行したユーザーとしてホストコードを実行する。SYSTEM ではない。「被害者がこの URL をクローンする」を省略した未認証 RCE でもない。
| 権限 | メソッド / シンク | 得られるもの | 偵察 / 完全性 / 可用性 | ラボ実証または推測 |
|---|---|---|---|---|
| エンリストメントフォルダ名の選択 | 宛先なしの gvfs clone <url> の最後のパスセグメント (CloneVerb.GetCloneRoot) | ディレクトリ名は攻撃者が選択。Windows は ' と ; を許可 | 宛先パスの完全性 | コピーされた宛先ヘルパーでラボ実証済み。URL .../pwn';witness;' は C:\temp\pwn';witness;' になる |
core.virtualfilesystem からの脱出 | RequiredGitConfig のラップ "'" + ConvertPathToGitFormat(hook) + "'" | 設定値は 1 つのパスではなく 3 つのシェルトークン | git 設定の完全性 | ラボ実証済み。ラップは 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe' |
| クローン実行者として追加のシェルコマンドを実行 | microsoft/git virtualfilesystem.c use_shell=1 (設定値の bash -c) | クローン実行者 UID としての任意のホストコマンド | クローン実行者セッションの完全性 / 可用性 | ガジェットでラボ実証済み。witness が VFS-VFS-QUOTE-WITNESS を書き込んだ。第 1 と第 3 のトークンは存在しないパス (rc 127) |
| worktree での同じラップ | Program.Worktree.cs -c core.virtualfilesystem="'<path>'" | クローン URL なしで同じ脱出 | 完全性 | ピンソースから推測。未実行 |
後の git status / マウントでの再実行 | InProcessMount.TrySetRequiredGitConfigSettings がラップを再適用 | 後の git も敵対的な値をシェル実行 | 完全性 | 推測。未実行 |
この残存物で未解決: ライブ ProjFS / Microsoft git / gvfs clone (このホストは macOS。how=gadget)。SYSTEM。「被害者がこの URL をクローンする」を省略した未認証 RCE。名前に ' を含まない宛先、および同じ敵対的パスを '\'' でラップした場合は witness を実行しない。
同じピンの残存物: vfs-mount-dehydrate, vfs-clone-acl, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd。
2026-09-28 のマージ後に VFS for Git master ab95cf51 をピン留めした。Microsoft は新規デプロイに Scalar を推奨している。ツリーには依然として v2.0.26259.1 タグが付いている。スキップリストは CVE-2021-47874 (このピンでのクォートされた binPath)。10 回の探索。ProjFS ハイドレーション、GPRE パーサー、キャッシュ URL、FastFetch、gvfs upgrade はこの基準では空だった。
そこで RequiredGitConfig に着目した。コメントには bash が記載されている。ラップは ' をエスケープしない。CloneVerb は URL の最後のセグメントを宛先として使用する。これが残存物である。
すでに記録済みの誤った方向: 引用符を含まない宛先をバグとして扱うこと (そうではない)、SYSTEM の主張、リバースシェル。すべて見せかけ。ネイティブ Windows がなかったため、ラボはそのラップと bash -c のガジェットである。
python3 vfs-quote-breakout-Abraxas-Labs.py
または
cd lab
./run.sh
ガジェット HTTP は 127.0.0.1:19630。ラップと宛先ヘルパーをコピーし、PATH をオラクルを書き込む witness ヘルパーに限定して /bin/bash -c を実行する。ネイティブ Windows VM は利用できなかった。最終行は how=gadget を使用。
SUCCESS vfs-quote-breakout how=gadget who=cloner naive-breakout=yes escaped-hold=yes VFS-VFS-QUOTE-WITNESS
ラップする前に ' を '\'' としてエスケープするか、use_shell の使用をやめてフックを argv[0] として渡す。' を含むクローンおよび worktree パスを拒否する。
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (タグ v2.0.26259.1)CloneVerb.cs のデフォルト宛先RequiredGitConfig.cs の ' をエスケープしないラップvirtualfilesystem.c use_shell=1ImagePathGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。