Search

Improper access control in Windows Storage VSP Driver

태그
PurpleHound
Windows
Property
345.png
작성날짜
2026/02/09

1. 개요

CVE-2025-59517은 Windows Storage Virtualization Service Provider 드라이버(storvsp.sys)에서 발견된 로컬 권한 상승 취약점이다. VSMB(Virtual SMB) 인터페이스의 파일 정보 설정 요청을 처리하는 과정에서 요청 대상에 대한 접근 제어가 부재하여 발생한다.
storvsp.sys는 가상 스토리지 서비스를 제공하는 커널 드라이버로 \Device\STORVSP\VSMB 경로를 통해 파일시스템 접근을 중개한다. 공격자는 일반 사용자 권한으로 VSMB 인터페이스를 통해 파일시스템 경로에 대한 핸들을 획득한 뒤, 파일 정보 설정 IOCTL을 통해 보호된 시스템 디렉토리에 대한 파일 이동·삭제·속성 변경을 수행할 수 있다.

2. 취약점 근본 원인 분석

항목
내용
CVE ID
CVE-2025-59517
취약 구성요소
storvsp.sys (Windows Storage VSP Driver)
취약점 유형
Elevation of Privilege
CWE 분류
CWE-284 (Improper Access Control)
CVSS v3.1 Score
7.8 (High)
CVSS Vector
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
공개일
2025년 12월 9일

2.1. CWE 분류

2.1.1. CWE-284 개요

CWE-284는 소프트웨어가 자원에 대한 접근을 적절히 제한하지 않아 인가되지 않은 사용자가 보호된 자원에 접근할 수 있는 경우를 말한다.
CWE-284 요소
취약점에서의 발현
보호 대상 자원
시스템 디렉토리 내 파일 (이동·삭제·속성 변경)
접근 제어 부재
요청자 권한 검증 없이 파일시스템 핸들 반환, 파일 객체 유효성 미검증
부적절한 속성 보호
ObjectAttributes에 OBJ_KERNEL_EXCLUSIVE 미포함
비정상 결과
일반 사용자가 커널 컨텍스트에서 보호된 디렉토리의 파일을 조작

2.2. 취약한 환경 조건

storvsp.sys는 기본 상태에서는 로드되지 않으며 다음 기능이 활성화된 경우에 한해 커널에 로드된다.
Hyper-V 역할 활성화
Windows Sandbox 활성화
WSL2 (Windows Subsystem for Linux 2) 사용
가상화 기반 보안(VBS) 활성화

3. 취약점 상세 분석

3.1. 관련 함수 호출 구조

VspVsmbFileCreate ← [1] 권한 검증 없이 파일시스템 핸들 획득 │ ├──► IoCreateFileEx ← [2] ObjectAttributes 보호 미흡 (0x240) │ ▼ VspVsmbHandleSetInformationFileRequest ← [3] 파일 정보 설정 요청 처리 │ ├──► ObDuplicateObject ← [4] 파일 핸들을 커널 컨텍스트로 복제 │ ├──► ObReferenceObjectByHandleWithTag ← [5] 파일 객체 유효성 검증 없음 │ └──► ZwSetInformationFile ← [6] 보호된 디렉토리에 파일 조작 수행
Plain Text
복사
[그림 1] 취약한 함수 호출 흐름

3.2. 취약점 패치 비교 분석

3.2.1 VspVsmbFileCreate - 패치 전 (취약)

