當前沒有項目限制自身對預言機和中繼器的修改權限,使得當駭客獲得了權限後可以隨意進行攻擊。
- 撰文:Krzysztof Urbański,L2BEAT 團隊成員
- 編譯:Babywhale,Foresight News
L2BEAT 從成立以來就投入了大量精力來分析和理解與 Layer 2 協議相關的風險。我們始終以用戶和生態系統的最大利益為出發點,盡最大的努力成為一個公正、獨立的監督者,不會讓我們對項目或相關團隊的個人偏好影響事實。這就是為什麼即使我們尊重項目團隊投入項目的時間和努力,但也會對某些協議存在的潛在風險「拉響警報」或指出我們的擔憂。儘早進行與安全相關的討論可以讓整個生態系統更好地為潛在風險做好準備,並對任何可疑行為更早地做出反應。
今天我們想就跨鏈應用的共享安全模型展開討論。目前有兩種安全模型:共享安全與獨立應用安全。共享安全性就例如所有的 Rollup。獨立應用安全性主要由「omnichain」項目使用,這類項目的主要使用的是 LayerZero。
共享安全與獨立安全
共享安全性是指在給定基礎架構上運行的特定代幣或應用,而不是自由選擇安全模型,他們必須遵守基礎設施強加的任何安全要求。例如,Optimistic Rollups 通常會施加一個 7 天的最終窗口期——在此類 Rollups 上運行的應用不能簡單地忽略或縮短這個期限。這雖然看起來像是一個障礙,但它是有原因的。這個期限為用戶提供了安全保證,無論應用的內部安全策略是什麼,都必須遵守這套安全政策,應用可能只會加強 Rollups 的安全性,而不會削弱它。
獨立安全是指每個應用都負責定義其安全性,不受基礎設施以任何方式進行的限制。這乍看之下似乎是個好主意,畢竟應用的開發人員最清楚應用可能需要哪些安全措施。但與此同時,它將評估與每個應用安全策略風險相關的責任轉移給了終端用戶。此外,如果應用開發者可以自由選擇他們的安全策略,他們也可以隨時更改。因此,對每個應用評估一次風險是不夠的,每次應用的政策發生變化時都應該對其進行評估。
存在的問題
我們認為每個應用都可以自由定義其安全策略的獨立安全模型會帶來嚴重的安全問題。首先,它增加了終端用戶的風險,因為他們必須驗證他們打算使用的每個應用的風險。
獨立安全還增加了使用這種模型的應用的風險,例如增加了有關安全策略更改的額外風險——如果攻擊者要更改應用的安全模型,還不如簡單地禁用它,從而耗盡資金或以任何其他方式進行攻擊。應用之上沒有額外的安全層來防止被攻擊。
此外,由於安全策略能夠隨時且即時更改,因此幾乎不可能實時監控應用並告知用戶風險。
我們發現它類似於智能合約的可升級性,我們已經在 L2BEAT 上發出了警告。我們告知用戶在其智能合約中具有可升級性機制的 Rollup 和跨鏈橋,以及在每種情況下管理可升級性的確切機制。這已經相當複雜了,加之使用獨立的安全模型更會使得數目成倍增加,幾乎不可能有效跟蹤。
這就是為什麼我們認為獨立的安全模型本身就是一種安全風險,並且我們假設默認情況下將使用這種模型的每個應用都應被視為有風險,除非證明並非如此。
證明安全漏洞存在
我們決定在主網上測試我們的假設。選擇 LayerZero 框架進行實驗是因為它是最流行的以獨立安全為核心的解決方案之一。我們部署了一個安全的 omnichain 代幣,之後更新安全配置,允許惡意提取代幣。代幣的代碼基於 LayerZero 提供的示例,與實際部署的許多其他 omnichain 代幣和應用程序非常相似或相同。
但在我們深入細節之前,讓我們簡要了解一下 LayerZero 安全模型是什麼樣的。
正如 LayerZero 在白皮書上指出的,其「無需信任的鏈間通信」依賴於兩個獨立的參與者(預言機和中繼器)共同行動以確保協議的安全。
LayerZero 在其網站上表示,其核心概念是「運行 ULN (UltraLightNode) 、可配置鏈上終端的用戶應用」。 LayerZero 的鏈上組件依賴於兩個外部鏈下組件在鏈之間中繼消息——預言機和中繼器。
每當任何消息 M 從 A 鏈發送到 B 鏈時,都會發生以下兩個操作:
- 首先,預言機等到在 A 鏈上發送消息 M 的交易完成,然後在 B 鏈上寫入相關信息,例如 A 鏈包含消息 M 的區塊頭的哈希值(不同的鏈 / 預言機之間的確切格式可能有所不同)。
- 然後中繼器向 B 鏈發送一個「證明」(例如 Merkle Proof),證明存儲的區塊頭包含消息 M。
LayerZero 假設中繼器和預言機是獨立、誠實的參與者。但 LayerZero 也在白皮書中表示,如果不滿足該假設,例如中繼器和預言機串通,導致「預言機提供的區塊頭和中繼器提供的交易證明均無效,但仍然匹配」。
LayerZero 聲稱「LayerZero 的設計消除了合謀的可能性」。但事實上,這種說法是不正確的(我們在下面展示的實驗中證明了這一點),因為每個用戶應用程序都可以定義自己的中繼器和預言機。 LayerZero 不通過設計保證這些組件是獨立的並且無法串通,而是由用戶應用提供這些保證。如果應用選擇破壞它們,LayerZero 沒有任何機制可以阻止。
此外,默認情況下,所有用戶應用都可以隨時更改中繼器和預言機,從而完全重新定義安全假設。因此,僅檢查一次給定應用的安全性是不夠的,因為它可能在檢查後隨時更改,正如我們將在實驗中展示的那樣。
實驗設計
在我們的實驗中,我們決定創建一個簡單的 omnichain 代幣 CarpetMoon,同時在以太坊和 Optimism 上運行,並使用 LayerZero 在兩個鏈之間進行通信。
我們的代幣最初使用 LayerZero 提供的默認安全模型,使其與大(可能不是全部)當前部署的 LayerZero 應用完全相同。因此,它通常與使用 LayerZero 的任何其他代幣一樣安全。
首先,我們在以太坊和 Optimism 上部署我們的代幣合約:
https://ethtx.info/mainnet/0xf4d1cdabb6927c363bb30e7e65febad8b9c0f6f76f1984cd74c7f364e3ab7ca9/
然後我們設置了路由,以便 LayerZero 知道兩條鏈上哪個合約對應哪個合約。
https://ethtx.info/mainnet/0x19d78abb03179969d6404a7bd503148b4ac14d711f503752495339c96a7776e9/
代幣已部署完成,它看起來與使用 LayerZero 的所有其他 omnichain 代幣完全一樣,使用默認配置,沒有任何可疑之處。
我們向我們的「測試用戶」Alice 提供了 10 億枚以太坊上的 CarpetMoon 代幣。
https://ethtx.info/mainnet/0x7e2faa8426dacae92830efbf356ca2da760833eca28e652ff9261fc03042b313/
現在 Alice 使用 LayerZero 將這些代幣跨鏈至 Optimism。
我們將代幣鎖定在以太坊上的託管合約中:https://ethtx.info/mainnet/0xe4dc3757b86bfda8e7baddc088fb1a599e083ed77034c29e5dd8bd11f1e17771/
包含著交易的消息正在通過 LayerZero 傳遞給 Optimism:
跨鏈的代幣正在 Optimism 上鑄造,Alice 現在在 Optimism 上擁有 10 億枚 MoonCarpet 代幣:
一切都按預期進行,Alice 將代幣跨鏈,並看到以太坊上的託管合約中有 10 億枚 MoonCarpet 代幣,她在 Optimism 的帳戶上有 10 億枚 MoonCarpet 代幣。但為了確保一切正常,她將一半的代幣轉回以太坊。
我們從 Optimism 上銷毀 5 億代幣的交易開始:
有關該交易的信息被傳遞到以太坊:
正如預期的那樣,5 億枚 MoonCarpet 代幣從託管合約返回到 Alice 的地址:
https://etherscan.io/tx/0x27702e07a65a9c6a7d1917222799ddb13bb3d05159d33bbeff2ca1ed414f6a18
到目前為止,一切正常,也與假設的完全一致。 Alice 已經檢查過她可以將代幣從以太坊跨鏈到 Optimism 並再次跨鏈回來,她沒有理由擔心她的 MoonCarpet 代幣。
但是假設本身存在問題——例如,我們的代幣背後的團隊遇到問題,壞人 Bob 獲得了對我們應用的 LayerZero 配置的訪問權限。
如此,Bob 可以將預言機和中繼器從默認的組件更改為由他控制的組件。
需要注意的是,這是為每個使用 LayerZero 的應用提供的機制,根植於 LayerZero 的架構中,它不是任何類型的後門,而是一種標準機制。
所以 Bob 將預言機 更改為他控制下的 EOA:
https://ethtx.info/mainnet/0x4dc84726da6ca7d750eef3d33710b5f63bf73cbe03746f88dd8375c3f4672f2f/
中繼器也同樣被更改:
https://ethtx.info/mainnet/0xc1d7ba5032af2817e95ee943018393622bf54eb87e6ff414136f5f7c48c6d19a/
現在奇怪的事情發生了。由於預言機和中繼器現在在 Bob 的完全控制之下,他能夠盜取 Alice 的代幣。即使在 Optimism 上沒有採取任何行動(MoonCarpet 代幣仍在 Alice 的錢包中),Bob 也能夠說服以太坊上的 MoonCarpet 智能合約(使用 LayerZero 機制)他在其他鏈上銷毀了代幣並且他能夠提取在以太坊上的 MoonCarpet 代幣。
首先,他使用由他控制的預言機更新以太坊的區塊哈希:
https://ethtx.info/0xde2edee2cc7f070120e96c9df90d86696970befcfc221e18c6ac4168bb5b1d92/
現在他可以從託管合約中提取剩餘的代幣:
https://ethtx.info/0xda695f374b375d5372efeca37aae4c5a17f114d5a76db1e86edebb0924bcdcc7/
實驗結果
Alice 甚至不知道為什麼以及什麼時候發生了錯誤。突然之間,她在 Optimism 上的 MoonCarpet 代幣不再得到以太坊上代幣的支持。
智能合約不可升級,並且按預期運行。唯一可疑的活動是預言機和中繼器的變化,但這是 LayerZero 內置的常規機制,因此 Alice 甚至不知道這種變化是否有意為之。即使 Alice 知道了這個變化,也已經太晚了——攻擊者可以在她做出反應之前耗盡資金。
LayerZero 也無能為力——這些都是他們機制的有效執行,他們無法進行控制。理論上,應用本身可以阻止自己更改預言機和中繼器,但據我們所知,已經部署的應用都沒有這樣做。
我們做了這個實驗來測試是否有人注意到它,但正如我們所料,沒有人注意到。有效地監控所有使用 LayerZero 構建的應用來檢查它們的安全策略是否發生改變,並在發生這種情況時警告用戶是幾乎不可能的。
即使有人能夠及時發現預言機和中繼器已經發生變化並帶來了安全風險,但為時已晚。由於新的預言機和中繼器現在可以自由選擇傳遞的消息或簡單地禁用鏈間通信,用戶通常對此無能為力。我們的實驗清楚地表明,即使 Alice 注意到應用配置的變化,她也不能用她的跨鏈代幣做太多事情——新的預言機和中繼器已不再在原始的通信鏈條上接受消息,所以不會將消息返回以太坊。
結論
正如我們所看到的,即使我們的代幣是使用 LayerZero 構建並按預期使用其機制,我們還是能夠從代幣的託管中竊取資金。當然,這是應用(在我們的例子中是 CarpetMoon 代幣)的錯誤,而不是 LayerZero 本身的錯誤,但這證明 LayerZero 本身不提供任何安全保證。
當 LayerZero 描述他們關於預言機和中繼器的安全模型時,他們假設應用所有者(或擁有私鑰的人)不會做任何不合理的事情。但在對抗性的環境中,這種假設是不正確的。此外,它要求用戶將應用開發者作為可信賴的第三方來信任。
因此在實踐中,人們不能對使用 LayerZero 構建的應用的安全性做出任何假設——每個應用都應該被認為是有風險的,直到證明不是這樣。
實際上,整個故事是從我們計劃在 L2BEAT 網站上包含所有 omnichain 代幣的 PR 開始的——我們很難弄清楚如何評估它們的風險。在分析風險時,我們提出了實驗的想法。
如果在 L2BEAT 上線,後果是我們必須在使用 LayerZero 構建的每個應用之上放置警報,警告可能存在的安全風險。但我們想就安全模型展開更廣泛的討論,因為我們認為獨立的安全是一種應該避免的模式,尤其是在我們的領域。
我們相信,隨著 LayerZero 等獨立安全模型越來越流行,將會有越來越多的項目濫用它們,造成大量破壞並增加整個行業的不確定性。