萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

Windows 2000 LDT (Local Descriptor Table) 提權漏洞技術深度解析 (MS04-011)

本文為技術深度分析,探討 Windows 2000 核心處理 LDT (Local Descriptor Table) 擴展方向位時的邏輯缺陷,攻擊者可在 Ring 3 建立涵蓋核心記憶體區段的 LDT 描述符,配合 int 2e 系統呼叫中的 rep movsd 指令,實現核心記憶體任意寫入並提權。屬進階漏洞利用研究內容。

1. 漏洞根因

Windows 2000 允許使用者模式進程呼叫 NtSetLdtEntries 自行新增 LDT 項目。核心驗證邏輯未正確處理 Expand-Down (擴展方向) 位:

  • 正常段:Base=0x100, Limit=0x7FFFFFFF, Expand-Down=0 → 有效範圍 0x100 ~ 0x7FFFFFFF。
  • 設 Expand-Down=1 → 有效範圍反轉為 0x80000000 ~ 0xFFFFFFFF 與 0x0 ~ 0xFF,涵蓋核心空間 (0x80000000+)。

核心有時假設段基址為 0 進行記憶體運算,攻擊者可控制 LDT Base 導致運算錯誤,進而繞過記憶體保護。

2. 利用原理

  1. 呼叫 int 2e (系統服務分發器) 觸發 rep movsd:
    EDI = 核心堆疊指標 (KSP),ESI = 使用者傳入參數緩衝區,ECX = 參數個數。
    相當於 memcpy(KSP, user_buf, ECX*4)。
  2. ESI (使用者緩衝區) 可控;EDI (KSP) 需洩漏/猜測。
  3. KSP 定位技巧: 分配 16MB 大緩衝區,假設 KSP ≈ 0xFD000000,利用漏洞寫入特徵碼,掃描緩衝區偏移量反推精確 KSP。
  4. 取得 KSP 後,精確覆寫 KSP 以上核心資料結構 (如驅動程式 Dispatch Table、IDT/GDT 入口) 實現提權。

3. 關鍵程式碼片段 (PoC 節錄)


// 計算 LDT Base 使目標地址落在可寫入範圍
ldtbase = target_address - KSP;
SetupLDT(0x17, ldtbase);  // 建立惡意 LDT 描述符 (Expand-Down=1, Granularity=1, Limit=0)

// 觸發 int 2e 複寫核心記憶體
__asm {
    push es
    push 17h
    pop es              // 載入惡意 LDT 選擇子至 ES
    mov eax, 11h        // 系統服務號 (NtSetLdtEntries 相關)
    lea edx, pin        // 使用者緩衝區 (含特徵碼 "COOL")
    int 2eh             // 觸發 rep movsd 寫入核心堆疊
    pop es
}

4. 修補與緩解

  • 官方修補: MS04-011 (KB841873) 修正 LDT 驗證邏輯,嚴格檢查 Expand-Down 與 Limit 組合。
  • 緩解措施: 升級至 Windows XP SP2 / Windows Server 2003 SP1 (已重寫 LDT 處理);或部署 HIPS 監控異常 NtSetLdtEntries 呼叫。

5. 研究價值與啟示

  • 展示 x86 分段機制在現代作業系統中的殘留風險。
  • 核心模式程式碼不可信任使用者模式傳入的段選擇子屬性。
  • KSP 隨機化 (後續版本引入) 可大幅增加利用難度。
  • 驅動程式開發者應避免在核心路徑使用 rep movsd 等非受控複製指令。

聲明: 本文僅供學術研究與防禦理解之用,嚴禁用於非授權滲透測試或惡意攻擊。

copyright © 萬盛學電腦網 all rights reserved