Windows原理深入學習系列-強制完整性檢查

信安成長計劃發表於2022-04-12

這是[信安成長計劃]的第 24 篇文章

0x00 目錄

0x01 介紹

0x02 逆向分析 Win10_x64_20H2

0x03 總結

0x04 參考文章

最近因為一些事情,拖更了三個周,大家見諒啊,後面還會開始一些其他的系列內容,還等著大家來捧場了。

現在我們接著之前的進度,繼續完成 Windows 原理的學習。

在剛開始的時候,我們介紹了強制完整性控制的機制,這次就來看一下在實際的許可權檢查當中是如何進行的。

0x01 介紹

這次也還是接著上一次的 ObpGrantAccess 函式往後分析了,根據名字也很容易能夠判斷出這裡的作用

圖片

不清楚為什麼從 ObpGrantAccess 分析的,可以去看一下上一篇文章的介紹部分

0x02 逆向分析 Win10_x64_20H2

在進入函式以後,就是一堆儲存堆疊、賦值等等操作

圖片

緊接著會有一些許可權的判斷,這些也暫時不是現在的關鍵

圖片

接著判斷 SACL 中是否有有效內容,獲取前的最後的判斷

圖片

然後就是我們非常熟悉的內容了是否是相對地址,忘記這塊內容的可以參考之前關於訪問控制列表的文章

圖片

獲取到完整性等級相關的 ACE

圖片

接著就從 ACE 當中獲取到需要的內容

圖片

緊接著就是我們非常熟悉的函式 SepCopyTokenIntegrity,這個在剛開始分析強制完整性控制的時候有分析過

它的主要操作就是根據 Token 中的 IntegrityLevelIndex,從 UserAndGroups 當中得到當前的完整性等級

圖片

然後就是最關鍵的比較了,對兩個 Sid 進行比較

圖片

根據分析可以知道 r12 就是通過 SepCopyTokenIntegrity 從當前的 Token 中取出的完整性等級資訊

圖片

另一個 rbp,就是從 SACL 當中取出來的完整性等級

圖片

r12 的來源就是當前上下文的 Token 資訊

圖片

而 SACL 的來源並不在當前,一直往前追,可以看到它是從 SeAccessCheck 的 rcx 當中來的,根據描述也能明白這個是被訪問物件的資訊

圖片

這樣也就基本完成了對完整性資訊的檢測,對於 RtlEqualSid 函式,之前也進行過分析,這裡也就不再提及了

0x03 總結

在之前我也一直有一個疑問,我剛開始是通過 SepCopyTokenIntegrity 來得到程式的完整性等級的,但是為什麼網上有很多的資料都說完整性等級是儲存在 SACL 當中的。

從這裡也就可以得知,兩個取出來的都是完整性等級資訊,不過它們所代表的情況是不一樣的。

在進行許可權驗證的時候,會通過 SepCopyTokenIntegrity 取出當前的完整性等級,然後從目標物件的 SACL 當中獲得目標的完整性等級,然後進行相應的判斷和驗證。

0x04 參考文章

1.https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-token_mandatory_policy

2.https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-seaccesscheck

3.https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_security_descriptor

4.https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/security-descriptor-control

5.https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-ace_header

相關文章