原文來自安全客,作者:k0shl from 360vulcan team
原文鏈接:https://www.anquanke.com/post/id/107532
作者twitter:@KeyZ3r0
作者微博:@我叫0day誰找我_
一、背景
近年來,在內核漏洞利用中利用GDI object來完成任意地址R/W的方法越來越成熟,在池溢出(pool overflow),任意地址寫(arbitrary write),越界寫(oob write),釋放后重用(uaf),二次釋放(double free)等很多漏洞類型的場景中,都可以利用GDI object來完成任意地址讀寫,我們稱為GDI data-only attack。
微軟在Windows 10 build 1709版本之後引入了win32k類型隔離用來緩解GDI object這種利用方式,我在對win32kbase.sys關於typeisolation實現的逆向工程中發現了微軟在設計類型隔離這種緩解措施時的一處失誤,導致在某些常見漏洞場景中仍然可以利用GDI object完成data-only exploitation,在本文中,我將與大家分享這個新的攻擊方案思路。
調試環境:
OS:
Windows 10 rs3 16299.371
FILE:
Win32kbase.sys 10.0.16299.371
二、GDI data-only attack
GDI data-only attack是當前內核漏洞利用中比較常見的利用手段之一,利用常見的漏洞場景修改GDI object的某些特定成員變量,就可以使用win32k中管理GDI的API完成任意地址讀寫。目前,在GDI data-only attack中常用的兩個GDI object是Bitmap以及Palette,關於Bitmap一個重要的結構是
typedef struct _SURFOBJ {
DHSURF dhsurf;
HSURF hsurf;
DHPDEV dhpdev;
HDEV hdev;
SIZEL sizlBitmap;
ULONG cjBits;
PVOID pvBits;
PVOID pvScan0;
LONG lDelta;
ULONG iUniq;
ULONG iBitmapFormat;
USHORT iType;
USHORT fjBitmap;
} SURFOBJ, *PSURFOBJ;
Palette一個重要的結構是:
typedef struct _PALETTE64
{
BASEOBJECT64 BaseObject;
FLONG flPal;
ULONG32 cEntries;
ULONG32 ulTime;
HDC hdcHead;
ULONG64 hSelected;
ULONG64 cRefhpal;
ULONG64 cRefRegular;
ULONG64 ptransFore;
ULONG64 ptransCurrent;
ULONG64 ptransOld;
ULONG32 unk_038;
ULONG64 pfnGetNearest;
ULONG64 pfnGetMatch;
ULONG64 ulRGBTime;
ULONG64 pRGBXlate;
PALETTEENTRY *pFirstColor;
struct _PALETTE *ppalThis;
PALETTEENTRY apalColors[3];
}
在Bitmap和Palette的內核結構中,和GDI data-only attack相關的兩個重要成員變量是Bitmap->pvScan0和Palette->pFirstColor。這兩個成員變量指向Bitmap和Palette的data域,可以通過GDI API向data域讀取或寫入數據,只要我們通過觸發漏洞修改這兩個成員變量指向任意內存地址,就可以通過GetBitmapBits/SetBitmapBits或GetPaletteEntries/SetPaletteEntries完成對指向任意內存地址寫入和讀取,也就是任意地址讀寫。
關於利用Bitmap和Palette來完成GDI data-only attack現在網上已經有很多相關的技術文章,同時也不是本文的討論重點,這裡就不做更深入的分享,相關的資料可以參考第五部分。
三、Win32k TypeIsolation
GDI data-only attack這種利用方式大大降低了內核利用的難度,且在大多數常見漏洞類型的場景中都可以應用,微軟在Windows10 rs3 build 1709之後增加了一個新的緩解機制—-win32k typeisolation,通過一個雙向鏈表將GDI object統一管理起來,同時將GDI object的頭部與data域分離,這樣不僅僅緩解了利用pool fengshui製造可預測池再使用GDI object進行佔位並修改關鍵成員變量這種利用技術,同時也緩解了通過修改頭部其他成員變量來增大data域可控範圍這種利用技術,因為頭部與data域部分不再相鄰。
關於win32k typeisolation的機制可參考下圖:
本文經安全客授權發布,轉載請聯繫安全客平台。
转载请注明:IAMCOOL » Save and Reborn GDI data-only attack from Win32k TypeIsolation