1、Sorry,It is Not Your PageSorry,It is Not Your Page演講者 張云海Windows 內存管理Windows 采用分頁式內存管理進程的虛擬地址空間分為用戶空間和內核空間進程1內核空間用戶空間每個進程獨占其用戶空間進程1內核空間用戶空間物理內存進程2所有進程共享內核空間進程1內核空間用戶空間物理內存進程2用戶空間的內存共享進程1內核空間用戶空間物理內存進程2ntdll.dllntdll.dllntdll.dll內核空間的寫入時復制(Copy-on-Write)進程1內核空間用戶空間物理內存進程2ntdll.dllntdll.dllntdll.dll0
2、x111111110 x111111110 x11111111內核空間的寫入時復制(Copy-on-Write)進程1內核空間用戶空間物理內存進程2ntdll.dllntdll.dllntdll.dll0 x111111220 x111111110 x111111110 x11111122會話空間進程1 會話1內核空間用戶空間物理內存進程2 會話1會話空間進程1 會話1內核空間用戶空間物理內存進程3 會話2指向會話空間的指針進程1 會話1內核空間用戶空間物理內存SessionDataSessionDataP=&SessionDataP=&SessionData指向會話空間的指針進程1 會話1內
3、核空間用戶空間物理內存SessionDataSessionDataP=&SessionDataP=&SessionData進程3 會話2P=&SessionData指向會話空間的指針進程1 會話1內核空間用戶空間物理內存SessionDataSessionDataP=&SessionDataP=&SessionData進程3 會話2P=&SessionData指向會話空間的指針進程1 會話1內核空間用戶空間物理內存SessionDataSessionDataP=&SessionDataP=&SessionData進程3 會話2?P=&SessionData?物理頁面混淆 Physical Pa
4、ge Confusion是否存在這樣的指針?如何讓其他會話中的進程來使用這個指針?兩個問題_KTHREAD 中的 Win32Thread如何使用 Win32Thread通過 GS 段映射的 _KPCR 獲取當前線程KiStackAttachProcess 更新 CR3 同時保持 _KPCR.Prcb.CurrentThread 不變一個導致物理頁面混淆漏洞的模式KiStackAttachProcess(ProcessInOtherSession)Win32Thread=PsGetThreadWin32Thread(KeGetCurrentThread()讀寫*Win32Thread案例分析:C
5、VE-2019-0892NtTerminateProcess 在關閉句柄前會調用 KiStackAttachProcessDxgkCompositionObject 對象在刪除時會調用 RGNMEMOBJ:vPushThreadGuardedObjectRGNMEMOBJ:vPushThreadGuardedObject 會調用 PsGetThreadWin32Thread 并使用獲取的 Win32Thread問題修復引入函數 IsThreadCrossSessionAttached 進行檢查用 W32GetThreadWin32Thread 封裝 PsGetThreadWin32Thread
6、RGNMEMOBJ:vPushThreadGuardedObject 調用 W32GetThreadWin32Thread 獲取 Win32ThreadNtGdiDeleteObjectAppbDeleteDCOBJGreGetDeviceCapsReleaseCacheDC_GetDCExGreGetBoundsXDCOBJ:bCleanDCHmgDecrementShareReferenceCountExHmgLockExHANDLELOCK:vLockHandleResetOrgHANDLELOCK:bLockHobjhbmSelectBitmapDCMEMOBJ:DCMEMOBJW32GetThreadWin32ThreadSURFMEM:bCreateDIBXDCOBJ:bDeleteDCGreIntersectClipRect增加 IsThreadCrossSessionAttached 檢查的函數Call to Action使用錯誤的頁表進行虛擬地址轉換會導致物理頁面混淆類漏洞操作系統應當提供機制來判斷是否可以安全的使用虛擬地址開發人員應當認識到這類漏洞的存從而做出相應的處理感 謝 聆 聽