PANews 7月11日消息,慢霧安全團隊對此前7月10日OMNI Protocol閃電貸攻擊事件進行了分析:1. 攻擊者首先通過supplyERC721函數抵押doodle, 抵押後合約會給攻擊者相應的憑證NToken; 2. 調用borrow函數借出WETH;3. 調用withdrawERC721嘗試提取NFT, 跟進到內部函數executeWithdrawERC721發現,提款會先通過burn函數去燃燒憑證而burn 函數中的safeTransferFrom 函數會去外部調用接收地址的OnERC721Received函數,攻擊者利用這點重入了合約的liquidationERC721函數;4. 在liquidationERC721函數中,攻擊者先支付了WETH並接收doodle nft,接著通過判斷後會調用_burnCollateralNTokens函數去燃燒掉對應的憑證,同樣的利用了burn函數外部調用的性質攻擊者再次進行了重入操作, 先是抵押了清算獲得的nft,接著調用borrow函數去借出了81個WETH,但由於vars變量是在liquidationERC721函數中定義的,因此第二次借款不會影響到liquidationERC721函數中對用戶負債的檢查,這導致了攻擊者可以通過userConfig.setBorrowing函數將用戶的借款標識設置為false即將攻擊者設置成未在市場中有借款行為; 5. 在提款時會首先調用userConfig.isBorrowingAny() 函數去判斷用戶的借款標識,假如借款標識為false,則不會判斷用戶的負債,故此重入後的81 WETH的負債並不會在提款時被判斷,使得攻擊者可以無需還款則提取出所有的NFT獲利

此次攻擊的主要原因在於burn函數會外部調用回調函數來造成重入問題,並且在清算函數中使用的是舊的vars的值進行判斷,導致了即使重入後再藉款,但用戶的狀態標識被設置為未借款導致無需還款。慢霧安全團隊建議在關鍵函數採用重入鎖來防止重入問題。