有哪些常見的橋安全性漏洞?
首頁
文章
有哪些常見的橋安全性漏洞?

有哪些常見的橋安全性漏洞?

進階
發佈時間 Mar 22, 2023更新時間 Jun 15, 2023
9m

本文為社群提交內容。作者為 CertiK 的審計人員,Minzhi He。

本文中的觀點僅代表提供者/作者的觀點,不一定反映幣安學院的觀點。

摘要

區塊鏈橋對於在區塊鏈領域達成互操作性相當關鍵。因此,橋的安全性無比重要。一些常見的橋安全性漏洞包含弱鏈上與鏈下驗證、不當操作原生代幣與配置錯誤。建議對所有可能的攻擊媒介進行測試,以確保良好的驗證邏輯。

前言 

區塊鏈橋是一種連結兩個區塊鏈的協定,讓鏈彼此之間的互動得以實現。如果您擁有比特幣,但希望參與以太坊網路的 DeFi 活動,區塊鏈橋就可以讓您在不賣出比特幣的前提下進行參與。 

區塊鏈橋對於在區塊鏈領域達成互操作性不可或缺。它們透過使用不同的鏈上及鏈下驗證達成功能,因此具有不同的安全性漏洞。

為什麼橋的安全性非常重要? 

橋通常會持有用戶希望跨鏈傳輸的代幣。這通常會以智能合約部署的形式進行,隨著跨鏈傳輸的累積,橋會持有一筆可觀數量的代幣,因而成為駭客有利可圖的目標。 

此外,由於區塊鏈橋涉及許多組成元素,也因此有很大的攻擊範圍。考量到這點,不肖人士有很大的動機會鎖定跨鏈應用程式,以偷取大筆資金。 

根據 CertiK 的估計,2022 年橋受到的攻擊造成了全年度共 13 億美元的損失。 

常見的橋安全性漏洞

為提升橋的安全性,很重要的一點在於了解常見的橋安全性漏洞,並在推出橋之前測試漏洞。這些漏洞可以分為下列四個層面。 

弱鏈上驗證

對於簡單的橋,尤其是為特定 DApp 設計的橋,通常只有最低限度的鏈上驗證。這些橋依賴中心化的後端來執行如鑄造、銷毀、代幣轉移等基本操作,而所有的驗證都發生在鏈下。

相反的,其他類型的橋使用智能合約來驗證訊息並執行鏈上驗證。在此情況下,當一筆用戶儲值資金進入鏈時,智能合約會生成一筆簽署過的訊息,並回傳交易中的簽章。此簽章作為儲值證明,並用來作為驗證用戶在其他鏈上的提領請求之用。此流程應該能夠避免各種安全性攻擊,包含重播攻擊與偽造的儲值紀錄。 

然而,如果在鏈上驗證流程中出現漏洞,攻擊者就可以造成嚴重的傷害。例如,如果某個橋使用雜湊樹作為驗證交易紀錄之用,攻擊者便可以生成偽造的證明。這代表,如果驗證流程有漏洞,他們便可以繞過證明驗證,為自己的帳戶鑄造新代幣。

特定的橋使用所謂「打包代幣」的概念。例如,當用戶把 DAI 從以太坊轉移到 BNB 鏈時,他們的 DAI 會從以太坊合約取走,而在 BNB 鏈上將發行出同等數量的打包 DAI。 

不過,如果這筆交易沒有經過妥善的驗證,攻擊者便能部署一份惡意合約,透過操控功能,將源於橋的打包代幣導向不正確的地址。 

攻擊者也需要受害者來批准橋合約,以使用「transferFrom」函數轉移代幣,以將榨取橋合約的資產。 

不幸的是,情況比想像的更糟,因為許多橋向 DApp 用戶請求無限的代幣批准。這是降低燃料費的常見實務做法,但允許智能合約無限存取用戶錢包可能造成額外的風險。攻擊者可以利用驗證缺乏與超額批准,將別人的代幣轉到自己手中。

弱鏈下驗證

在某些橋系統中,鏈下的後端伺服器在驗證來自區塊鏈的訊息合法性上扮演關鍵角色。這種情況下,我們會關注儲值交易的驗證。 

具有鏈下驗證的區塊鏈橋運作方式如下: 

  1. 用戶與 DApp 互動,以儲值代幣到來源鏈的智能合約中。

  2. 接著 DApp 會透過 API 發送一組儲值交易的雜湊到後端伺服器。

  3. 交易雜湊需要經過伺服器的多重驗證。如果驗證認為交易雜湊合法,簽署者即會簽署訊息,並透過 API 回傳簽章到用戶介面。

  4. 收到簽章後,DApp 會進行驗證,並允許用戶從目標鏈提領代幣。

後端伺服器必須確保它所處理的儲值交易真實發生,而非偽造。後端伺服器會決定用戶能否在目標鏈上提領代幣,因此也成為了攻擊者眼中的高價值目標。

後端伺服器需要驗證交易發出事件的結構,以及發出事件的合約地址。如果後者被忽略了,攻擊者就可以部署惡意合約,以與合法儲值事件一樣的結構來偽造儲值事件。 

