我們監控到base鏈上的一起攻擊事件,
https://basescan.org/tx/0x619c44af9fedb8f5feea2dcae1da94b6d7e5e0e7f4f4a99352b6c4f5e43 a4661
攻擊者通過此次攻擊共獲利310570 USDC和10 cbETH,共約合35萬美金。
被攻擊項目爲SumerMoney,SumerMoney是一個基於Compond修改的借貸協議,用戶可以通過提供流動性來獲利。SumerMoney共支持的underlying assets有ETH, USDC, USDbc, DAI, wstETH, cbETH, suUSD, suETH。其中,每一個underlying asset對應一個借貸池poll。用戶可以通過和借貸池poll交互來完成對應的操作。
首先,攻擊者通過攻擊合約1從Balancer中利用flashloan借了645000 USDC 和150 ETH 。
隨後,攻擊合約1創建了另一個攻擊合約(攻擊合約2),並將Balancer中借來的645000 USDC 轉入新的攻擊合約2中,並轉入了1 wei 。
接着,在攻擊合約2的攻擊函數中,攻擊者將645000 USDC通過mint 兌換爲643630 sdrUSDC 。
隨後,攻擊者再通過borrow從sdrETH pool中借出 150.358797170664290045 ETH 。並向sdrETH pool中轉入150.358797170664290046 ETH執行repayBorrowBehalf進行還款。
repayBorrowBehalf的具體實現如下:
我們可以看到,合約會將超出總借款的部分再轉回給用戶。由於,sdrETH pool收到了150.358797170664290046 ETH ,但是只借出了150.358797170664290045 ETH ,所以會將0.000000000000000001 ETH再轉給攻擊合約2。由於接到了ETH轉账,攻擊合約2觸發了fallback函數,fallback函數中又調用了攻擊合約1,再次進行borrow 和redeemUnderlying 。
我們注意到,攻擊者redeem 150 ETH只需要74.99998941541294 sdrETH(本應是 150 sdrETH )。
接下來,我們看一下合約是如何計算sdrToken和underlying token的兌換比例。
由上面的公式,我們可以知道兌換的underlying token爲對應的sdr token除以exchangRate 。由下面的公式同樣可以知道exchangeRate的計算方式。
其中totalCash是由以下函數計算
那么,漏洞其實就比較明顯了。mint 、 borrow 、 redeem 、 repay這些操作均應該是原子操作。但是,repayBorrowBehalf出現了一個重入漏洞,攻擊者通過構造一個特殊的金額( borrowsAmount + 1 wei )。sdrETH 將多余的1 wei重新發送給攻擊者合約,從而觸發了攻擊合約2的fallback函數,在fallback函數中(在ETH轉入時,exchangeRate 已經增長了1倍,攻擊者手中的sdrToken的價值增加了一倍),攻擊者進行重入攻擊,調用借貸函數,借出了其他資產。最後,還清SumerMoney和Balancer的借貸,攻擊完成。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。