什麼是在 Windows 10 CryptoAPI 上對 ECDSA 的 ChainOfFools/CurveBall 攻擊
什麼是 Windows 10 CryptoAPI (Crypt32.dll) 上 ECDSA 的 ChainOfFools/CurveBall 攻擊
有人可以提供詳細資訊嗎?
ChainOfFools(或Microsoft 的 Chain of Fools)或CurveBall是 Microsoft X.509 證書驗證中的一個漏洞,它影響在任何時候使用ECDSA的證書鏈,由 NSA 發現!1 .
來自CVE-2020-0601 的Microsoft 站點
攻擊者可以通過使用欺騙性程式碼簽名證書對惡意執行檔進行簽名來利用該漏洞,使文件看起來像是來自受信任的合法來源。使用者無法知道該文件是惡意的,因為數字簽名似乎來自受信任的提供者。
來自CERT網站
任何依賴 Windows CertGetCertificateChain() 函式來確定 X.509 證書是否可以追溯到受信任的根 CA 的軟體(包括第三方非 Microsoft 軟體)都可能錯誤地確定證書鏈的可信度。
因此,攻擊者可以創建有效的證書鏈,從而可以信任惡意程式碼。
細節:
TLS 經常使用 ECDSA 來驗證伺服器和客戶端。Windows 程式碼分發通常使用 ECDSA 進行程式碼簽名。如果 ECDSA 已在鏈中的任何點(使用 ECDSA 簽名的程式碼,或通過 ECDSA 驗證的網站,或由根 CA 通過 ECDSA 驗證的 CA 等)使用,該漏洞會影響證書檢查。
給定 ECDSA 簽名,如果域參數是可控的,則可以輕鬆創建具有相同公鑰匹配的新私鑰。
訣竅很簡單,讓我們從在有限域上定義曲線開始 $ \mathbb{F}_p $ ;
$$ E:y^2 = x^3 + ax + b $$
標准定義了參數, $ (p,a,b,G,n,h) $ , 在哪裡 $ G $ 是基點, $ n $ 是順序 $ G $ 和 $ h $ 是輔因子。參見例如secp256k1。
由於我們同意標準,我們都使用相同的參數。然後選擇私人 $ k \in [1..n-1] $ 並通過標量乘法計算公鑰 $ [k]G $ . 因此,您的私鑰是一個數字,但公鑰是曲線上的一個點,受 EC 離散日誌保護。
攻擊點:
如果庫的程序員/設計人員忘記檢查基點怎麼辦?
現在攻擊者可以創建一個新的私鑰,它具有相同的公鑰和不同的基點,如下所示;
設目標公鑰為 $ P $ 和 $ P=[k]G $ 私鑰的 $ k $ . 然後攻擊者選擇隨機密鑰 $ k’ $ 併計算他們的惡意基點 $ G’ $ 和
$$ G’ = [1/k’]P $$這 $ 1/k=k^{-1} $ 是可計算的,因為逆存在於有限域中 $ \mathbb{F}_p $ 並且可以由extendedGCD計算。
現在,在新曲線中,除基點外,所有參數都與之前相同,公鑰與目標密鑰相同,但私鑰不同。
由於我們假設庫沒有檢查基點,攻擊者可以利用此漏洞並欺騙 Windows 證書鏈,並且網站或簽名程式碼將顯示為合法來源。
- 可以在zahllos的Hacker News中找到 Sage 程式碼。
- 可以在https://curveballtest.com/上測試他們的系統(沒有 https!)
1或者,他們不再需要了!