跨鏈橋頻繁遭攻擊,從技術核心中的隨機數 k 和 R 值理解攻擊事件發生的原因和應對之策。

撰文:李尼、Demmon

隨着大部分 DeFi 項目逐漸開始從以太坊走向多鏈佈署,用戶在各條鏈之間轉移資產變成了一種剛需。而跨鏈的資產轉移從資產所有權這個技術維度上可以分爲:託管型 Custodial Service 和去中心化型 Decentralization (或者叫非託管型 Non-custodial)兩個大類。由此應運而生了衆多提供給用戶進行資產鏈間轉移的「橋」。很有意思的一個現象是繼前幾個月的 DeFi 協議頻繁被黑客盯上之後,由於這些跨鏈「橋」上同樣儲存了大量的資產,其逐漸成爲了黑客攻擊的一個熱點。近期我們就留意到業界幾次針對跨鏈橋的攻擊。如鏈聞報道的一則 新聞,跨鏈橋被⿊造成了協議和用戶價值數百萬美元等值的損失。 一般來說,黑客都會選擇去中心化型的跨鏈橋作爲目標,因爲託管型的橋屬中心化方式控制資產,被攻破的難度較大;而去中心化的跨鏈橋,由於涉及比較精細的密碼學設計和計算機代碼的工程實現,往往容易在某處生產漏洞從而被黑客抓住利用進行攻擊。

一文說透跨鏈橋技術中的核心:隨機數「k」和「R」值

本文將介紹分析用戶一般瞭解較少的跨鏈橋的核心:多方安全計算中的核心-隨機數「k」和由 k 推導出的 R 值的過程,科普一下這些攻擊事件到底是如何發生的以及一座可靠的去中心化跨鏈橋應該是怎麼實現。以饗讀者。

據鏈聞《賬戶私鑰被破解?拆解 Anyswap 跨鏈橋被⿊細節》揭露,此次安全事故是由於鏈上出現了兩筆具有相同 R 值數字簽名的交易,黑客通過兩個簽名值計算出了 Anyswap 跨鏈橋 MPC 控制的賬戶的私鑰,進而盜走了其中的資產。那麼私鑰究竟是如何通過簽名計算得到的呢?有什麼辦法去防範這一安全漏洞的產生呢? 首先我們要了解一下這個 R 值是什麼。

「R」值——賬戶安全的阿卡琉斯之踵

一文說透跨鏈橋技術中的核心:隨機數「k」和「R」值

衆所周知,區塊鏈賬戶的權限是通過數字簽名實現的,即用戶用私鑰對交易數據簽名來完成賬戶資產的轉移。目前區塊鏈中廣泛使用的數字簽名算法是 ECDSA,它屬於「非確定性」一類的數字簽名算法,即同一數據會有多個合法的簽名,這是由於 ECDSA 在每次簽名過程中都會引入隨機數 k,而 R 值就是通過 k 計算得到的。這就等於說:要想破解出來私鑰,必須要獲得同樣的 R 值;獲得同樣的 R 值,就等同於隨機數 k 值暴露了或者發生碰撞(即兩個簽名具有相同的 R)。所以隨機數 k 的重要性等同於私鑰。

假設有兩筆交易的簽名過程使用了相同的隨機數 k,那麼兩個簽名值的 R 是相同的。不妨設兩個簽名爲 (R, s1) 和 (R, s2),那麼根據 ECDSA 的算法過程有以下代表這兩筆交易的兩個等式:

一文說透跨鏈橋技術中的核心:隨機數「k」和「R」值

其中 m1 和 m2 是交易數據,而 sk 是賬戶私鑰。

觀察上面兩個等式,其中 s1、s2、R 是簽名數據,m1 和 m2 是交易數據,都是公開透明所有人都知道的,而未知數只有兩個,即 A)隨機數 k 和 B)賬戶私鑰 sk。根據簡單的計算,兩個未知數,兩個方程,那就可以求解得到未知數的值,這就是中學數學中的「解方程」!所以可以自然地求解得到私鑰公式如下:

