
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。
一个克隆 URL,其最后一段为 pwn';witness;',会变成 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe'。bash 会看到三条命令。中间那条以克隆该仓库的用户身份运行。
| ID | 暂无 CVE |
| 类别 | RCE(core.virtualfilesystem 的单引号包裹) |
| 可达性 | 远程(UI:R 克隆攻击者 URL,或在构造的目录下本地执行 git worktree add) |
| CWE | CWE-78、CWE-116 |
| CVSS | 高危: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) + "'" | 配置值是三个 shell 令牌,而非一个路径 | git 配置的完整性 | 实验验证。包裹结果为 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe' |
| 以克隆者身份运行额外的 shell 命令 | microsoft/git virtualfilesystem.c use_shell=1(对配置值执行 bash -c) | 以克隆者 UID 执行任意主机命令 | 克隆者会话的完整性 / 可用性 | 在 gadget 上实验验证。witness 写入了 VFS-VFS-QUOTE-WITNESS。第一个和第三个令牌是缺失的路径(rc 127) |
| 在 worktree 上同样的包裹 | Program.Worktree.cs -c core.virtualfilesystem="'<path>'" | 无需克隆 URL 的相同突破 | 完整性 | 从固定源码推断。未执行 |
在后续 git status / 挂载时重复 | InProcessMount.TrySetRequiredGitConfigSettings 重新应用该包裹 | 后续 git 也会 shell 执行恶意值 | 完整性 | 推断。未执行 |
本次遗留问题中已排除:实时 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)。十次搜寻。ProjFS 水合、GPRE 解析器、缓存 URL、FastFetch 和 gvfs upgrade 在此标准下均无发现。
然后我盯上了 RequiredGitConfig。注释记录了 bash。包裹并未转义 '。CloneVerb 使用 URL 最后一段作为目标路径。这就是遗留问题。
已记录的弯路:将不含引号的目标路径视为漏洞(并非如此);声称 SYSTEM;反弹 shell。都是表演。缺少原生 Windows,因此实验环境是该包裹加上 bash -c 的 gadget。
python3 vfs-quote-breakout-Abraxas-Labs.py
或
cd lab
./run.sh
Gadget HTTP 位于 127.0.0.1:19630。复制包裹和目标辅助程序,然后以 PATH 限制为写入 oracle 的 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。仅限回环实验环境。无担保。