在2025年1月23日,ODOS協議的OdosLimitOrderRouter合約中存在漏洞被利用,導致在E太和Base上損失約50,000美元。該攻擊是由於未經驗證的使用者輸入導致的任意呼叫漏洞,加上使用預編譯合約繞過簽名檢查而造成的。
概述
攻擊者合約: https://basescan.org/address/0x22a7da241a39f189a8aec269a6f11a238b6086fc
易受攻擊的合約: https://basescan.org/address/0xb6333e994fd02a9255e794c177efbdeb1fe779c7
交易攻擊: https://basescan.org/tx/0xd10faa5b33ddb501b1dc6430896c966048271f2510ff9ed681dd6d510c5df9f6
漏洞分析
攻擊者主要利用了任意呼叫漏洞,用於部署ERC6492合約。他們可以利用任意呼叫來竊取該合約中的代幣,使用ERC20.transfer,但必須繞過簽名檢查IERC1271Wallet(_signer).isValidSignature,這最初似乎是不可能的,因為_signer程式碼長度必須為零-意味著它不能被執行。但是,某些特殊合約確實具有零程式碼長度但仍可以執行命令:預編譯合約。
攻擊者使用了0x4身份預編譯合約,該合約旨在在記憶體部分之間複製資料。在使用任意呼叫竊取代幣後,攻擊者透過使用0x4合約作為_signer繞過了簽名檢查。該合約呼叫IERC1271Wallet(0x4).isValidSignature而不會回滾,成功完成了攻擊。
結論
在構建自己的專案時,不要相信任何使用者輸入。任何給定的引數都必須由程式碼仔細驗證。對不受信任的合約的呼叫可能會引入幾種意外的風險或錯誤。外部呼叫可能會觸發惡意程式碼,無論是在目標合約內部還是在其生態系統中。每個外部呼叫都應被視為潛在的安全風險,必須謹慎處理。
在使用合約程式碼長度時要非常謹慎,因為這可能會引入與合約建構函式和預編譯合約相關的真正問題。使用ERC-6492的協議應該仔細檢查以減輕類似的風險。
此外,強烈建議進行安全審計,不僅針對首次釋出版本,也針對未來新增的任何新功能。由於升級過程可能會引入各種問題,因此也應該進行徹底的審計。