如果後端伺服器沒有驗證發出事件的地址,它就會認為這有效交易,並簽署訊息。攻擊者可以接著發送交易雜湊給後端,繞過驗證並允許他們從目標鏈提領代幣。

不當處理原生代幣

橋通常採用不同的方式來處理原生代幣與功能型代幣。例如,以太坊網路的原生代幣是 ETH,而多數功能型代幣會遵循 ERC-20 標準。 

用戶若想跨鏈轉移 ETH,就必須先在橋合約儲值。為達成這個目標,用戶只需將 ETH 附加到該筆交易,即可透過讀取交易的「msg.value」欄位獲取 ETH 的交易金額。

儲值 ERC-20 代幣與儲值 ETH 截然不同。若要儲值 ERC-20 代幣,用戶首先必須允許橋合約使用他們的代幣。用戶批准並在橋合約儲值代幣之後,合約將會使用「burnFrom()」函數銷毀用戶代幣,或是使用「transferFrom()」函數將用戶代幣轉入合約。 

區別方式之一,就是在同樣的函數中使用 if-else 語法。或是創建兩個獨立的函數來處理各自的情境。若試圖以 ERC-20 的儲值函數儲值 ETH,可能會造成資金損失。

處理 ERC-20 儲值請求時,用戶通常會提供代幣地址作為儲值函數的輸入值。這會帶來巨大的風險,因為在交易期間可能出現不可信任的外部呼叫。使用白名單僅納入橋支援的代幣,是減少風險的常見方式。只有被納入白名單的地址允許作為變數傳遞。這可以避免外部呼叫,因為項目團隊早已過濾了代幣地址。

不過,鏈橋在處理原生代幣的跨鏈轉移時,也可能出現問題,因為原生代幣並沒有地址。原生代幣係以一組零地址 (0x000...0) 代表。這可能會出問題,因為傳遞一組零地址給函數可能會繞過白名單驗證,即使使用方式是不正確的。 

當鏈橋合約呼叫「transferFrom」函數來轉移用戶資產到合約時,對零地址的外部呼叫會回傳「false」,因為在零地址中沒有採用「transferFrom」函數。不過,如果合約沒有妥善處理回傳,交易仍然可能發生。這讓用戶有機會在不轉移任何代幣到合約的情況下執行交易。

配置錯誤

在多數區塊鏈橋中會設定特權角色負責設定代幣與地址的白名單或黑名單、指派或改變簽署人、或進行其他重要設置。確保所有配置都精確無誤非常重要,因為即使是多麼微不足道的疏忽,都可能帶來嚴重的損失。

事實上目前已經發生一例案件,攻擊者因配置錯誤而成功繞過轉移紀錄驗證。項目團隊在被攻擊的幾天前剛採行協定升級,其中包含一個變數的更動。該變數用以代表可靠訊息的預設值。此項變動導致所有訊息都被自動視為已驗證,攻擊者因此可以提交任意訊息並通過驗證流程。

如何提升鏈橋的安全性

以上說明四種常見的鏈橋漏洞,展示確保相互關聯的區塊鏈生態系安全性所面臨的挑戰。各種漏洞各有重要的考量因素,無法以相同方式一體適用。 

例如,想要提供一套確保驗證流程不出錯的通用準則,將會相當有挑戰性,因為每一種鏈橋都有獨特的驗證要求。防止繞過驗證最有效的方法,是對所有可能的攻擊媒介進行徹底的測試,以確保驗證邏輯穩當安全。 

總而言之,務必對潛在攻擊進行嚴格測試,並特別注意鏈橋最常見的安全漏洞。  

總結 

由於跨鏈橋具有極高價值,因此長期以來一直是攻擊者的目標。建構者可以透過進行徹底的部署前測試與進行第三方審計來強化鏈橋安全性,也能減少過去幾年來遭受破壞性駭客攻擊的風險。鏈橋在多鏈世界中至關重要,但在設計與構建有效的 Web3 基礎架構時,安全性必須是首要考量。

延伸閱讀

什麼是區塊鏈橋?

什麼是跨鏈互操作性?

三大熱門加密貨幣橋及其運作方式

什麼是打包代幣?

免責聲明和風險警告:本內容按「如實」原則呈現給您,僅用於一般資訊和教育目的,不作任何形式的陳述或保證。請勿將其視為財務、法律或其他專業建議,亦未企圖推薦購買任何特定產品或服務。您應該向適當的專業顧問尋求建議。本文由第三方貢獻者提供,請注意,文中所述看法均屬第三方貢獻者所有,不一定能反映幣安學院意見。請在這裡參閱完整的免責聲明以了解詳情。數位資產價格可能會波動。您的投資價值可能會下跌或上漲,您可能無法收回投資金額。您須對自己的投資決策負全部責任,幣安學院對於您可能遭受的任何損失概不負責。本文並非財務、法律或其他專業建議。如需更多資訊,請參閱我們的使用條款和風險警告。