
VFS for Git ab95cf51 - High - Remote - 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 경로의 마지막 세그먼트를 기본 enlistment 폴더로 사용하며 따옴표를 제거하지 않습니다. 이어서 RequiredGitConfig는 core.virtualfilesystem을 순진하게 단일 인용부호로 감싼 훅 경로로 기록합니다. microsoft/git은 이 값을 use_shell=1로 실행합니다. 제품 주석은 심지어 bash를 언급합니다.
마지막 세그먼트가 pwn';witness;'인 클론 URL은 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe'가 됩니다. bash는 세 개의 명령으로 인식합니다. 가운데 명령은 클론한 사용자 권한으로 실행됩니다.
| ID | 아직 CVE 없음 |
| 분류 | RCE (core.virtualfilesystem의 단일 인용부호 래핑) |
| 도달 범위 | 원격 (공격자 URL을 UI:R로 클론하거나, 조작된 디렉터리에서 로컬 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도 아닙니다.
| 권한 | 메서드 / 싱크 | 부여하는 것 | 무결성 / 가용성 | 랩 입증 또는 추론 |
|---|---|---|---|---|
| enlistment 폴더 이름 선택 | 대상 없는 gvfs clone <url>의 마지막 경로 세그먼트 (CloneVerb.GetCloneRoot) | 디렉터리 이름이 공격자 선택. Windows는 '와 ; 허용 | 대상 경로의 무결성 | 복사된 대상 헬퍼에서 랩 입증. URL .../pwn';witness;'가 C:\temp\pwn';witness;'가 됨 |
core.virtualfilesystem 탈출 | RequiredGitConfig의 "'" + ConvertPathToGitFormat(hook) + "'" 래핑 | 설정 값이 하나의 경로가 아닌 세 개의 셸 토큰 | 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를 기록. 첫 번째와 세 번째 토큰은 존재하지 않는 경로 (rc 127) |
| worktree에서 동일한 래핑 | Program.Worktree.cs -c core.virtualfilesystem="'<path>'" | 클론 URL 없이 동일한 탈출 | 무결성 | 핀 소스에서 추론. 실행되지 않음 |
이후 git status / mount에서 반복 | 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)입니다. 열 번의 헌트. 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 참조. 루프백 랩 전용. 보증 없음.