一文說透跨鏈橋技術中的核心:隨機數「k」和「R」值

由於在 Anyswap 攻擊事件中,黑客發現兩次交易過程中的簽名都使用了相同的隨機數 k!所以黑客很容易的就計算出來控制跨鏈資產橋的私鑰 sk 出來!然後就是拿着還原的私鑰把跨鏈鎖定合約裏的所有資產轉走!

那麼問題來了:這個這麼重要的隨機數 k 值爲什麼會重複出現?接下來就引入爲什麼要用多方安全計算這樣一個方案來產生隨機數的原因。

真正採用 MPC 賬戶簽名的話,k 值是不可能被泄露的!

一文說透跨鏈橋技術中的核心:隨機數「k」和「R」值

相比普通賬戶簽名,多方安全計算 MPC,Multi-party Computation (這裏要特別說明,多方安全計算不是多重簽名!)賬戶簽名過程無疑是非常複雜的。因爲簽名參與者不再是單一控制人,而是 N 多個控制人合作完成簽名過程,簡單點類比,就是多人協作的過程。在普通賬戶簽名過程,只需要在 R 值生成過程中使用真隨機數發生器,基本可保證安全;而在 MPC 賬戶簽名過程中,由於參與者不唯一,而且理論上認同可以存在惡意節點,因此 R 值的生成不再可以依賴單一用戶生成,因爲一旦該用戶是惡意的,他將能夠自己控制隨機數 k,從而控制 R,進而計算得到 MPC 賬戶私鑰,竊取資產。因此在 MPC 賬戶簽名過程中,R 的生成必須滿足以下 3 大原則:

  • 非單一用戶生成
  • 任何人都無法獲得 R 對應的 k 值
  • 隨機數 k 的生成要足夠的隨機,滿足無偏性和不可預測性

用一句通俗的話形容這個過程就是:既要一羣人一起協作幹活,又不能讓你們知道你們在幹什麼!

一文說透跨鏈橋技術中的核心:隨機數「k」和「R」值

典型的 MPC 的設計實例:可驗證祕密分享- Wanchain MPC 賬戶 R 值安全性的核心保證

在 Wanchain 跨鏈橋機制中,跨鏈資產是由鎖定賬戶保管,而鎖定賬戶則是由 25 個匿名(這個數值可以根據需要擴展或者減少) Storeman 節點通過多方計算(MPC)的方式共同管理。在鎖定賬戶簽名過程中,R 值是由 25 個 Storeman 節點通過可驗證祕密分享(PVSS)共同決定,保證不會發生兩筆交易簽名 R 值相同的情況。具體步驟如下:

  • 第一步:各 Storeman 節點在本地通過真隨機數發生器產生一個隨機數;
  • 第二步:各 Storeman 節點將進行 Shamir 祕密分享,並將祕密碎片通過安全信道傳輸給其他節點;
  • 第三步:收到其他節點傳輸的祕密碎片後,各 Storeman 節點在本地進行累加,得到一個組祕密碎片,然後將該組祕密碎片與橢圓曲線基點相乘,並將結果廣播;
  • 第四步:各 Storeman 節點對廣播的數據進行拉格朗日插值計算,得到一個橢圓曲線點,其橫座標即爲 R 值。

雖然以上過程稍顯複雜,但是核心思想很簡單,那就是 R 值是由 25 個 Storeman 節點共同確定的,每個 Storeman 節點貢獻一部分加密的碎片,最終通過密碼運算合成了 R 值。也就是實現了上面那句話描述的狀態:既要你們協作一起幹活,但是你們都不知道你們在幹什麼,其他人是誰。

可驗證祕密分享可以確保:

任何兩筆交易具有同樣的 R 值是不可能發生的

首先,R 值是有 25 個 Storeman 節點共同確定的,而不是由單一節點確定,理論上只要 25 個 Storeman 節點中存在 1 個誠實節點,那麼 R 值就是隨機的;其次,各節點對 R 值貢獻的部分是通過真隨機數發生器產生的,分佈足夠均勻。綜合兩點,兩筆交易具有同樣 R 值的情況只有在 25 個 Storeman 節點在兩次簽名中選擇的隨機數加和相等的時候纔會發生,這一概率是 2-256,形象地說,比走在路上被隕石砸到腦袋的概率都小。

