Ronin 黑客計中計 你聽說過扭曲攻擊漏洞嗎

發表於 2023-04-01 14:20 作者: Defi之道

據慢霧安全團隊情報,2023 年 3 月 13 日,Ethereum 鏈上的借貸項目 Euler Finance 遭到攻擊,攻擊者獲利約 2 億美元。

黑客在攻擊完 Euler 後,爲了混淆視聽逃避追查,轉了 100 ETH 給盜取了 Ronin 6.25 億多美金的黑客拉撒路。拉撒路順水推舟將計就計,隨即給 Euler 黑客發了一條鏈上加密消息[1],並回禮了 2 枚 ETH:

消息內容是提示 Euler Exploiter 用 eth-ecies[2] 解密這條消息。

質疑

按道理說在公开的環境下,如果 Ronin Exploiter 只是想加密通訊,使⽤公鑰加密是最簡單的⽅案。

  •     公鑰加密:

C = {rG, M + rQ} = {C1, C2}

  •     私鑰解密:

M = M + r(dG) − d(rG) = C2 − d(C1)

其中密⽂ C,公鑰 Q,私鑰 d,隨機數 r,消息 M。協議很簡單,加密過程不需要⽤到的私鑰,不存在私鑰泄露的路徑。

使⽤ eth-ecies 加密是因爲⽅便還是另有所圖?隨後很快就有⼈指出 eth-ecies 存在安全漏洞,Ronin Exploiter 是想竊取 Euler Exploiter 的私鑰。

是否真的如此?且讓我們先分析⼀下 eth-ecies 存在的是怎么樣的⼀個漏洞。

扭曲攻擊漏洞

經過分析,我們發現 eth-ecies 使⽤了 "elliptic": "^6.4.0",這是個 Javascript 橢圓曲线庫,這個版本的庫存在多個安全漏洞,其中⼀個就是扭曲曲线攻擊漏洞(twist attacks),這個漏洞的成因是在計算 ECDH 共享密鑰時沒有驗證對⽅的公鑰是否在曲线上,攻擊者可通過構造⼩⼦群曲线上的公鑰,誘導受害者計算共享密鑰,從⽽破解出受害者私鑰。

但是這個漏洞的利⽤難度是很⾼的,需要有⾮常契合的場景才能發起攻擊,Ronin Exploiter 是否有機會發起扭曲攻擊呢?

ECDH 算法⻛險

ECDH 算法是基於橢圓曲线加密的密鑰交換算法。它與傳統的 Diffie-Hellman (DH) 算法類似,但是使⽤的是橢圓曲线上的數學運算來實現密鑰交換,從⽽提供更⾼的安全性。

下⾯是 ECDH 算法的步驟:

1. ⽣成橢圓曲线:在密鑰交換之前,通信雙⽅需要選擇⼀個橢圓曲线,該曲线必須滿⾜⼀些數學特性,例如離散對數問題。

2. ⽣成私鑰和公鑰:每個通信⽅都需要⽣成⼀對私鑰和公鑰。私鑰是⼀個隨機數,⽤於計算公鑰。公鑰是⼀個點,它在橢圓曲线上,並由私鑰計算得出。

3. 交換公鑰:通信雙⽅將⾃⼰的公鑰發送給對⽅。

4. 計算共享密鑰:通信雙⽅使⽤對⽅發送的公鑰和⾃⼰的私鑰計算出⼀個共享密鑰。這個共享密鑰可以⽤於加密通信中的數據,保證通信的機密性。

爲了⽅便描述下⽂ Alice 和 Bob 分別代表上⾯雙⽅,G 爲基點,假設:

Alice 的私鑰是 a,則 Alice 公鑰是 A = aG;

Bob 的私鑰中 b,則 Bob 公鑰是 B = bG。

核⼼知識點在共享密鑰計算⽅法,根據群的乘法交換律,他們只要獲取到對⽅的公鑰就可以計算出共享密鑰:

                                               S = aB = a(bG) = b(aG) = bA

如果 Alice 想要刺探 Bob 的私鑰,她可以選擇⼀個階數 q ⾮常⼩(點的數量⾮常少)的曲线點 H(這個點不是對應任何特定私鑰的公鑰,但是 Bob 並不知道),由於群是循環群,Bob 在計算 S′  = bH 時,他得到的 S′  將在這些少量點群以內。Alice 不知道 Bob 的私鑰 b,但可以通過窮舉得到滿⾜ S′ = xH 的 x,此時 b ≡ x  mod q 。顯然 x 很⼩,最⼤爲 q。

需要多少個扭曲點呢?這取決於每⼀次選擇的階數 q,需要階數相乘能超過私鑰的最⼤值,即滿⾜:

如果我每次選擇的 q ⼤⼀點,那么需要交互的次數 n 就可以少⼀點,但 q 越⼤意味着窮舉的難度越⼤,所以這⾥需要根據 Alice 的運算性能做⼀個取舍。

事件結論

上⾯我們分析了 ECDH 算法的⻛險和攻擊原理,我們再回來看 eth-ecies 這個庫,實際上它使⽤的只是⼀個類似 ECDH 的算法,它在構造共享私鑰時使⽤的是臨時密鑰,根本不需要⽤到加密⽅的私鑰,所以並不會對加密⽅構成⻛險。

那么有沒有可能 Ronin Exploiter 是想利⽤社會⼯程學引導 Euler Exploiter 使⽤其它有問題的⼯具呢?⽐如我們熟知的 PGP 加密協議?

巧的很,我們很快就發現被⼴泛使⽤的开源庫 openpgpjs[3] 最新版本 v5.7.0 還在使⽤了低版本的 "@openpgp/elliptic": "^6.5.1" ,更巧的是,它⽀持基於 Curve25519 的 ECDH 協議,故事本應該進⼊⾼潮,但經過分析發現,openpgpjs 的 ECDH 協議在實現時,和 Ecies 協議⼀樣引⼊了臨時密鑰,即使加密⽅導⼊了私鑰,也僅僅⽤於消息籤名,⽽不會⽤於構造共享密鑰。

故事結束了,我覺得 Ronin Exploiter 使⽤低版本 elliptic 存在的漏洞去隱祕的竊取 Euler Exploiter 私鑰的可能性不⼤,⾄於那條鏈上消息,可能真的是爲了共商⼤計,更進⼀步的圖謀不軌需要更加⾼超的社會⼯程學⼿段了,但 Euler Exploiter 已經警覺。

意猶未盡

上⾯提到了扭曲攻擊的原理,實際⼯程實現上仍然有⼏個問題需要解決:

1. 如何構造扭曲的點?

2. 當 Bob ⽤共享密鑰 S' 加密消息時,它並不會把 S' 傳輸給 Alice,因爲根據協議 Bob 認爲 Alice 是已經知道這個密鑰的,那么 Alice 如何獲取 S' 呢?

這⾥以 Curve25519 曲线爲例,它的曲线⽅程是:

我們隨意改變其中的⼀個參數,得到⼀條新的曲线,⽐如:

使⽤ sagemath 數學軟件來表示[4]:

p = 2**255-19 
E = EllipticCurve(GF(p), [0,48666,0,1,0])

然後我們計算它的階數,並對這個階數進⾏因式分解:

Grp = E.abelian_group() 
G = Grp.gens()[0]
Gorder = G.order()
print( "{0} = {1}".format(Gorder, factor(Gorder)) )

計算結果:

...= 2 * 3049 * 14821 * 19442993 * 32947377140686418620740736789682514948650410565397852612808537

選擇 19442993 這個⼤⼩適中的數,⽤中國剩余定理創建⼀個含有 19442993 個元素的⼦群: 

x = crt([1,0], [19442993, Gorder//19442993]) 
P1 = x * G

到這⾥我們就得到了第⼀個扭曲的點,把它當作公鑰發送給 Bob,Bob 就可以計算第⼀個共享密鑰:

最終得到的結果可表示爲:

使⽤中國剩余定理即可計算出私鑰 b:

x = crt([ x1, x2, x3, x4, x5, x6, x7, x8, x9], [ 19442993, 3645143, 184879577, 5110460161, 15272631587, 208137522259, 64927105657, 60824497, 213156431]) 
print(x == b)
print(hex(x))

總結

本⽂我們通過⼀個不同常理的對話开始研究了橢圓曲线加密算法中的扭曲曲线攻擊,分析了漏洞的存在的原因,雖然漏洞利⽤場景有限,但不失爲⼀個很有價值的漏洞,希望能對⼤家的學習研究有所啓發。

最後,感謝領先的⼀站式數字資產⾃托管服務商 Safeheron 提供的專業技術建議。

參考資料:

[1].https://etherscan.io/tx/0xcf0b3487dc443f1ef92b4fe27ff7f89e07588cdc0e2b37d50adb8158c697cea6

[2]. https://github.com/LimelabsTech/eth-ecies

[3]. GitHub - openpgpjs/openpgpjs: OpenPGP implementation for JavaScript

[4]. Elliptic curve constructor - Elliptic curves

By: Johan

來源:DeFi之道

標題:Ronin 黑客計中計 你聽說過扭曲攻擊漏洞嗎

地址:https://www.coinsdeep.com/article/11934.html

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

你可能還喜歡
熱門資訊