作者:李尼,Demmon
隨著大部分 DeFi 項目逐漸開始從以太坊走向多鏈佈署,用戶在各條鏈之間轉移資產變成了一種剛需。而跨鏈的資產轉移從資產所有權這個技術維度上可以分為:託管型 Custodial Service 和去中心化型 Decentralization(或者叫非託管型 Non-custodial)兩個大類。由此應運而生了眾多提供給用戶進行資產鏈間轉移的 ‘橋’。很有意思的一個現像是繼前幾個月的 DeFi 協議頻繁被黑客盯上之後,由於這些跨鏈 “橋”上同樣儲存了大量的資產,其逐漸成為了黑客攻擊的一個熱點。近期我們就留意到業界幾次針對跨鏈橋的攻擊。如 鏈聞報導 造成了協議和用戶價值數百萬美元等值的損失。一般來說,黑客都會選擇去中心化型的跨鏈橋作為目標,因為託管型的橋屬中心化方式控制資產,被攻破的難度較大;而去中心化的跨鏈橋,由於涉及比較精細的密碼學設計和計算機代碼的工程實現,往往容易在某處生產漏洞從而被黑客抓住利用進行攻擊。
本文將介紹分析用戶一般了解較少的跨鏈橋的核心:多方安全計算中的核心-隨機數 ‘k‘ 和由 k 推導出的 R 值的過程,科普一下這些攻擊事件到底是如何發生的以及一座可靠的去中心化跨鏈橋應該是怎麼實現。
據鏈聞 “帳戶私鑰被破解?拆解 Anyswap 跨鏈橋被⿊細節” 的揭露,此次安全事故是由於鏈上出現了兩筆具有相同 R 值數字簽名的交易,黑客透過兩個簽名值計算出了 Anyswap 跨鏈橋 MPC控制的帳戶的私鑰,進而盜走了其中的資產。那麼私鑰究竟是如何通過簽名計算得到的呢?有什麼辦法去防範這一安全漏洞的產生呢?首先我們要了解一下這個 R 值是什麼。
“R” 值 —— 帳戶安全的阿卡琉斯之踵
眾所周知,區塊鏈帳戶的權限是通過數字簽名實現的,即用戶用私鑰對交易數據簽名來完成賬戶資產的轉移。目前區塊鏈中廣泛使用的數字簽名算法是 ECDSA,它屬於 “非確定性” 一類的數字簽名算法,即同一數據會有多個合法的簽名,這是由於 ECDSA 在每次簽名過程中都會引入隨機數 k,而 R 值就是通過 k 計算得到的。這就等於說:要想破解出來私鑰,必須要獲得同樣的 R值;獲得同樣 的R 值,就等同於隨機數 k 值暴露了或者發生碰撞(即兩個簽名具有相同的 R)。所以隨機數 k 的重要性等同於私鑰。
假設有兩筆交易的簽名過程使用了相同的隨機數 k,那麼兩個簽名值的 R 是相同的。不妨設兩個簽名為 (R,s_1) 和 (R,s_2),那麼根據 ECDSA 的算法過程有以下代表這兩筆交易的兩個等式:
- 第 1 筆交易:s_1=k^(-1) (m_1+sk×R)
- 第 2 筆交易:s_2=k^(-1) (m_2+sk×R)
其中 m_1 和 m_2 是交易數據,而 sk 是帳戶私鑰。
觀察上面兩個等式,其中 s_1、s_2、R 是簽名數據,m_1 和 m_2 是交易數據,都是公開透明所有人都知道的,而未知數只有兩個,即 A 隨機數 k 和 B 帳戶私鑰 sk。根據簡單的計算,兩個未知數,兩個方程,那就可以求解得到未知數的值,這就是中學數學中的 “解方程”!所以可以自然地求解得到私鑰公式如下:
獲得私鑰 sk 就這麼計算:sk=(s_2 m_1-s_1 m_2)/((s_1-s_2)R)
由於在 Anyswap 攻擊事件中,黑客發現兩次交易過程中的簽名都使用了相同的隨機數 k!所以黑客很容易的就計算出來控制跨鏈資產橋的私鑰 sk 出來!然後就是拿著還原的私鑰把跨鏈鎖定合約裡的所有資產轉走!
那麼問題來了:這個這麼重要的隨機數 k 值為什麼會重複出現?接下來就引入為什麼要用多方安全計算這樣一個方案來產生隨機數的原因。
真正採用 MPC 帳戶簽名的話,k 值是不可能被洩露的!
相比普通帳戶簽名,多方安全計算 MPC,Multi-party Computation(這裡要特別說明,多方安全計算不是多重簽名!)賬戶簽名過程無疑是非常複雜的。因為簽名參與者不再是單一控制人,而是 N 多個控制人合作完成簽名過程,簡單點類比,就是多人協作的過程。在普通帳戶簽名過程,只需要在 R 值生成過程中使用真隨機數發生器,基本可保證安全;而在 MPC 帳戶簽名過程中,由於參與者不唯一,而且理論上認同可以存在惡意節點,因此 R 值的生成不再可以依賴單一用戶生成,因為一旦該用戶是惡意的,他將能夠自己控制隨機數 k,從而控制 R,進而計算得到MPC 賬戶私鑰,竊取資產。因此在 MPC 帳戶簽名過程中,R 的生成必須滿足以下 3 大原則:
- 非單一用戶生成
- 任何人都無法獲得 R 對應的 k 值
- 隨機數 k 的生成要足夠的隨機,滿足無偏性和不可預測性
用一句通俗的話形容這個過程就是:既要一群人一起協作幹活,又不能讓你們知道你們在幹什麼!
典型的 MPC 的設計實例:可驗證秘密分享- Wanchain MPC 賬戶 R 值安全性的核心保證
在 Wanchain 跨鏈橋機制中,跨鏈資產是由鎖定帳戶保管,而鎖定賬戶則是由 25 個匿名(這個數值可以根據需要擴展或者減少)Storeman 節點透過多方計算(MPC)的方式共同管理。在鎖定賬戶簽名過程中,R 值是由 25 個 Storeman 節點透過可驗證秘密分享(PVSS)共同決定,保證不會發生兩筆交易簽名 R 值相同的情況。
具體步驟如下:
第一步:各 Storeman 節點 P_i 在本地通過真隨機數發生器產生一個隨機數 k_i
第二步:各 Storeman 節點 P_i 將 k_i 進行 Shamir 秘密分享,並將秘密碎片透過安全信道傳輸給其他節點
第三步:收到其他節點傳輸的秘密碎片後,各 Storeman 節點在本地進行累加,得到一個組秘密碎片,然後將該組秘密碎片與橢圓曲線基點相乘,並將結果廣播
第四步:各 Storeman 節點對廣播的數據進行拉格朗日插值計算,得到一個橢圓曲線點,其橫坐標即為R值。
雖然以上過程稍顯複雜,但是核心思想很簡單,那就是 R 值是由 25 個 Storeman 節點共同確定的,每個 Storeman 節點貢獻一部分加密的碎片,最終通過密碼運算合成了 R 值。也就是實現了上面那句話描述的狀態:既要你們協作一起幹活,但是你們都不知道你們在幹什麼,其他人是誰。
可驗證秘密分享可以確保:
- 任何兩筆交易具有同樣的R值是不可能發生的
首先,R 值是有 25 個 Storeman 節點共同確定的,而不是由單一節點確定,理論上只要 25 個Storeman 節點中存在 1 個誠實節點,那麼 R 值就是隨機的;其次,各節點對 R 值貢獻的部分是通過真隨機數發生器產生的,分佈足夠均勻。綜合兩點,兩筆交易具有同樣 R 值的情況只有在25 個 Storeman 節點在兩次簽名中選擇的隨機數加和相等的時候才會發生,這一概率是2^(-256),簡單地說,比走在路上被隕石砸到腦袋的概率都小。
- R 值對應的 k 是完全保密的
在前文我們說過,k 一旦洩露,私鑰就可以計算得到。在 Wanchain 鎖定帳戶簽名過程中,k 是由 25 個 Storeman 節點共同決定,但是由於秘密碎片是透過安全信道傳輸給各節點,因此沒有任何一個節點能夠恢復出完整的 k 值。也就是說,k 值是僅僅是一種理論中的存在,能夠正常完成 MPC 簽名過程,但是確實任何人都不可見的。
透過 1 和 2 兩點的分析,得出 Wanchain 跨鏈橋的實例中鎖定帳戶安全性是極高的,不會出現私鑰洩露的情況。
那什麼樣的情況會導致出現 Anyswap 的兩筆交易出現相同的 R 值?
我們沒有全部讀完 Anyswap 項目的 MPC 這部分代碼,只能通過上述的 MPC 的理論和實現機制推導這樣的結論:
- 要不是沒有採用真正 MPC 的實現過程而只是掛了一個 MPC 的名義,還是由單一個體產生隨機數 k,從而造成 k 重複出現的情況
- 代碼在實現上出現了重大的代碼問題,而這種重大技術失誤在嚴謹的開發團隊看來是完全不應該出現的。
在另外一篇鏈聞的文章 “理想中的跨鏈橋,是什麼樣?“ ‘ 中關於MPC跨鏈橋有一段這樣的表述:“Anyswap:用一句話來解釋「黑客發現了 Anyswap 的代碼漏洞,從而拿到了公私鑰對,盜走了資產」,更像是各類項目都會出現的漏洞。 “ 筆者完全不認同各類採用 MPC 都會出現的漏洞這句話的論斷。業界我們交流的幾個實現了 MPC 的同行都不認為這樣的漏洞或者錯誤是個都會出現的普遍現象,採用 MPC 的精髓就是實現了多方的匿名安全計算,否則如果連這個都不能保證,何必採用 MPC,用個多簽,單籤的方案豈不更簡單,安全性更高?” 如果能夠使用足夠多節點的公鏈共識,則能很大程度上避免類似這次被攻擊的情況(MPC 不夠去中心化的選型)。 “ 這句話的結論更加幼稚,MPC 不是進依靠節點多去保證的,採用 3 個節點和採用 3000 個節點進行 MPC 實現的代碼都是一樣,不是靠數量的堆積,更何況該項目瀏覽器上顯示有超過 20多個的節點參與 MPC 計算,上文說到被碰撞出來的概率是 2^(-256),難道這樣的概率都不能保證安全,需要 2000 個節點能保證?這樣的結論誤導性很強,貽笑大方。
在文章的最後,特別想和大家強調一下隨機數對於區塊鏈的重要性,它不僅僅用在賬戶簽名過程,而且也用在 PoS 共識和分片 Shard 算法等領域,直接決定整個系統的安全性,萬萬不可忽視。一個小小的隨機數生產,並不是那麼簡單,是整個數學界,密碼學界一直以來孜孜追求不斷優化的一個聖杯領域。一個區塊鏈團隊還是應該多在分佈式隨機數生成算法領域不斷積累,設計並不斷優化鏈上隨機數發生器,這樣才能夠為跨鍊和共識過程提供安全隨機數,為整個區塊鏈,DeFi 領域提供可靠、可用、可信的跨鏈橋,切勿急功近利,濫竽充數。
延伸閱讀:《【AVAX 幣】Avalanche 雪崩協議是什麼?AVAX 幣哪裡買?》
關於 Avalanche
Avalanche 雪崩協議是新一代的、革命性的共識協議;Avalanche 雪崩公鏈正是基於雪崩共識打造的、對開發者最為友好的、可定制化的、高速安全可靠的高性能公鏈。
Avalanche 鏈上交易完成速度飛快、擁有最多數量的驗證節點,同時糅合了 PoS 共識的優點,保證所有鏈上活動的安全性。雪崩協議具有極速、低費用和綠色環保的特點。支持智能合約的應用如果想超越對手,都可通過部署在雪崩協議上獲得卓越競爭力。不可置信?現在就試用一下雪崩協議上的應用吧。
雪崩官網:https://avax.network
雪崩繁中群:https://t.me/avalanche_tw
雪崩中文 Facebook 專頁:https://www.facebook.com/Avalanche.TW
雪崩中文 Medium:https://medium.com/@avaxtw
更多生態項目:https://twitter.com/AVATAR_AVAX