一文說透跨鏈橋技術中的核心:隨機數「k」和「R」值

R 值對應的 k 是完全保密的

在前文我們說過,k 一旦泄露,私鑰就可以計算得到。在 Wanchain 鎖定賬戶簽名過程中,k 是由 25 個 Storeman 節點共同決定,但是由於祕密碎片是通過安全信道傳輸給各節點,因此沒有任何一個節點能夠恢復出完整的 k 值。也就是說,k 值是僅僅是一種理論中的存在,能夠正常完成 MPC 簽名過程,但是確實任何人都不可見的。

通過 1 和 2 兩點的分析,得出 Wanchain 跨鏈橋的實例中鎖定賬戶安全性是極高的,不會出現私鑰泄露的情況。

一文說透跨鏈橋技術中的核心:隨機數「k」和「R」值

那什麼樣的情況會導致出現 Anyswap 的兩筆交易出現相同的 R 值?

我們沒有全部讀完 Anyswap 項目的 MPC 這部分代碼,只能通過上述的 MPC 的理論和實現機制推導這樣的結論:1)要不是沒有采用真正 MPC 的實現過程而只是掛了一個 MPC 的名義,還是由單一個體產生隨機數 k,從而造成 k 重複出現的情況;或 2)代碼在實現上出現了重大的代碼問題,而這種重大技術失誤在嚴謹的開發團隊看來是完全不應該出現的。

在另外一篇文章《理想中的跨鏈橋,是什麼樣?》 中關於 MPC 跨鏈橋有一段這樣的表述:「Anyswap:用一句話來解釋「黑客發現了 Anyswap 的代碼漏洞,從而拿到了公私鑰對,盜走了資產」,更像是各類項目都會出現的漏洞。」 筆者並不太認同各類採用 MPC 都會出現的漏洞這句話的論斷。業界我們交流的幾個實現了 MPC 的同行都不認爲這樣的漏洞或者錯誤是個都會出現的普遍現象,採用 MPC 的精髓就是實現了多方的匿名安全計算,否則如果連這個都不能保證,何必採用 MPC,用個多籤,單籤的方案豈不更簡單,安全性更高?「如果能夠使用足夠多節點的公鏈共識,則能很大程度上避免類似這次被攻擊的情況(MPC 不夠去中心化的選型)。」 這句話的結論同樣不敢苟同。不同交易簽名 R 值是否重複並不取決於節點的個數,而是取決於簽名過程中隨機數的生成方式。如果簽名過程中隨機數是多個節點通過多方計算共同決定,那麼僅 20 個節點也同樣能夠產生安全隨機數;反之,如果簽名過程中隨機數是並不是以安全的、分佈式的方式產生,那麼堆積再多的節點也是徒勞。該項目瀏覽器上顯示有超過 20 多個節點參與 MPC 計算,如果計算方式的確爲 MPC,那麼發生 R 值碰撞的概率是忽略不計的。因此該項目將兩筆交易簽名 R 值相同的原因歸結於參與 MPC 節點數量不足,無疑是避重就輕,具有很強的誤導性。

在文章的最後,特別想和大家強調一下隨機數對於區塊鏈的重要性,它不僅僅用在賬戶簽名過程,而且也用在 PoS 共識和分片 Shard 算法等領域,直接決定整個系統的安全性,萬萬不可忽視。一個小小的隨機數生產,並不是那麼簡單,是整個數學界,密碼學界一直以來孜孜追求不斷優化的一個聖盃領域。一個區塊鏈團隊還是應該多在分佈式隨機數生成算法領域不斷積累,設計並不斷優化鏈上隨機數發生器,這樣才能夠爲跨鏈和共識過程提供安全隨機數,爲整個區塊鏈,DeFi 領域提供可靠、可用、可信的跨鏈橋。