星球日報訊慢霧安全團隊發布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() 函數去判斷用戶的借款標識; 此次攻擊的主要原因在於burn函數會外部調用回調函數來造成重入問題,並且在清算函數中使用的是舊的vars的值進行判斷,導致了即使重入後再藉款,但用戶的狀態標識被設置為未借款導致無需還款。