原文: 《以太坊系列(三) | “以太坊合併”之際,有哪些不可忽視的安全問題? 》
*以下僅為安全技術研究,不構成投資建議,本文部分內容翻譯自jmcook.eth 發表在mirror上的文章,詳細內容可自行查閱。
今天是“以太坊大合併”系列的最後一篇,在前兩篇,我們介紹了以太坊為什麼會升級,以及以太坊會面臨哪些監管問題和應用層問題。
本章節主要介紹以太坊合併使用PoS 共識機制以後,可能面臨的共識層面的攻擊。
1、小型質押者的攻擊
短程重組(Short range re-orgs)
這是一種針對信標鏈的攻擊,該攻擊通常由攻擊者向其他驗證者隱藏部分信息,然後在某個特定時刻發布,從而實現雙花或通過front-running 大額交易來提取MEV。這種攻擊還可以擴展到多個區塊,但成功的可能性會隨著重組長度的增加而降低。
這種攻擊本質上是一種區塊重組,區塊重組分為事前重組(ex ante reorg)和事後重組(ex post reorg)兩種。其中,事前重組指的是在區塊尚未被創建時,攻擊者從主鏈中將其替換;事後重組則指的是攻擊者刪除主鏈中已經驗證的區塊。在PoS以太坊中,如果要進行事後重組必須擁有其超過2/3 的權益。同時有研究表明,即使攻擊者擁有了以太坊65%的權益,攻擊成功的機率也小於0.05%。
短程重組攻擊是通過事前重組實現的,攻擊者不需要控制以太坊中大多數質押的ETH 就可以實現,且成功的機會會隨著控制質押比例的增加而增加。
彈跳攻擊和平衡攻擊(Bouncing and Balancing)
平衡攻擊(Bouncing and Balancing)攻擊指的是攻擊者採取特定手段,將誠實的驗證者集合拆分為對區塊持不同意見的離散小組。
具體地說,攻擊者等待機會提出一個區塊,當它到達時,他們會在同一個slot 中提出兩個區塊。他們將一個區塊發送給誠實驗證者集的一半,將另一個區塊發送給另一半。分叉選擇算法將檢測到這種衝突的情況,並且區塊提議者會被罰沒並從網絡中彈出。但上述兩個區塊仍然存在,並且將有大約一半的驗證者集證明其中的每一個分叉。
在花費單個驗證者罰沒成本的情況下,攻擊者成功地將區塊鏈一分為二。與此同時,其餘的惡意驗證者扣留了他們的證明。然後,在執行分叉選擇算法時有選擇地將有利於一個或另一個分叉的證明發布給足夠的驗證者,這使得他們能夠生成任何一個具有最多累積證明的分叉。這可以無限期地繼續下去,攻擊者在兩個分叉上保持驗證者的平均分配。由於兩個分叉都無法吸引2/3 的絕對多數,所以信標鏈無法最終達成共識並出塊。
這種攻擊方式中,攻擊驗證者控制的質押權益比例越大,在任何給定epoch 時間段進行攻擊的可能性就越大,因為他們越有可能選擇驗證者在每個slot 中提議一個區塊。即使只控制1% 的質押權益,發動平衡攻擊的機會平均每100 個epoch 時期就會出現一次,這並不需要等待太久。
一種名為彈跳攻擊(bouncing attack)的類似攻擊方式,也只需要控制一小部分質押權益。在這種情況下,攻擊者的驗證者將拒絕投票。該方式中,攻擊者沒有發布投票來保持兩個分叉之間的平均分配,而是在適當的時候使用他們的投票來證明在分叉A 和分叉B 之間交替的檢查點的合理性。兩個分叉之間的這種翻轉,可停止最終確定性。
雪崩攻擊(avalanche attacks)
2022 年3 月的一篇論文描述了另一種稱為雪崩攻擊(avalanche attacks)的攻擊類型。這篇論文的作者認為,提議者權重提升(proposer-weight boosting)方案無法防止雪崩攻擊的某些變體。然而,論文作者也只展示了對以太坊分叉選擇算法的高度理想化版本的攻擊(他們使用了沒有LMD 的GHOST)。其中,GHOST分叉選擇算法會將第一個分叉區塊和其對應的所有子孫區塊所得票數累加,並選擇其中得票數最多的分叉作為主鏈。
假設要發動一次雪崩攻擊,前提條件是攻擊者能夠控制多個連續區塊的提議者。當提議者針對slot提議時,攻擊者將扣留並收集他們的區塊,直到扣留區塊達到和主鏈區塊相等的累加權重。然後,攻擊者將釋放被扣留的全部區塊,此時由於主鍊和子鏈擁有相同的權重,使得區塊鏈產生分叉,造成後續區塊順序混亂。例如,攻擊者扣留6個區塊,第一個誠實區塊n與第一個敵對區塊n同時競爭,此時在系統中產生了一個分叉。然後攻擊者將剩餘的5 個敵對區塊全部都並行連接在第一個敵對區塊後的n+1 處。
具體如下圖所示,由於GHOST分叉選擇算法的特性,此時敵對區塊n和其後的所有5個分叉和原鏈中6個區塊累加的權重相等,這意味著系統中第7個區塊有一定概率會選擇連接在攻擊者製造的分叉後。在這種情況下,攻擊者可以對剩餘的扣留區塊重複此操作,阻止誠實的驗證者繼續跟隨在證實主鏈後,直至攻擊者用盡所有預留區塊。如果攻擊者在攻擊過程中有更多機會提出區塊,他們可以使用這些區塊來擴展攻擊,這樣,越多的驗證者參與共謀攻擊,攻擊持續的時間就越長,並且可以將更多誠實的區塊從主鏈中移出。
圖源自《Two Attacks On Proof-of-Stake GHOST/Ethereum》
而LMD-GHOST 分叉選擇算法的LMD 部分減輕了雪崩攻擊,LMD, 即“最後一條消息驅動”,指的是每個驗證者保存的一個表格,其中包含從其他驗證者收到的最新消息。只有當新消息來自比特定驗證者表中已存在的slot 更晚的slot 時,該字段才會更新。在實踐中,這意味著在每個slot 中,接收到的第一條消息就是它接受的消息,其他消息將會忽略。換句話說,共識客戶端使用來自每個驗證者最先到達的消息,並且相互矛盾的消息會被簡單地丟棄,以防止雪崩攻擊。
長程攻擊(long range attacks)
長程攻擊也是一種權益證明(PoS)共識機制下特定的攻擊方式,主要包含以下兩種情況:
第一種情況是,攻擊者作為參與創始區塊的驗證者,在原本的區塊鏈旁維護一個單獨的區塊鏈分叉,並最終說服誠實的驗證者在很久以後的某個時間點切換過去。但是該攻擊在信標鏈上無法實現,因為“finality gadget”可確保所有驗證者定期就誠實鏈的狀態(“檢查點”)達成一致,此後檢查點之後的區塊將無法再進行重組。
第二種情況是,當新節點加入網絡時,將從離其最近的節點處獲取信息(稱為弱主觀性檢查點)作為偽創始區塊構建區塊鏈。這將為加入網絡的新節點創建一個“信任網關”,然後其才能開始自己驗證區塊。然而,從區塊瀏覽器等客戶端收集構建檢查點所需的可信區塊信息,並不能增加客戶端本身的可信度,因此主觀性是“弱的”。因為根據定義,檢查點由網絡上的所有節點共享,所以不誠實的檢查點是共識失敗的狀態。
2、大型質押者的攻擊
33%
質押的ETH數量為33% 是攻擊者的一個基準,如果其超過了這個數量,他們就有能力阻止信標鏈最終確定,而無需精細控制其他驗證者的操作。這是因為要最終確定信標鏈,必須有2/3 的質押ETH 來證明檢查點對(pairs of checkpoints)。
如果1/3 或更多的質押ETH 被惡意證明或未能證明,那麼2/3 的絕對多數就不可能存在。對此的防禦措施是信標鏈的消極懲罰(inactivity leak)機制,這是一種緊急安全措施,它會在信標鏈4 個epoch 後仍未能finalize 時被觸發。消極懲罰標識了那些未能證明或證明與大多數人相反的驗證者。這些非證明驗證者擁有的質押ETH 會逐漸流失,直到最終它們佔總數的比例不到1/3,這樣區塊鏈才能再次finalize。
50%和51%
理論上,在一個惡意驗證者控制的質押ETH 比例達到50% 的情況下,他可以將以太坊區塊鏈分裂成兩個大小相等的分叉。與前面描述的平衡攻擊類似,攻擊者可通過為同一個slot 提出兩個區塊,然後只需使用其全部50% 的質押權益與誠實的驗證者集進行相反的投票,從而維持兩個分叉並防止最終確定性。
在四個epoch 之後,兩個分叉上的消減懲罰(inactivity leak)機制將激活,因為每個分叉都會看到其一半的驗證者無法證明。每個分叉都會消減驗證者集的另一半質押權益,最終導致兩條鏈都無法達到2/3 的絕大多數驗證者驗證。在這一點上,唯一的選擇就是依靠社區恢復。
而當攻擊者控制的質押權益占到51% 以上,則可以控制分叉選擇算法。在這種情況下,攻擊者將能夠以多數投票作證,讓他們有足夠的控制權來進行短期重組,而無需欺騙誠實的客戶端。控制51% 的質押權益不允許攻擊者改變歷史,但他們有能力通過將多數投票應用於對其有利的分叉,或將區塊重組來影響未來。
誠實的驗證者會效仿,因為它們的分叉選擇算法也會將攻擊者選擇的鏈視為最重鏈,因此該攻擊鏈可以最終確定。這使攻擊者能夠審查某些交易,進行短程重組,並通過重新排序對其有利的區塊來提取最大MEV。針對該問題的防御手段就是多數質押權益的巨大成本,這會讓攻擊者會面臨巨大的風險,因為社交層可能會介入,並採用誠實的少數派分叉,從而使攻擊者的質押權益大幅消減。
66%
控制66% 或更多比例質押ETH 的攻擊者可以確定其首選鏈,而無需控制其他誠實的驗證者。攻擊者可以對他們想要選擇的分叉進行簡單的投票,然後最終確定它。作為絕對多數的質押者,攻擊者將始終控制最終區塊的內容,其擁有花費、回滾和再次花費的權力,他還能審查某些交易並隨意重組區塊鏈,此時攻擊者實際上擁有了事後重組和最終性反轉的能力(即改變過去並控制未來)。而唯一的防禦措施,就是通過社交層介入來協調採用替代分叉。
總的來說,儘管存在這些潛在的攻擊向量,但信標鏈的風險很低,甚至要低於工作量證明的等效鏈。這是因為攻擊者為了用投票權壓倒誠實的驗證者,需要將質押ETH 的巨大成本置於風險之中。內置的“胡蘿蔔加大棒”激勵層可以防止大多數的惡意行為,尤其是對於低質押的攻擊者。更微妙的彈跳攻擊和平衡攻擊也不太可能成功,因為真實的網絡條件使得很難實現對特定驗證者子集的消息傳遞進行精細控制,並且客戶端團隊已經用簡單的補丁快速修復了已知的彈跳攻擊、平衡攻擊以及雪崩攻擊問題。
但34%、51% 或66% 攻擊可能需要社區進行投票解決,所以社區的有效治理對攻擊者來說是一個強大的抑制因素。對於攻擊者來說,一次技術上成功實現的攻擊仍然存在被社區阻止的風險,這降低了攻擊者獲利的可能性,足以起到有效的威懾作用。這也是維持一個價值觀一致的有效社區對於投資而言如此重要的原因。
3、ETH PoW 安全性
自以太坊成立以來,礦工一直在以太坊中扮演著重要角色,但以太坊的合併將打破這一局面。據Bitpro 估計,GPU 礦工要想在合併後的加密生態系統中保持盈利,需要關閉大約95%的GPU 。但是如此多的GPU不太可能在合併後立即關閉,所以礦工可能在合併後試圖進行PoW 分叉。事實上,目前確實已有一些礦工明確表示了對ETHPoW 分叉的支持。而如果同時再有部分交易所也支持分叉,那麼分叉的壽命將會比預期的更長。
此外,目前以太坊分叉項目Ethereum Pow 官網已成立,且已開始有所動作:
2022 年8月15 日,以太坊分叉項目Ethereum Pow 發推文稱,ETHW Core 的初始版本已在GitHub 上發布,主要特點是: 1、禁用難度炸彈;2、EIP-1559變更,基礎費用改為礦工和社區共同管理的多簽錢包;3、調整了ETHW的起始挖礦難度。
2022 年8 月26 日,以太坊分叉項目EthereumPoW 發推稱,ETHW第一個測試網“冰山”發布。隨之而來的是區塊鏈瀏覽器和RPC服務器。我們歡迎社區中所有潛在的合作夥伴(交易所、資金池、錢包供應商、橋樑、建設者等)加入我們,共同構建一個真正的PoW驅動的以太坊生態系統。
那麼,在以太坊合併升級後,出現的硬分叉ETHPoW 可能會面臨哪些安全問題呢,我們下面來詳細分析。
1、算力攻擊
51% 算力攻擊是針對區塊鍊網絡的潛在攻擊,當系統中惡意的單個實體或組織能夠控制大部分,即全網超過51%的算力時,由於PoW算法中的共識由算力決定,這使得攻擊者可以利用算力篡改賬本,導致系統遭受惡意攻擊。而在以太坊合併之後,無法再通過挖礦獲取收益的礦工會關閉礦機,這導致基於PoW 的ETH 分叉可能會丟失部分算力,比如目前最大的礦池Ethermine 已發佈公告,將停止支持ETH PoW 挖礦。
圖源自ethermine.org
而一旦支持ETHPoW 的算力下降,就會降低攻擊者發動算力攻擊的成本。則攻擊者可以通過租用大量礦池算力,使得其算力達到51%以上,此時可以利用算力優勢更快地生成區塊,當生成的區塊成為系統中最長的鏈時,就可以回滾區塊交易,實現數據篡改,造成巨大危害,比如:雙花、控制任意地址的交易等。下面將分別進行介紹:
雙花
雙花攻擊是指攻擊者企圖重複花費自己賬戶所擁有的同一筆數字代幣的攻擊行為。舉個例子:
假設A擁有51%的算力,在區塊高度1000時,A轉給B一個ETH,該轉賬交易被礦工打包。
待交易被確認後,A依靠51%的算力優勢在區塊高度999後重新生成了一條“更長的鏈”,並在區塊高度1000處重新將該ETH轉給C且該交易記錄被打包,即該鏈包含了A將一個ETH轉給C的記錄。
根據“最長鏈共識”,包含給C轉賬記錄的鏈成為主鏈,則A轉給B的一個ETH則為“無效支付“。
控制任意地址的交易
如果擁有了51%的算力,則攻擊者可以任意打包或者不打包某個地址的交易,也可以阻止區塊確認任意交易,甚至阻止部分礦工獲得有效的記賬權,從而達到控制任意地址交易的目的。
但是,擁有51%的算力也不是萬能的,比如無法修改其他人的交易記錄,也不能阻止交易的發出,更不能憑空產生ETH。
2、重放攻擊
傳統計算機術語中,重放攻擊(Replay Attacks)又稱重播攻擊、回放攻擊,是指攻擊者發送一個目標主機已接收過的數據包,來達到欺騙系統的目的。而在區塊鏈領域,重放攻擊通常出現在區塊鏈硬分叉的時候,指的是“一條鏈上的交易在另一條鏈上也往往是合法的”。
2016 年7 月20 日晚,以太坊在第192萬個區塊高度發生了硬分叉,產生了兩條鏈,分別稱為ETH chain和ETH Classic chain,對應的代幣分別為ETH和ETC。
由於這兩條鏈上的地址和私鑰相同,交易格式也完全相同,因此其中一條鏈上的交易在另一條鏈上也是完全合法的。所以你在其中一條鏈上發起的交易,將其放到另一條鏈上去重放,可能也會得到確認。由於事先沒有做好預案,很多人利用這個漏洞,不斷在交易所進行ETH充提操作,獲取額外的ETC。至此, “重放攻擊”得以在區塊鏈世界被重新定義。
本次以太坊合併升級,大概率出現的硬分叉ETHPoW,理論上也可能存在上述的問題。
針對重放攻擊,應該如何防範呢?其實對於以升級為目的的分叉而言很容易就能達到,因為硬分叉升級將採用不同的客戶端版本,交易的前綴中通常包含有發起交易客戶端的版本信息。分叉後礦工為了避免打包舊客戶端的“非法交易”(並非惡意交易,僅僅只是版本號過低不被其他節點所承認),通常會拒絕一定版本號以前的交易,保證惡意攻擊者很難在硬分叉升級時通過重放攻擊竊取資金。
而在2022 年8 月23 日,以太坊分叉項目EthereumPoW 官方發文稱,ETHW Core 發布第二次代碼更新,強制執行EIP-155。此次更新後,所有交易都必須使用鏈ID 進行簽名。這將保護ETHW 用戶免受來自ETHPoS 和其他分叉Token 的重放攻擊。
這裡簡單介紹下EIP-155 :
該提案名為“簡單的重放攻擊保護”。提案中規定:如果block.number >= FORK_BLKNUM並且CHAIN_ID是可用的,那麼在計算交易的哈希以進行簽名時,不是僅對之前的六個rlp 編碼元素(nonce, gasprice, startgas, to, value, data)進行哈希處理,而是應該對九個rlp 編碼元素(nonce, gasprice, startgas, to, value, data, chainid, 0, 0)進行哈希處理。此時,簽名中的v 值不再是recid , 而是recid+ chainID*2+ 35。
因此,簡單來說,在交易簽名時,需要提供一個簽名器(Signer)和私鑰(PrivateKey)。需要Singer是因為在EIP-155 修復簡單重複攻擊漏洞後,需要保持舊區塊鏈的簽名方式不變,但又需要提供新版本的簽名方式。因此通過接口實現新舊簽名方式,根據區塊高度創建不同的簽名器。而EIP-155 中實現的新哈希算法,主要目的是獲取交易用於簽名的哈希值TxSignHash。和舊方式相比,哈希計算中混入了鏈ID和兩個空值。注意這個哈希值TxSignHash 在EIP155中並不等同於交易哈希值。
圖源自《區塊鏈技術與實現》
如此一來,一筆已簽名的交易就只可能屬於某唯一確定的區塊鏈。
此外,為了保證項目安全,建議項目方在合約中進行離線簽名校驗時,簽名數據中應包含Chain ID,避免因跨鏈簽名重用導致資產損失。
3、應用層項目
事實上,常規性的分叉是需要用算力做選擇,選擇的主角是礦工,而這次以太坊升級如果真的有兩條以太坊鏈同時出現,需要作出選擇的,是以太坊的整體生態,是其中的項目方,是用戶,是投資者。
如今的以太坊與2016年硬分叉時相比早已今非昔比了,DeFi 項目已經佔了以太坊生態的半壁江山,但DeFi 項目的基礎是鏈上的資產,所以項目方主要是跟著資產方走的。所謂資產方,是如USDT、USDC 這種鏈上穩定資產,DeFi 的抵押借貸生態基本都是基於資產方的。
對於這些穩定資產(這裡主要指穩定幣)的發行方而言,如果以太坊網絡分叉,他們就會突然面臨一個危險的問題:出現兩個版本的穩定幣。作為穩定幣的發行者,每發行一個穩定幣,就會突然有兩個債務義務。
雖然大多數人認為,穩定幣發行方會把新的PoS鏈視為“真正的”以太坊網絡,但如果他們想要支持PoW鏈呢?畢竟他們有足夠的經濟動機去做。
例如,他們可以做空PoS 以太坊代幣,在PoW 網絡上宣布贖回,然後大撈數十億美元。這可能會破壞新的以太坊網絡,導致貸款被清算,協議、交易所以及相關的額DeFi項目等被關閉。這將造成一場巨大的混亂,並可能大範圍地摧毀加密貨幣市場。
同樣,以太坊分叉項目EthereumPow 8 月17 日發推文稱,ETHW Core將引入流動性池凍結技術保護用戶資產,即在以太坊PoW硬分叉之後,特別是最初的幾個區塊,用戶存放在流動性池中的ETHW代幣,如Uniswap、Susiswap、Aave、Compound,將被黑客和科學家使用棄用的或沒有價值的方式交換或借出USDT、USDC、WBTC ,這將對整個網絡和社區造成巨大的混亂。因此,ETHW Core暫時凍結某些LP合約以保護用戶的ETHW代幣,直到協議的控制器或社區找到更好的歸還用戶資產的方法。凍結將不適用於僅涉及單一資產的質押合約(例如ETH2.0存款合約和Wrapped Ether)。 ETHW Core建議每個人在硬分叉之前從LP(例如DEX和借貸協議)中提取他們的ETH。
參考文獻:
《Ethereum PoS Attack and Defense》
https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs
《什麼是區塊鏈上的重放攻擊》
https://zhuanlan.zhihu.com/p/163121813
《區塊鏈技術與實現》
https://learnblockchain.cn/books/geth/part3/sign-and-valid.html