__int64 __fastcall VspVsmbFileCreate( struct WDFREQUEST__ *a1, struct _UNICODE_STRING *a2, __int64 a3, struct _FILE_OBJECT *a4) { // ... // FILE_WRITE_DATA(0x02) 비트 확인 → RootIdentity 플래그만 설정 // 요청자 권한 검증 없음 if ( (*(_DWORD *)(v10 + 16) & 2) != 0 ) *((_BYTE *)Pool2 + 41) = 1; // ObjectAttributes: OBJ_KERNEL_EXCLUSIVE 미포함 (0x240) ObjectAttributes.Attributes = v15 & 0x40 | 0x200; Status = IoCreateFileEx((PHANDLE)Pool2 + 4, 0x100020u, &ObjectAttributes, ...); // ... }
C
복사
[코드 1] 취약한 VspVsmbFileCreate 함수 내부

3.2.2. VspVsmbFileCreate - 패치 후 (완화)

__int64 __fastcall VspVsmbFileCreate( struct WDFREQUEST__ *a1, struct _UNICODE_STRING *a2, __int64 a3, struct _FILE_OBJECT *a4) { // ... // [패치] FILE_WRITE_DATA 없이 접근 시 요청자 권한 검증 if ( (unsigned int)Feature_3553664313__private_IsEnabledDeviceUsage() ) { if ( (SecurityContext->DesiredAccess & 2) == 0 ) { if ( !VspVsmbIsUserTrusted(v33) ) // 관리자 또는 SYSTEM인지 확인 { Status = STATUS_ACCESS_DENIED; goto LABEL_73; } } } // [패치] OBJ_KERNEL_EXCLUSIVE(0x400) 추가 → 0x640 if ( (unsigned int)Feature_3553664313__private_IsEnabledDeviceUsage() ) v21 = 1536; ObjectAttributes.Attributes = v21 | 0x40; Status = IoCreateFileEx((PHANDLE)Pool2 + 4, 0x100020u, &ObjectAttributes, ...); // ... }
C
복사
[코드 2] 패치된 VspVsmbFileCreate 함수 내부

3.2.3. VspVsmbHandleSetInformationFileRequest - 패치 전 (취약)

__int64 __fastcall VspVsmbHandleSetInformationFileRequest( struct _VVSMB_SHARE_ROOT_OBJECT *a1, char a2, const struct _VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST *a3, unsigned int a4, struct _EPROCESS *a5, struct _IO_STATUS_BLOCK *a6) { // ... // ObjectAttributes: 0x240 고정 *(_QWORD *)&ObjectAttributes.Attributes = 576; v22 = IoCreateFileEx(&FileHandle, 0xC0000000, &ObjectAttributes, ...); v25 = ObDuplicateObject(v43, *((_QWORD *)a3 + 1), PsInitialSystemProcess, &Handle, ...); v26 = ObReferenceObjectByHandleWithTag(Handle, ..., &Object, 0); if ( v26 >= 0 ) { // 파일 객체 검증 없이 바로 파일 조작 수행 v28 = ZwSetInformationFile(Handle, &v47, v17, *((_DWORD *)a3 + 5), v13); } // ... }
C
복사
[코드 3] 취약한 VspVsmbHandleSetInformationFileRequest 함수 내부

3.2.4 VspVsmbHandleSetInformationFileRequest - 패치 후 (완화)

__int64 __fastcall VspVsmbHandleSetInformationFileRequest( struct _VVSMB_SHARE_ROOT_OBJECT *a1, char a2, const struct _VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST *a3, unsigned int a4, struct _EPROCESS *a5, struct _IO_STATUS_BLOCK *a6) { // ... // [패치] Rename/Disposition 요청 시 파일 조작 제한 플래그 설정 v16 = 0; if ( *((_DWORD *)a3 + 4) == 10 || *((_DWORD *)a3 + 4) == 65 ) { if ( (unsigned int)Feature_2414379322__private_IsEnabledDeviceUsage(v17) ) v16 = 1; } // [패치] ObjectAttributes 조건부 강화 (RootIdentity 기반) if ( Feature_278437177__private_IsEnabledDeviceUsage() ) ObjectAttributes.Attributes = *((_BYTE *)a1 + 41) != 0 ? 1600 : 576; v28 = ObReferenceObjectByHandleWithTag(Handle, ..., &Object, 0); if ( v28 >= 0 ) { // [패치] 파일 객체 유효성 검증 if ( (unsigned int)Feature_2414379322__private_IsEnabledDeviceUsage(v29) && v16 && !*((_BYTE *)Object + 76) ) { goto LABEL_3; // STATUS_ACCESS_DENIED } v31 = ZwSetInformationFile(Handle, ...); } // ... }
C
복사
[코드 4] 패치된 VspVsmbHandleSetInformationFileRequest 함수 내부
Microsoft는 두 함수에 걸쳐 다중 계층 패치를 적용했다. VspVsmbFileCreate에서는 FILE_WRITE_DATA 없이 접근하는 요청에 대해 VspVsmbIsUserTrusted요청자가 관리자 또는 SYSTEM인지 검증하고 OBJ_KERNEL_EXCLUSIVE(0x400)커널 모드 전용 핸들로 강화했다. VspVsmbHandleSetInformationFileRequest에서는 Feature_2414379322를 도입하여 파일 이동(Rename) 및 삭제(Disposition) 요청 시 파일 객체의 유효성을 검증하고 RootIdentity 기반으로 ObjectAttributes조건부 강화했다.

3.3. VspVsmbFileCreate 함수 분석 - 요청자 권한 검증 부재

이 함수는 사용자가 \Device\STORVSP\VSMB\* 경로로 NtCreateFile을 호출할 때 실행되며, 2단계 파일 조작에 필요한 VSMB 핸들을 획득하는 진입점이다.
__int64 __fastcall VspVsmbFileCreate( struct WDFREQUEST__ *a1, struct _UNICODE_STRING *a2, // 사용자 제공 경로 __int64 a3, struct _FILE_OBJECT *a4) { // ... // DesiredAccess의 FILE_WRITE_DATA(0x02) 비트만 확인하여 // RootIdentity 플래그 설정 — 요청자 권한 검증은 수행하지 않음 if ( (*(_DWORD *)(v10 + 16) & 4) != 0 ) *((_BYTE *)Pool2 + 40) = 1; // ReadOnly if ( (*(_DWORD *)(v10 + 16) & 1) != 0 ) *((_BYTE *)Pool2 + 42) = 1; // BackupIntent if ( (*(_DWORD *)(v10 + 16) & 2) != 0 ) *((_BYTE *)Pool2 + 41) = 1; // RootIdentity (FILE_WRITE_DATA 요청 시) // ObjectAttributes 설정 - 사용자 경로를 검증 없이 사용 ObjectAttributes.RootDirectory = 0; ObjectAttributes.Length = 48; ObjectAttributes.Attributes = v15 & 0x40 | 0x200; // 0x240 ObjectAttributes.ObjectName = a2; // 권한 검증 없이 파일시스템 경로 핸들 획득 Status = IoCreateFileEx( (PHANDLE)Pool2 + 4, 0x100020u, // SYNCHRONIZE | FILE_READ_ATTRIBUTES &ObjectAttributes, &IoStatusBlock, // ... ); // 성공 시 FileObject에 컨텍스트 저장 Status = 0; a4->FsContext = (PVOID)Pool2; // ... }
C
복사
[코드 5] 취약한 VspVsmbHandleSetInformationFileRequest 함수 내부
ObjectAttributes.Attributes에 설정되는 0x240OBJ_CASE_INSENSITIVE(0x40)OBJ_KERNEL_HANDLE(0x200)의 조합이다. OBJ_KERNEL_EXCLUSIVE(0x400)포함되지 않아 해당 핸들이 커널 모드 전용으로 보호되지 않는다.
취약 버전에서는 DesiredAccessFILE_WRITE_DATA(0x02) 비트를 확인하여 RootIdentity 플래그를 설정하지만 이는 단순한 플래그 설정일 뿐 요청자가 해당 권한을 가진 사용자인지 검증하지 않는다. 패치 버전에서는 이 분기에서 VspVsmbIsUserTrusted를 호출하여 관리자 또는 SYSTEM이 아닌 사용자의 요청을 거부한다.
결과적으로 일반 사용자도 파일시스템 경로에 대한 핸들을 획득할 수 있으며 이 핸들은 2단계에서 파일 조작의 RootDirectory로 사용된다.

3.4. VspVsmbHandleSetInformationFileRequest 함수 분석 - 파일 객체 검증 부재

이 함수는 IOCTL 0x240330을 통해 호출되며 VspVsmbFileCreate에서 획득한 VSMB 핸들을 기반으로 파일 이동·삭제·속성 변경을 수행한다. CWE-284 취약점이 발생하는 핵심 지점이다.
__int64 __fastcall VspVsmbHandleSetInformationFileRequest( struct _VVSMB_SHARE_ROOT_OBJECT *a1, char a2, const struct _VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST *a3, unsigned int a4, struct _EPROCESS *a5, struct _IO_STATUS_BLOCK *a6) { // ... // RootIdentity(a1+41) 설정 시 Impersonation 수행 if ( *((_BYTE *)a1 + 41) ) { v14 = VspVsmbImpersonateRootSecurityContext(a1, (struct _VVSMB_CLIENT_IMPERSONATION_CONTEXT *)v48); // ... } // 허용된 FileInformationClass 확인 // 10: FileRenameInformation (파일 이동) // 11: FileLinkInformation (하드 링크) // 65: FileDispositionInformationEx (파일 삭제) if ( *((_DWORD *)a3 + 4) != 10 && *((_DWORD *)a3 + 4) != 11 && *((_DWORD *)a3 + 4) != 65 ) goto LABEL_24; // STATUS_INVALID_PARAMETER // 대상 경로에 대한 핸들 열기 // ObjectAttributes.Attributes = 0x240 (OBJ_KERNEL_EXCLUSIVE 미포함) ObjectAttributes.RootDirectory = (HANDLE)*((_QWORD *)a1 + 4); *(_QWORD *)&ObjectAttributes.Attributes = 576; // 0x240 고정 ObjectAttributes.ObjectName = (PUNICODE_STRING)v36; v22 = IoCreateFileEx( &FileHandle, 0xC0000000, // GENERIC_READ | GENERIC_WRITE &ObjectAttributes, &IoStatusBlock, // ... ); // 사용자 프로세스의 파일 핸들을 PsInitialSystemProcess 컨텍스트로 복제 v25 = ObDuplicateObject(v43, *((_QWORD *)a3 + 1), PsInitialSystemProcess, &Handle, 0x2000000, 576, 10, Disposition); // 파일 객체 참조 획득 v26 = ObReferenceObjectByHandleWithTag( Handle, 0x2000000u, (POBJECT_TYPE)IoFileObjectType, 0, 0x46745356u, &Object, 0); if ( v26 >= 0 ) { // [취약점] 파일 객체에 대한 추가 검증 없이 대상 디렉토리 핸들 삽입 if ( a3 != (const struct _VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST *)-32LL && !v20 ) { v27 = FileHandle; if ( FileHandle == (void *)-1LL ) v27 = (void *)*((_QWORD *)a1 + 4); *v19 = v27; // RenameInformation의 RootDirectory 설정 } // 커널 컨텍스트에서 파일 조작 수행 // 일반 사용자의 요청이 SYSTEM 권한으로 처리됨 v28 = ZwSetInformationFile(Handle, &v47, v17, *((_DWORD *)a3 + 5), v13); } // ... }
C
복사
[코드 6] 취약한 VspVsmbHandleSetInformationFileRequest 함수 내부
취약점 발생 과정:
1.
ObDuplicateObject가 사용자의 파일 핸들을 PsInitialSystemProcess 컨텍스트로 복제하여 커널 권한으로 전환한다.
2.
IoCreateFileEx로 열린 대상 경로의 핸들이 RenameInformationRootDirectory로 설정된다.
3.
ZwSetInformationFile이 커널 컨텍스트에서 실행되어 보호된 시스템 디렉토리에 대한 파일 조작을 수행한다.
결과적으로 일반 사용자가 VSMB 인터페이스를 통해 요청한 파일 이동·삭제 작업이 커널 컨텍스트에서 수행되어, C:\Windows\System32와 같은 보호된 디렉토리의 파일을 조작할 수 있다.

3.5. 최종 결과

항목
1단계
VspVsmbFileCreate에서 파일시스템 경로 핸들 획득
2단계
VspVsmbHandleSetInformationFileRequest에서 파일 조작 수행
조작 범위
파일 이동(Rename), 파일 삭제(Disposition)
권한 수준
일반 사용자 → 커널 컨텍스트에서 보호된 디렉토리 파일 조작

4. 시연 영상

본 PoC는 CVE-2025-59517 취약점을 통해 일반 사용자 권한으로 보호된 시스템 디렉토리에 파일을 이동하는 과정을 시연한다.
[동영상 1] CVE-2025-59517 시연 영상
시연 환경: Windows 11 (Hyper-V 활성화, 패치 미적용)
시연 내용:
1.
VSMB 인터페이스를 통한 파일시스템 경로 핸들 획득
2.
파일 정보 설정 요청을 통한 파일 이동
3.
C:\Windows\System32 디렉토리에 파일 이동 확인
시연에서 확인된 바와 같이 공격자는 일반 사용자 권한만으로 보호된 시스템 디렉토리에 파일을 이동할 수 있다. 이를 통해 시스템 바이너리 교체 DLL Hijacking 등 추가적인 권한 상승 공격으로 이어질 잠재적 위협이 있다.

5. 탐지 및 검증

5.1. 행위 기반 탐지

다음 조건을 만족하는 이벤트를 모니터링한다.
파일 접근: \Device\STORVSP\VSMB 경로에 대한 비정상적인 NtCreateFile 호출
IOCTL 패턴: storvsp.sys에 대한 비정상적인 IOCTL 호출 빈도 및 패턴
파일 변경: 보호된 시스템 디렉토리에서 비정상적인 파일 이동·삭제 이벤트

5.2. PurpleHound 솔루션을 통한 검증

본 취약점과 같은 권한 상승 공격에 대해 조직의 보안 인프라가 효과적으로 대응할 수 있는지 사전에 검증하는 것이 중요하다.
PurpleHound는 78ResearchLab에서 개발한 BAS(Breach and Attack Simulation) 솔루션으로 실전 기반 공격 시나리오를 재구성하여 기업이 보유한 보안 장비와 시스템이 실제 공격에 얼마나 효과적으로 대응 가능한지 검증할 수 있도록 지원한다. 북한 등 실제 위협 그룹이 사용하는 최신 공격 기술을 반영하며 모든 공격 시나리오는 실증 검증을 거쳐 탑재된다.
CVE-2025-59517 취약점 역시 PurpleHound에 공격 시나리오로 탑재되어 조직 내 엔드포인트 보안 솔루션 및 EDR이 해당 공격을 탐지·차단하는지 검증할 수 있다.

6. 권장 조치

2025년 12월 Microsoft 보안 업데이트 즉시 적용
패치 불가 시: 불필요한 Hyper-V/WSL2/Windows Sandbox 비활성화 검토 및 엔드포인트 모니터링 강화

7. 결론

CVE-2025-59517은 storvsp.sys의 두 함수(VspVsmbFileCreate, VspVsmbHandleSetInformationFileRequest) 간 상호작용에서 발생하는 권한 상승 취약점이다.
VspVsmbFileCreate에서 요청자 권한 검증 없이 파일시스템 경로에 대한 핸들을 반환하고 VspVsmbHandleSetInformationFileRequest에서 사용자의 파일 핸들이 ObDuplicateObject를 통해 커널 컨텍스트로 복제된 뒤 파일 객체의 유효성을 검증하지 않아 ZwSetInformationFile이 보호된 디렉토리에 대한 파일 조작을 수행한다.
공격자는 이를 통해 일반 사용자 권한으로 C:\Windows\System32와 같은 보호된 시스템 디렉토리에 파일 이동·삭제가 가능하며 시스템 바이너리 교체 등 추가 권한 상승으로 이어질 잠재적 위협이 존재한다.

8. 참고 자료

CWE-284: https://cwe.mitre.org/data/definitions/284.html