Treasure DAO NFT市場被攻擊
3月3日,Treasure DAO 的 NFT 市場遭受攻擊,攻擊者從市場中盜取了100 多個 NFT。但事件發生幾小時後,攻擊者將盜取的NFT歸還。
NFT 市場的 TreasureMarketplaceBuyer.buyItem 函數接口支持 ERC721 和 ERC1155 兩種 NFT 的交易,並可傳入 quantity 參數表示購買 NFT 的數量(針對 ERC1155 來說),計算總費用時,會通過數量*單價的形式進行計算。
由於合約代碼未對用戶傳入的 quantity 參數進行校驗,用戶可以將 quantity 設置為 0,使得後續計算所需花費為 0。而 ERC721 Token 具有唯一性,所以代碼不會對傳入的 quantity 進行處理,在 quantity 為 0 時 TreasureMarketplace.buyItem 後續對於存量和 quantity 的檢查也能通過。最終結果攻擊者可以免費從市場中買到任意 ERC721 NFT 商品。
另外,如果攻擊者通過查詢對應的 tokenid 的擁有者,可以直接調用 TreasureMarketplace.buyItem 函數繞過 TreasureMarketplaceBuyer 合約直接購買。
整個攻擊流程中,market 只做為中間商,除了沒有收到手續費外並沒有承擔其他經濟上的損失,最終的損失由賣家承擔。
Cobo Comment :
合約在實現處理不同代幣類型的接口時,需要充分考慮不同代幣標準的區別。歷史上合約因處理 ERC20 與原生代幣、ERC777、ERC2612 不同標準不當均產生過安全問題。開發者謹慎考慮邊界情況,並組織代碼審計,畢竟不是每次被盜取的資產都會被返還。
Reference:
https://mp.weixin.qq.com/s/E7dfEDO0R7SZK16xUhMzag
https://mp.weixin.qq.com/s/SEbXWmugJBz0C00vyzYcCw
Bacon Protocol 重入攻擊事件
3月5日,抵押借貸協議 Bacon Protocol 遭到重入攻擊,損失約 100 萬美元。
Bacon Protocol 的 bHome 代幣用於作為用戶存入資產憑證,該 Token 實現 ERC777 標準接口。當進行轉賬時,會調用 ERC777 標準規定的回調函數 tokensReceived。攻擊者在自己實現的 tokensReceived 函數可再次調用 Bacon Protocol 的 lend 函數,造成重入攻擊。
由於生成的 bHome 代幣計算公式中會記錄用戶的累計存款,並根據累計存款來計算生成的 bHome 代幣數量,而這一變量的更新則是在調用完回調函數後進行的。因此利用重入漏洞,可以使合約過量更新攻擊者 bHome 的 balance,使攻擊者在每次存款時得到比預期更多的 bHome 代幣,以此獲利。
Cobo Comment :
利用 ERC777 代幣回調函數進行重入攻擊在歷史上出現過多次同類問題,項目開發者在采用這一代幣標準時就應重點檢查代碼是否可以處理回調中重入的情況。或者使用 OpenZeppelin ReentrancyGuard 進行防護也能防範一些重入攻擊的實施。
另外值得一提的是,本次攻擊被 BlockSec Team 檢測到。他們通過部署同樣合約並用 flashbot 搶跑的方式先於攻擊者提前進行白帽攻擊,幫助項目方挽回了一部分的損失。隨著此類系統發展的更加成熟,可預見的是,未來攻擊者也將開始逐步使用 flashbot 執行攻擊交易以進行對抗。
Reference:
https://www.tofreedom.me/bacon-protocolerc777
https://mp.weixin.qq.com/s/o41Da2PJtu7LEcam9eyCeQ
Fantasm Finance 攻擊事件
3月9日,Fantom 鏈上 DeFi 項目 Fantasm Finance 遭到攻擊,損失約 270 萬美金。
漏洞點發生在抵押池 Pool 合約的 mint 函數,mint 函數會根據用戶傳入的 FSM 代幣和 FTM 鑄造對應的 xFTM 代幣。用戶調用 mint 函數應該按一定的抵押比例轉入 FSM 和 FTM(缺少的 FSM 也可用 FTM 補齊)。
但實際合約代碼並沒有校驗用戶轉入的 FTM 數量,從而讓攻擊者在只轉入 FSM 不轉入 FTM的情況也能鑄造 xFTM 代幣,從而可獲得 (1-collateralRatio) 倍數量的額外收益。
Cobo Comment :
從文檔和公開信息中可以看到,Fantasm 在 3 月 1 日上線,3 月 5 日提交代碼給 Obelisk 進行審計,3 月 9 日被攻擊。互聯網行業的「不管有沒有 bug 先上線再說」 的惡習似乎也傳到了區塊鏈世界,在新項目中這種先上線後審計的現象屢見不鮮。在 DeFi 上安全漏洞的代價要遠高於傳統互聯網 C 端產品。希望項目方本著對用戶負責的態度務必先再完成代碼審計後再進行上線。對於普通用戶來說,遇到類似的情況則要保持謹慎態度,避免造成資產損失。
Reference:
https://twitter.com/nipun_pit/status/1501816047711580160
https://www.tofreedom.me/fantasm-finance
https://medium.com/@fantasmfinance/fantasm-finance-post-mortem-exploit-09-march-2022-daf48ead016f
Paraluni 閃電貸重入攻擊事件
3月13日,Parallel Universe 在 BSC 發布的 Paraluni 項目遭到重入攻擊,損失超過170萬美元。
Paraluni 的 Masterchef 合約實現 depositByAddLiquidity 方法,允許用戶轉入兩種 token 的地址,由合約組成 LP token 並進行 deposit。合約沒有校驗傳入的 token 是否與 deposit pool 中的 LP token 的原始 token 是否一致,只是檢查合約自身 LP token 數量有沒有增多以判斷用戶是否進行 LP token 的抵押。在這種情況下,攻擊者自行偽造了 2 個 ERC20 token,並調用 depositByAddLiquidity。偽造的 ERC20 token 中重寫了 transferFrom 方法,在 transferFrom 函數內調用合約的 deposit 函數(這裏形成重入攻擊)。deposit 函數完成後,合約自身 LP token 數量會增多,從而回到 depositByAddLiquidity 函數後,會再次計算一次 deposit 數量,導致重復計算 LP token。
攻擊者通過閃電貸借入 BUSD 和 USDT,利用上述方式 deposit 再 withdraw,即可以獲得借入資產相同的獲利。
Cobo Comment :
代碼層面看,漏洞產生的原因有二:
一,depositByAddLiquidity 沒有對傳入的 token 參數與 pool 的匹配性進行檢查,通過傳入偽造 token 合約可以實現任意合約調用;
二,對於 deposit 等關鍵方法,沒有使用 OpenZeppelin ReentrancyGuard 進行防護,從而利用一進行重入攻擊。從項目運營角度來說,項目方沒有通過知名安全廠商進行安全審計,且沒有披露完整的審計報告。對於普通用戶而言,盡管第三方審計不能完全保證項目代碼安全,對於沒有經過知名廠商安全審計的項目,仍然需要保持謹慎態度。
Reference:
https://mp.weixin.qq.com/s/a5fFI5sFNAyuDxGqTFmC2A
https://mp.weixin.qq.com/s/BHViq_7vBUJDWIsMgGDU4w
https://bscscan.com/address/0xa386f30853a7eb7e6a25ec8389337a5c6973421d#code
Deus Finance遭閃電貸攻擊
3月15日,部署在 Fantom 鏈上的 Defi 協議 Deus Finance 遭閃電貸攻擊,攻擊者獲利約 300 萬美元。
Deus Finance 的價格預言機直接利用交易池兩代幣余額與總流動性比值計算價格,導致攻擊者可以通過閃電貸從交易池中借取大量的 DEI Token 來操縱幣價,隨後攻擊者以低價清算其他用戶的抵押資產,以此獲利。
事件發生後,Deus Finance 項目方已經將原預言機修改,並且展開了調查工作。
Cobo Comment :
Deus Finance 使用交易池的實時代幣余額進行報價,屬於典型的易受閃電貸進行價格操作的預言機模型。攻擊者利用此預言機控製攻擊進行惡意清算,造成普通用戶資產受損。對於投資者,在投資抵押借貸類項目時,建議關註項目文檔和代碼中使用的預言機模型,避免遭受預言機控製導致的惡意清算。目前各類預言機模型中:ChainLink 等去中心化預言機通常認為最為可靠;Uniswap V2/V3 的 TWAP 預言機也會受大資金的操縱,但有延遲報價機會,因此不受閃電貸操縱;直接使用交易池實時余額進行報價則非常容易遭受預言機操縱攻擊。
Reference:
https://twitter.com/peckshield/status/1503632734299701250
https://cryptopotato.com/3-million-in-dai-and-eth-stolen-from-deus-finance-in-the-latest-defi-hack/
Hundred FInance 重入攻擊事件
3月16日,xDai 鏈上借貸項目 Hundred FInance 遭重入攻擊,項目方損失約 2363 ETH。
漏洞成因是 Hundred FInance 在實現借款函數 borrowFresh 時,轉賬操作是在記賬操作之前,且沒有使用 ReentrancyGuard 進行重入保護,因此存在重入攻擊的風險。xDai 鏈上的 WETH、USDC 等幣均使用 PermittableToken 合約模板。該模板中實現了對 ERC677 標準的支持。當轉賬收款地址是合約時,會自動回調 onTokenTransfer 函數。結合上述兩個條件,攻擊者得以進行重入攻擊。
攻擊者首先通過閃電貸獲得攻擊資金,在攻擊合約的 onTokenTransfer 函數中重復調用 borrow 函數,由於記賬操作在轉賬操作後,所以攻擊者可以通過一份抵押資產反復使用,貸出遠超過抵押金額的貸款,以此獲利。
Cobo Comment :
3 月出現了多起重入攻擊事件。重入攻擊漏洞的存在通常需要滿足 3 個條件:
(1)存在可觸發重入的調用,如:合約使用 .call 底級調用進行轉賬;存在回調函數,如ERC777 或 ERC677 標準;
(2)合約的狀態修改代碼在重入代碼之後;
(3)沒有使用 OpenZeppelin ReentrancyGuard 進行保護。
開發者應該高度關註此類問題,尤其是項目要支持 ERC777 或 ERC677 資產時,涉及資產轉移、記賬功能等關鍵函數都需要考慮是否有重入的可能,防患於未然。
Reference:
https://mp.weixin.qq.com/s/tlXn3IDSbeoxXQfNe_dH3A
https://www.anquanke.com/post/id/270609
https://blockscout.com/xdai/mainnet/address/0xf8D1677c8a0c961938bf2f9aDc3F3CFDA759A9d9/contracts
Li Finance 攻擊事件
3月20日,Li Finance 發生攻擊事件,攻擊者利用合約漏洞從多個用戶錢包中盜取了總價值約60萬美元的多種虛擬資產。事件發生後官方第一時間修補了漏洞並且補償了用戶的損失。
漏洞點發生在交易池的 swap 函數,協議設計初衷是為了能夠同時處理多筆swap操作,在合約進行 swap 時允許根據用戶自定義傳入的 calldata 進行底層調用。攻擊者利用這一功能構造 calldata ,使協議可以調用 token 的 transferFrom 函數,將其他用戶 approve 給協議的資產盜走。
Cobo Comment :
使用用戶可控的參數進行合約調用是相當危險的操作,相當於傳統安全領域中代碼註入漏洞。開發者應盡量使用特定數據結構進行功能封裝,避免將這類底層操作權限直接暴露給用戶。
Reference:
https://cointelegraph.com/news/li-finance-protocol-loses-600-000-in-latest-defi-exploit
https://knownseclab.com/news/623842bed5b228005a55cd57
Compound Finance 修復嚴重漏洞
3月22日,ChainSecurity 發文稱 Compound Finance 的 CToken 合約對 TrueUSD(TUSD) 代幣的支持存在安全漏洞。根據 OpenZeppelin 的分析,此漏洞除 Compound 外也可能對多達 30 個協議造成影響。如被利用,可能造成上百萬美金的損失。
TUSD 實現了 DelegateERC20 機製,支持將所有與原始合約 0x8dd5fbCe2F6a956C3022bA3663759011Dd51e73E 交互 delegate 到當前合約 0x0000000000085d4780B73119b644AE5ecd22b376 上來(註意與 Proxy 機製相區別,這裏 delegate 機製所有 storage 修改都在 0x0000..b376 上完成)。最終導致 TUSD 存在兩個合約入口,即通過兩個合約地址,都可以操縱 TUSD 資產。由於許多合約代碼都默認不同合約地址的 ERC20 為不同的兩種資產,並要一些權限校驗位置通過合約地址進行校驗。這種不一致導致許多合約在處理 TUSD 時可能存在問題。
其中 Compound 的 CToken 就設計了sweepToken 接口允許將 underlying資產以外的 Token 轉移給管理員(用以回收其他錯誤轉入的 Token),這裏就通過比較合約地址與 underlying 是否一致進行校驗。因此攻擊者可以傳入 0x8dd5..e73E 地址繞過校驗,將池中的 TUSD 資產轉移給管理員。利用這種方法,攻擊者可任意移除借貸池中的 TUSD 流動性,從而操縱 exchangeRate 套利或者進行惡意清算獲利。
Cobo Comment :
TUSD 的 DelegateERC20 機製和 CToken 的 sweepToken 接口在單獨工作時均不會產生任何問題。但二者組合時就會因兼容性問題產生安全風險。項目方對接入新資產時將仔細審計 Token 協議代碼中是否有與自身設計不兼容的情況。
目前 TUSD 官方已經升級,移除了對 0x8dd5fbCe2F6a956C3022bA3663759011Dd51e73E DelegateERC20 的支持,發向此合約的所有 ERC20 交易都將 revert。用戶日常使用時請註意使用 TUSD 主合約 0x0000000000085d4780B73119b644AE5ecd22b376。
Reference:
https://medium.com/chainsecurity/trueusd-compound-vulnerability-bc5b696d29e2
https://blog.openzeppelin.com/compound-tusd-integration-issue-retrospective/
One Ring Finance 遭閃電貸攻擊
3月22日,Fantom 鏈上 Defi 項目 One Ring Finance 遭閃電貸攻擊,項目方損失約146萬美金。事件發生後 One Ring Finance 項目管理方暫停了漏洞合約,並計劃對此次攻擊受影響的用戶提供補償。
合約漏洞發生在 Oshare 合約在計算 share price 時,使用了對應的 pair 中的實時代幣余額做為價格參數。由於 vault 合約的 deposit 和 withdraw 函數都會調用 getSharePrice 函數來進行價格計算,攻擊者可以通過閃電貸向交易對中通過調用 deposit 函數註入大量的資金操縱 share price,導致在後續調用 withdraw 函數時得到的 share price 遠高於 deposit 時的數值,形成價差以此獲利。
Cobo Comment :
DeFi 項目在所有價格計算模型中,都應避免使用任何交易池的實時余額、比例等作為計算參數。因這類參數易遭受大資金的操縱。尤其是當使用實時余額時,更可能通過閃電貸進行操作,使用攻擊者以較低的攻擊成本發起價格操縱攻擊。
Reference:
https://mp.weixin.qq.com/s/MyR_O8wuZJUT1S6eIMH9TA
https://medium.com/oneringfinance/onering-finance-exploit-post-mortem-after-oshare-hack-602a529db99b
PYESwap 攻擊事件
3月24日,PeckSheild 發表 Twitter 稱 bsc 鏈上 Defi 項目 PYESwap 遭到攻擊,損失約260萬美金。
PYESwap 采用了類似 Uniswap 的交換機製,利用恒定價格公式來計算交換的比值。與 Uniswap 不同,PYESwap 的 pair 合約在每次進行 swap 時並沒有檢查交換後的 K 值守恒問題,而是由 router 維護 K 值以保證兌換過程資金不會出現損失,並在 pair 合約中限製了只有 router 合約可以調用 swap 函數。
此次攻擊前 PYE 項目方部署了新的 factory 和 router 合約,在 factory 合約中註釋掉了部署 pair 合約中 swap 函數對調用者是否是 router 合約的校驗,導致任何用戶都可以調用沒有 K 值檢查的 swap 函數,使攻擊者可以任意設置兌換的金額,從而盜取交易池中的資產。
事件發生後,有聲音指責稱此次攻擊事件為 PYE 官方進行 Rug Pull。但 PYE 方則否認這一指控,稱此次事件是開發者疏忽。
Cobo Comment :
3月23日1:30 PM,PYE 項目管理方部署了新的有漏洞的 Factory 和 Router 合約;3月24日 9:05 AM, PYE 項目方發布 Twitter 稱此次部署為項目移植升級,號召用戶將資產轉移到新的 PYE 交易池中;3月24日 2:16 PM,本次攻擊發生。連續操作的時間節點以及異常註釋檢驗代碼的操作,都加重了項目方面內部做惡的嫌疑。
投資者面對項目方突發進行的大規劃流動性遷移和合約升級時務必保持警醒,避免資產損失。
Reference:
https://twitter.com/PeckShieldAlert/status/1507024110534422532
https://twitter.com/PyeEcosystem/status/1506799371874037765
Revest Finance 遭重入攻擊
3月27日,以太坊主鏈上的 Defi 項目 Revest Finance 遭到重入攻擊,項目損失約200萬美金。
Revest Finance 采用將 ERC20 代幣打包生成 ERC1155 NFT 代幣的形式來進行資產管理和交易。用戶可以自定義生成 NFT 數量以及每個 NFT 所包含的 ERC20 代幣種類和數量,生成 NFT 後用戶也可以對 NFT 對應的 ERC20 種類和數量進行修改。
本次攻擊的漏洞點在於 ERC1155 的回調函數 onERC1155Received 發生了重入,由於每次生成NFT代幣的 fnftsCreated 這一全局變量是在 NFT 代幣生成後進行累加,所以攻擊者可以通過重入攻擊在 fnftsCreated 沒有更新前修改之前的 NFT 代幣所對應的 ERC20 代幣種類和數量。
具體來說,以盜取 RENA 交易序列為例,攻擊者首先生成了2個編號為1027的 NFT 代幣,且沒有向其中質押 ERC20 代幣,而後攻擊者再次生成3600個編號為 1028 的 NFT 代幣,同樣沒有向其中質押 ERC20 代幣。
在生成編號為 1028 代幣的過程中發生了重入攻擊,攻擊者調用 depositAdditionalToFNFT 函數向編號為1027、數量為1 的 NFT 代幣增加 1 個 RENA 代幣的質押資產。此時由於 1027 代幣數量為2,而攻擊者只改變了其中一個 NFT 的質押信息,所以需要生成新的 NFT 代幣以做區別。
因為生成的新的 NFT 代幣的行為是在重入攻擊中實施,所以代表新生成 NFT 編號的 fnftsCreated 沒有更新(在本例中為1028),且在後續更新 NFT 信息的函數中沒有檢查對應的 NFT 信息是否已經存在,這就導致攻擊者原本質押的 1 個代幣的更新信息被更新到了所有之前生成的 3600 個編號為 1028 的 NFT 中,攻擊者以此獲利。
事件發生後, Revest Finance 采取了補救措施,包括更新漏洞合約,使用對每一個函數都進行重入攻擊保護,並且會展開新一輪的安全審計工作。
Cobo Comment :
涉及到轉賬回調函數的代幣實現都需要考慮重入攻擊發生的可能。同時涉及到狀態變化的操作也應該考慮在轉賬調用之前進行更新。比較保險的做法就是對所有函數都使用OpenZeppelin ReentrancyGuard進行保護。
Reference:
https://coinyuppie.com/erc1155s-reentrancy-attack-appears-again-a-brief-analysis-of-revest-finance-being-attacked/
https://coincodecap.com/revest-protocol-exploit-2-million-stolen
https://slowmist.medium.com/revest-finance-incident-analysis-6fcd9b6be207
社區組委員
Singapore
2021年04月07日