
CVE-2022-21974 "로밍 보안 권한 관리 서비스 원격 코드 실행 취약점"에 대한 PoC
RMSRoamingSecurity!ATL::CComCreator<ATL::CComObject<CRmsRoamingSecurity> >::CreateInstance 생성자는 CRmsRoamingSecurity 객체(0x3470바이트)를 할당하고 초기화하지만, 상태를 완전히 초기화하는 데 실패합니다.
예를 들어, 오프셋 0x3458에는 소멸자가 호출될 때 해제되는 초기화되지 않은 포인터가 있습니다(CRmsRoamingSecurity::_Cleanup에서):
0:000>
RMSRoamingSecurity!CRmsRoamingSecurity::_Cleanup+0x29:
00007ffd`719767a5 488b8b58340000 mov rcx,qword ptr [rbx+3458h] ds:000001c6`612f9fe8=c0c0c0c0c0c0c0c0
0:000> p
RMSRoamingSecurity!CRmsRoamingSecurity::_Cleanup+0x30:
00007ffd`719767ac 4885c9 test rcx,rcx
0:000>
RMSRoamingSecurity!CRmsRoamingSecurity::_Cleanup+0x33:
00007ffd`719767af 7414 je RMSRoamingSecurity!CRmsRoamingSecurity::_Cleanup+0x49 (00007ffd`719767c5) [br=0]
0:000>
RMSRoamingSecurity!CRmsRoamingSecurity::_Cleanup+0x35:
00007ffd`719767b1 48ff15e0b90000 call qword ptr [RMSRoamingSecurity!_imp_CoTaskMemFree (00007ffd`71982198)] ds:00007ffd`71982198={combase!CoTaskMemFree (00007ffd`ce8454d0)}
다음은 초기화되지 않은 데이터를 사용하는 함수입니다. [0]과 [1]을 참조하세요:
void __fastcall CRmsRoamingSecurity::_Cleanup(struct_v7 *this)
{
void *v2; // rcx
void *qword3460; // rcx
void *qword33E8; // rcx
if ( this->qword33E0 )
{
IpcFreeMemory();
this->qword33E0 = 0i64;
}
v2 = *(void **)&this->gap33F0[104]; // <--- [0] uninitialized
if ( v2 )
{
CoTaskMemFree(v2); // <--- [1] free
*(_QWORD *)&this->gap33F0[104] = 0i64;
}
//...
}
winword.exe에서 Gflags를 통해 PageHeap을 켭니다.cve-2022-21974.rtf를 엽니다.(12f0.2f64): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
verifier!AVrfpDphFindBusyMemoryNoCheck+0x8a:
00007ffd`7a4c4742 817ac0bbbbcdab cmp dword ptr [rdx-40h],0ABCDBBBBh ds:c0c0c0c0`c0c0c080=????????
0:000> kc
# Call Site
00 verifier!AVrfpDphFindBusyMemoryNoCheck
01 verifier!AVrfpDphFindBusyMemory
02 verifier!AVrfpDphFindBusyMemoryAndRemoveFromBusyList
03 verifier!AVrfDebugPageHeapFree
04 ntdll!RtlDebugFreeHeap
05 ntdll!RtlpFreeHeap
06 ntdll!RtlpFreeHeapInternal
07 ntdll!RtlFreeHeap
08 RMSRoamingSecurity!CRmsRoamingSecurity::_Cleanup
09 RMSRoamingSecurity!ATL::CComObject<CRmsRoamingSecurity>::~CComObject<CRmsRoamingSecurity>
0a RMSRoamingSecurity!ATL::CComObject<CRmsRoamingSecurity>::`vector deleting destructor'
0b RMSRoamingSecurity!ATL::CComCreator<ATL::CComObject<CRmsRoamingSecurity> >::CreateInstance
0c RMSRoamingSecurity!ATL::CComClassFactory::CreateInstance
0d combase!CServerContextActivator::CreateInstance
0e combase!ActivationPropertiesIn::DelegateCreateInstance
0f combase!CApartmentActivator::CreateInstance
10 combase!CProcessActivator::CCICallback
11 combase!CProcessActivator::AttemptActivation
12 combase!CProcessActivator::ActivateByContext
13 combase!CProcessActivator::CreateInstance
14 combase!ActivationPropertiesIn::DelegateCreateInstance
15 combase!CClientContextActivator::CreateInstance
16 combase!ActivationPropertiesIn::DelegateCreateInstance
17 combase!ICoCreateInstanceEx
18 combase!CComActivator::DoCreateInstance
19 combase!CoCreateInstanceEx
1a combase!CoCreateInstance
1b ole32!wCreateObject
1c ole32!OleLoadWithoutBinding
1d ole32!OleLoad
저는 Windows 10 x64 VM과 Windows 11 x64에서 Wordpad(단, 한 번의 클릭 필요)와 Office Word 2019 모두에서 이를 재현했습니다.