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:vLockHandleRes