今天要介紹一個在 Windows 經典的 TOCTOU 的攻擊方式,希望透過此篇的分享讓更多開發者知道漏洞成因以及該類型漏洞的利用方式。
Time-of-Check to Time-of-Use (TOCTOU) 的意思是檢查和使用的時間不一致所導致的漏洞。舉例來說,一個檔案經過檢查後沒有及時被使用,因此攻擊者可以竄改已經通過檢查的檔案,使用者便會誤以為已經檢查過了就直接使用該惡意檔案。 在許多情境都能看到這類型的漏洞,像是載入 DLL、驗證簽章、載入檔案等等。
根據 James Forshaw 的投影片,他提到了兩種情境:
如下圖所示,DLL 在被載入前有多個檢查,像是檢查 .dll 副檔名和開啟檔案並且檢查檔案路徑是否在 C:\Windows\System32\
在這個案例中就存在 TOCTOU 的問題。
我們可以利用 oplock 在 LoadLibrary 時觸發我們設定的 callback,並且鎖住所有對於該檔案的操作,
這個機制的濫用在今年的大型資安會議中已經出現過數次,在 Windows 的 NTFS 中,存在著 oplock 的機制可以讓多個 process 存取的檔案暫時被特定 process 鎖住而不被其他 processes 存取,包含 exxcute, read, write, delete。
而在 filesystem 中的 Lock 分為兩種:
而在 MSDN 中 oplock 分成以下4種:
test
→ system
test
,並建立一般資料夾 test
test