
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-service-sid
クラス: 権限の取り残し 到達範囲: ローカル
VFS for Git master ab95cf51 (タグ v2.0.26259.1) - Microsoft
GVFS.Service は LocalSystem として実行される。WindowsPlatform.CreatePipeByName は GVFS.Service.pipe に対して BUILTIN\Users に ReadWrite | CreateNewInstance を付与する。RegisterRepoHandler.Run は JSON の OwnerSID をそのまま保存する。ImpersonateNamedPipeClient を呼び出すものは何もない。
任意の Users プリンシパルが、被害者の SID の下に攻撃者のパスを登録できる。SessionLogon 時にサービスは CreateProcessAsUser で gvfs mount <攻撃者のパス> を被害者として実行する。子プロセスは NT AUTHORITY\SYSTEM ではない。
| ID | CVE はまだなし |
| クラス | 権限の取り残し (認可の欠如 / クロスユーザー実行) |
| 到達範囲 | ローカル |
| CWE | CWE-862, CWE-284 |
| CVSS | Medium: 6.6 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N |
| 製品 | VFS for Git |
| 影響を受ける | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a; GitHub タグ v2.0.26229.1 / v2.0.26259.1。Windows のみ。 |
| 認証 | ローカル。任意の BUILTIN\Users プリンシパル。自動マウントには被害者のログオンが必要。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ。how=gadget (実際の Windows GVFS.Service はなし)。 |
Git 2.35+ の dubious-ownership により、攻撃者が所有するツリー内で git が失敗する可能性がある。それでもプロセスは被害者として起動する。パスが被害者所有だが攻撃者が書き込み可能な場合 (vfs-clone-acl)、mount git、credential.helper、フックはそのユーザーとして実行される。
サービスがインストールされているマシン上の任意の BUILTIN\Users プリンシパル。\\.\pipe\GVFS.Service.pipe に接続する。追加の権限は不要。
| 権限 | メソッド / シンク | 付与されるもの | 偵察 / 完全性 / 可用性 | ラボ実証済みまたは推測 |
|---|---|---|---|---|
| すべてのアクティブなエンリストメントルートを列挙 | SID チェックなしの GetActiveRepoListRequest (GetActiveReposForUser ではなく TryGetActiveRepos) | 取り残し #2 のパイプ名オラクルとして使われるパス | 偵察 | ラボ実証済み。ガジェットが /lab/repos/victim を列挙 |
| 被害者のエンリストメントを非アクティブ化して自動マウントさせない | SID チェックなしの UnregisterRepoRequest {EnlistmentRoot} (TryDeactivateRepo) | 被害者のリポジトリがマウントされないままになる | 可用性 | ラボ実証済み。アクティブリストから被害者の行が消えた |
| 被害者 SID の下に攻撃者のパスを永続化 | RegisterRepoRequest JSON EnlistmentRoot + OwnerSID; TryRegisterRepo が両方を保存 | レジストリ行 攻撃者パス + 被害者 SID | 完全性 | ラボ実証済み。レジストリ行 /lab/repos/attacker + S-1-5-21-1000-2000-3000-1001 |
ログオン時に被害者として GVFS.exe mount <攻撃者のパス> を起動 | OnSessionChange SessionLogon -> AutoMountRepos(userId) -> TryRunAs / CreateProcessAsUser | ログオンユーザーとしてのクロスユーザープロセス生成 | 完全性 | ガジェットでラボ実証済み。親 GVFS.Service を生成、argv mount /lab/repos/attacker、uid 1002 victim、witness 書き込み済み |
| NT AUTHORITY\SYSTEM として実行 | 同じ自動マウント | LocalSystem の子プロセス | 完全性 | クローズ。子の whoami は被害者であり SYSTEM ではない (child-not-system=yes) |
攻撃者が所有するツリー内で被害者として Git / フック / credential.helper | プロセス生成は依然として発生; git 2.35+ の safe.directory は失敗する可能性 | ツリーが被害者所有だが攻撃者が書き込み可能な場合、被害者としてのフック RCE | 完全性 | 推測。ラボは Microsoft git を実行していない。フック RCE にはパスを被害者所有だが攻撃者が書き込み可能としてバインドする |
このピンでクローズ: リモートの未認証アクセス (名前付きパイプはローカル)。SYSTEM シェル。デフォルトのパイプ ACL は依然として Users を許可する; クライアント SID をバインドするパッチ済み register (ガジェット X-Patched: 1) は被害者のために攻撃者パスを自動マウントしない。
同じピンの取り残し: vfs-quote-breakout, vfs-mount-dehydrate, vfs-clone-acl, vfs-hook-impersonate, vfs-install-cwd。
2026-09-28 のマージ後に VFSForGit master ab95cf51 をピン留めした。サービスのパイプ ACL は Users ReadWrite。Register は JSON OwnerSID を保存する。SessionLogon はその SID として自動マウントする。パイプクライアントを偽装するものは何もない。
すでに記録済みの誤った道: これを SYSTEM シェルと呼ぶこと (自動マウントはログオントークンの CreateProcessAsUser); git safe.directory を IPC の認可として扱うこと; リバースシェル。茶番。ネイティブ Windows がなかったため、ラボはピンハンドラのガジェットと Unix TCP オラクルである。
python3 vfs-service-sid-Abraxas-Labs.py
または
cd lab
./run.sh
ガジェット HTTP は 127.0.0.1:19660。Witness VFS-SERVICE-SID-WITNESS。最終行は how=gadget を使用。
SUCCESS vfs-service-sid how=gadget register-forged-sid=yes automount-as-victim=yes child-not-system=yes VFS-SERVICE-SID-WITNESS
名前付きパイプクライアントを偽装する (ImpersonateNamedPipeClient / NamedPipeServerStream.RunAsClient)。JSON OwnerSID を無視する; TryRegisterRepo をクライアント SID にバインドする。CreatePipeByName を対話ユーザーと LocalSystem に制限する (BuiltinUsersSid の ReadWrite / CreateNewInstance を削除)。GetActiveRepoList はそのクライアントのリポジトリのみを返すべきである。UnregisterRepo は同じ SID 一致を要求すべきである。
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3aWindowsPlatform.cs Users ACL と {serviceName}.pipeRegisterRepoHandler.csNamedPipeMessages.cs クライアント提供の SID フィールドRepoRegistry.cs 永続化と AutoMountReposGVFSMountProcess.cs TryRunAs(..., "mount", repoRoot, ...)GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。