SumerMoney 專案的sdrETH
合約是Compound 的CEther
合約的分叉版本,最近遭到攻擊。這種攻擊方式並不新鮮;攻擊者利用重入漏洞來操縱包裝的sdrToken
和底層代幣之間的匯率。
概述
攻擊者地址:
https://basescan.org/address/0xbb344544ad328b5492397e967fe81737855e7e77
攻擊交易: https://basescan.org/tx/0x619c44af9fedb8f5feea2dcae1da94b6d7e5e0e7f4f4a99352b6c4f5e43a4661
易受攻擊的合約( sdrETH
代幣): https://basescan.org/address/0x7b5969bb51fa3b002579d7ee41a454ac691716dc
漏洞利用分析
攻擊者先進行閃電貸,向 Balancer Vault 借入大量 150 WETH 和 645,000 USDC 。然後,他嘗試將這些資產推入sdrETH
和sdrUSDC
合約中,以鑄造相應的包裝代幣。
以這些資產作為抵押,攻擊者試圖借入sdrETH
市場上所有可用的基礎資產,金額約為 150 ETH。借款後,攻擊者立即呼叫repayBorrowBehalf
函數,償還借入的ETH加「 1 wei 」。由於repayBorrowBehalf
函數使用低階的address.call
方法將多餘的金額退還給付款人,因此最終觸發了重入攻擊流程。利用此漏洞,攻擊者可以在更新totalBorrows
之前在後備函數中操縱匯率。
查看Compound文件中有關匯率的內容,我們可以看到,如果還款後totalBorrows()
沒有正確減少,匯率會比應有的高得多。
然後,攻擊者繼續借入sdrcbETH
和sdrUSDC
市場上的所有剩餘資產。
在sdrETH
市場匯率被操縱的情況下,攻擊者只需要大約74個sdrETH
就可以贖回自己原來的150個ETH,而sdrUSDC
則正常贖回。
償還所有貸款並完成攻擊後,攻擊者獲利約 10 cbETH 和 310,000 USDC。
結論
Web3 開發人員在自訂諸如Compound 之類的通用協定時應謹慎行事,尤其是在引入新功能或修改現有功能時。
儘管重入攻擊是智慧合約中眾所周知的漏洞,並且已在許多先前的專案中被利用,但它仍然是 Web3 領域的常見攻擊媒介。這次攻擊凸顯了安全審計的重要性以及開發人員在未來專案中遵循最佳實務的必要性。