
VFS for Git ab95cf51 - 높음 - 로컬 - 권한 잔여 - 사용자 마운트 파이프 dehydrate/unmount
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-mount-dehydrate
분류: 권한 잔여물 도달 범위: 로컬
VFS for Git master ab95cf51 (태그 v2.0.26259.1) - Microsoft
enlistment별 마운트 파이프의 CreatePipeByName은 BUILTIN\Users에게 ReadWrite | CreateNewInstance를 부여한다. 소유자 SID 검사도 없고 ImpersonateNamedPipeClient도 없다. HandleDehydrateFolders는 공격자가 제어하는 폴더 이름을 Path.Combine하고 ProcessStartInfo.Arguments를 통해 git에 전달한다. CLI dehydrate 경로는 IsFolderValid를 실행한다. 마운트 핸들러는 실행하지 않는다.
\\.\pipe\GVFS_<ENLISTMENT>를 추측할 수 있는 Users 그룹의 누구든 ProjFS를 언마운트하고, 마운트 사용자 권한으로 디렉터리를 이동시키고, git reset HEAD --hard를 강제할 수 있다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔여물 (named-pipe ACL) / 경로 순회 / 인자 주입 |
| 도달 범위 | 로컬 |
| CWE | CWE-284, CWE-22, CWE-88 |
| CVSS | High: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 제품 | VFS for Git |
| 영향 받음 | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a; 설치 프로그램 태그 v2.0.26229.1 / v2.0.26259.1. Windows 전용. |
| 인증 | 로컬. 피해자가 마운트를 보유한 동안 임의의 BUILTIN\Users 주체 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용. how=gadget (Windows VM / 라이브 ProjFS 없음). |
파이프 프로토콜: UTF-8 Header 또는 Header|body, 바이트 0x03으로 종료. 파이프 이름은 GVFS_ + 대문자로 변환된 enlistment 루트에서 :를 _로 치환한 것 (예: C:\Repos\Foo -> \\.\pipe\GVFS_C_\REPOS\FOO).
피해자가 알려진 루트에서 gvfs mount를 실행 중이다. 공격자는 같은 머신의 다른 Users 주체다. 피해자 권한으로 무결성과 가용성에 영향. SYSTEM은 아님. 그 자체로 셸은 아님.
| 권한 | 메서드 / 싱크 | 부여하는 것 | 정찰 / 무결성 / 가용성 | 랩 입증 또는 추론 |
|---|---|---|---|---|
| 피해자 마운트 파이프에 연결 | CreatePipeByName ACL BuiltinUsers ReadWrite | CreateNewInstance; 소유자 검사 없음 | 마운트 IPC와 대화 | 파이프 정찰 | 랩 입증 (gadget ACL). 공격자 SID 허용됨; 소유자 전용 모드는 연결 거부 반환 |
| enlistment 경로, 캐시 경로, RepoUrl 읽기 | GetStatus | 잔여물 #1 / #4에 사용되는 루트 유출 | 정찰 | 랩 입증. Status JSON에 RepoUrl과 GVFS_C_\REPOS\FOO 포함됨 |
ProjFS 언마운트 및 gvfs.mount 종료 | 메시지 Unmount | enlistment 중단 | 가용성 | 랩 입증. Ack 후 Complete 응답; 마운트 상태 Unmounted |
| 파싱 실패 시 언마운트 | 빈 본문의 ReleaseLock -> RequestData == null -> UnmountAndStopWorkingDirectoryCallbacks + Environment.Exit | 동일한 언마운트에 더해 프로세스 종료 | 가용성 | 랩 입증. 빈 ReleaseLock|이 언마운트함 |
| 피해자 작업 트리 폐기 | Dehydrate|{"Folders":"--hard",...}. 소스 디렉터리가 없어도 movedFolders.Add. Reset("HEAD", "\"--hard\" ")는 따옴표 제거 후 git reset HEAD --hard가 됨 | 변경된 추적 파일 파괴 | 무결성 / 가용성 | 랩 입증. 변경된 추적 파일이 witness 문자열을 잃음 |
| 피해자 권한으로 작업 트리 밖으로 폴더 이동 | Path.Combine(WorkingDirectoryBackingRoot, folder) + MoveDirectory로 BackupFolderPath로 이동 | 작업 트리 폴더 탈취 / 재배치 | 무결성 | 랩 입증. keepme가 src를 떠나 공격자 백업 경로 아래에 나타남 |
.. 순회 (CLI IsFolderValid는 사용되지 않음) | 동일한 Combine; ..\secret | 마운트 사용자가 쓸 수 있는 형제 디렉터리 이동 | 무결성 | 랩 입증. 형제 secret이 공격자 백업 경로 아래에 위치. IsFolderValid 적용 시 차단됨 |
| 다른 피해자 쓰기 가능 디렉터리 탈취 또는 파괴 | enlistment 밖으로 해석되는 ..\ 체인을 사용한 동일한 이동 | 마운트 사용자 권한으로 더 광범위한 이동 | 무결성 | Combine에서 추론. 이 랩은 일회용 트리만 사용 |
| 피해자 권한으로 코드 실행 | 이 파이프 | 공격자 이미지의 프로세스 생성 | 무결성 | 종결. 이 잔여물에서 공격자 이미지의 프로세스 생성은 없음 (vfs-service-sid 및 vfs-hook-impersonate 참조) |
| SYSTEM | 마운트 IPC | LocalSystem | 무결성 | 종결. 마운트는 enlistment 사용자로 실행됨 |
--hard는 .. 경로가 아니다. CLI IsFolderValid는 여전히 이를 허용한다. 수정은 옵션처럼 보이는 폴더 이름도 거부해야 한다.
동일 핀 잔여물: vfs-quote-breakout, vfs-clone-acl, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd.
2026-09-28 머지 후 VFSForGit master ab95cf51을 핀했다. 서비스 파이프와 enlistment별 마운트 파이프는 CreatePipeByName을 공유한다. CLI의 Dehydrate는 폴더를 검증한다. 마운트 핸들러는 하지 않는다.
이미 기록된 잘못된 방향: --hard를 경로 순회로 취급 (따옴표 제거 후 인자 주입이다); SYSTEM 주장; 리버스 셸. 극장. 네이티브 Windows가 없어서 랩은 해당 함수들의 gadget과 일회용 git 트리로 구성된다.
python3 vfs-mount-dehydrate-Abraxas-Labs.py
또는
cd lab
./run.sh
127.0.0.1:19640에서 파이프 메시지 형태를 말하는 Gadget HTTP. 컨테이너 내부의 일회용 git 트리. 리버스 셸 없음. 실제 프로필 경로 없음. 마지막 줄은 how=gadget을 사용.
SUCCESS vfs-mount-dehydrate how=gadget unmount=yes reset-hard=yes dirty-gone=yes move-inside=yes move-dotdot=yes pipe-acl=users-no-owner is-folder-valid-not-on-pipe=yes VFS-MOUNT-DEHYDRATE-WITNESS
CreatePipeByName을 enlistment 소유자 SID와 LocalSystem으로 제한한다. Users에 대한 CreateNewInstance를 제거한다. 클라이언트를 임퍼소네이트하고 소유자를 요구한다. HandleDehydrateFolders에서 IsFolderValid를 복제하고 git 옵션처럼 보이는 이름을 거부한다. ReleaseLock 파싱 실패를 프로세스 종료로 취급하지 않는다.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3aWindowsPlatform.cs CreatePipeByNameInProcessMount.cs dehydrate / unmount / ReleaseLockDehydrateVerb.cs IsFolderValidGNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.