Solidity

保利網路黑客如何工作?

  • August 26, 2021

最近PolyNetwork被黑客入侵,導致數百萬美元被耗盡。

保利團隊說:

黑客利用了合約呼叫之間的漏洞,漏洞並不是傳聞中的單身守門員造成的。

我想知道 Poly Network Hack 是如何完成的。Solidity 程式碼中存在哪些漏洞。

=> 之前是否有任何 Solidity 的處理機製或某種批准機制來防止這種黑客攻擊?


有關的:

Poly Network 遭遇重大黑客攻擊,總計 6.1 億美元的加密貨幣被盜。

以下內容來自這兩個來源:

  • 來自 Kelvin Fichter 的 Twitter 文章(連結
  • 來自 Peckshield 的報告(連結

基本上,Poly 有一份契約,負責驗證是否與正確的帳戶進行通信。這是一個白名單,一個地址列表,這些地址被批准向系統發送有關不同鏈上 txs 狀態的消息。這個合約叫做EthCrossChainData,我們簡稱它Data。如果您可以將您的地址添加到此白名單中,那麼您就可以告訴 Poly 任何您喜歡的內容,它會相信您。例如,您可以告訴 Poly,Poly 中的所有資產現在實際上都屬於您,因為您已經進行了相關交易,將資金鎖定在其他鏈上,而網路只會相信您。

這正是黑客所做的。但是怎麼做?

Data合約由另一個合約擁有:EthCrossChainManager合約,我們將其稱為Manager合約。的部分目的Manager是執行來自其他鏈的呼叫,這意味著它具有執行一些任意程式碼的功能,並且在這種情況下,它也比應有的更開放 - 特別是來自另一個鏈的任何人可以呼叫一個名為 的函式verifyHeaderAndExecuteTx,該函式可以呼叫其他 Poly Network 合約。還記得Manager樓主怎麼樣Data嗎?這意味著,如果黑客能夠弄清楚如何創建有效載荷,Manager合約將解釋為意味著它應該將黑客添加到Data合約的白名單中,它就會這樣做。

我相信你已經猜到了,這就是黑客所做的。不過,事實要復雜一些。verifyHeaderAndExecuteTx只會執行符合函式簽名的程式碼-函式簽名是函式名稱和參數_method, "(bytes,bytes,uint64)"keccak256 散列的前 4 個字節(您可以在名為“函式簽名”)。這可能有助於阻止該函式呼叫任何其他函式,但由於_method是使用者生成的,黑客所要做的就是弄清楚如何在其中放置一些任意值,以使 keccak256 散列的前 4 個字節符合他們想要的目標有效載荷。(換句話說,它們不需要散列衝突,因為函式選擇器只使用前四個字節,而四個字節的衝突並不難。)

一旦他們能夠建構一個與函式簽名相衝突的有效負載,以便將自己添加到白名單中,他們就會將自己添加到他們可以添加的每條鏈上,並耗盡所有資金。

引用自:https://ethereum.stackexchange.com/questions/106943