慢霧安全團隊建議在進行 deposit 存款等敏感操作時對指定 pid 對應的池子代幣與所傳入的代幣做好一致性的判斷,並且在添加流動性等涉及 LP 代幣數量變動的函數需添加重入鎖的限制,避免再次出現此類問題。
作者:九九 @慢雾安全团队
2022 年 03 月 13 日,據慢霧區消息,Paraluni 存在嚴重漏洞遭攻擊,黑客獲利約 170 萬美元,慢霧安全團隊第一時間介入分析,並將結果分享如下:
相關信息
Paraluni 是 BSC 鏈上的一個元宇宙金融(DeFi)項目。用戶可以質押代幣添加流動性獲取收益。
以下是本次攻擊涉及的相關地址:
攻擊者地址:
https://bscscan.com/address/0x94bc1d555e63eea23fe7fdbf937ef3f9ac5fcf8f
攻擊交易:
https://bscscan.com/tx/0x70f367b9420ac2654a5223cc311c7f9c361736a39fd4e7dff9ed1b85bab7ad54
攻擊合約:
https://bscscan.com/address/0x4770b5cb9d51ecb7ad5b14f0d4f2cee8e5563645
UBT(ukraine bad token)代幣合約:
https://bscscan.com/address/0xca2ca459ec6e4f58ad88aeb7285d2e41747b9134
UGT(russia good token)代幣合約:
https://bscscan.com/address/0xbc5db89ce5ab8035a71c6cd1cd0f0721ad28b508
Masterchef 合約:
https://bscscan.com/address/0xa386f30853a7eb7e6a25ec8389337a5c6973421d#code
攻擊核心點
在 MasterCheif 合約中的 depositByAddLiquidity 函數中,未校驗傳入的代幣數組參數_tokens 所構造的 LP 代幣是否和指定的_pid 參數對應和池子裡的 LP 代幣(USDT-BUSD LP)是否一致,且在添加流動性計算時沒有做重入限制,導致攻擊者利用了惡意構造的代幣合約進行了重入攻擊。
具體細節分析
1. 攻擊者構造了改寫了 transferFrom 函數的 ERC20 標準的 UBT 代幣合約與另一個 ERC20 標準的 UGT 代幣合約;
2. 攻擊者首先從 PancakeSwap 中閃電貸借出約 15.7 萬枚 USDT 和 15.7 萬枚 BUSD;
3. 接著調用 ParaRouter 合約中的 addLiquidity 函數添加流動性,為所構造的 UBT 合約上 mint 約 15.5 萬枚 Paraluni LPs 代幣;
4. 調用 MasterChef 合約中的 depositByAddLiquidity 函數,指定傳入的_pid 參數為 18,為該池子添加了 1 個 UBT 代幣和 1 個 UGT 代幣的流動性。該函數內部調用了 depositByAddLiquidityInternal 函數;
在 depositByAddLiquidityInternal 函數中,會利用傳入的_tokens 代幣通過調用 paraRouter 合約的 addLiquidity 函數去構造 LP 代幣。而我們看到該函數沒有校驗_pid 對應的池子代幣(USDT-BUSD LP)和利用傳入的_tokens 所構造的 LP 代幣是否相匹配;
5. depositByAddLiquidityInternal 函數又內部調用了 addLiquidityInternal 函數,而在 addLiquidityInternal 函數中,先獲取合約地址中 LP 代幣餘額記錄為 vars.oldBalance,接著調用了 paraRouter 合約的 addLiquidity 函數,然後再次獲取合約地址中 LP 代幣餘額記錄為 vars.newBalance,最後用 vars.newBalanc - vars.oldBalance 計算需要 deposit 的數量,然後調用_deposit 函數存入 LP 代幣;
而 paraRouter 合約的 addLiquidity 函數會調用攻擊所構造的 UBT 代幣合約中的 transferFrom 函數,該函數為攻擊者惡意構造,會調用 deposit 函數轉入 LP 代幣記賬到 UBT 合約中,而此時計算攻擊合約_deposit 的值時未能更新 vars.oldBalance 的值,造成了 UBT 代幣合約與攻擊合約均記賬了 15.5 萬枚的 LP 代幣份額,形成了一次重入攻擊;
6. 攻擊者分別調用 UBT 合約中的 withdrawAsset 函數和利用攻擊合約調用 Mastechef 合約中的 withdraw 函數提取 LP 到攻擊合約中;
7. 攻擊者移除流動性並總共得到了 31 萬枚 USDT 和 31 萬枚 BUSD,歸還閃電貸後獲利離場。
MistTrack
據慢霧 AML 分析,黑客地址初始資金來源於從 Tornado.Cash 轉入的 0.99785 BNB。
在攻擊獲利後,黑客將部分 BNB 兌換為 ETH,並將 235.448 ETH 從 BSC 跨鏈到以太坊,同時將 230 ETH 分 5 筆轉入 Tornado.Cash。
截止目前,黑客在 BSC 上的地址餘額為 3000.06 BNB,在以太坊上的地址餘額為 5.243 ETH。慢霧 AML 將持續監控被盜資金的轉移,拉黑攻擊者控制的錢包地址。
在攻擊發生後,Paraluni 項目方與黑客在鏈上發生了一系列對話:
Paraluni:
黑客也很快給出了回复:
接著 Paraluni 項目方繼續與黑客協商,如果黑客願意退還部分資金,則作為白帽行為給予賞金:
而目前,黑客暫無回复。
總結
本次攻擊事件是由於在 Mastechef 合約中的 depositByAddLiquidity 函數未對指定_pid 對應的池子代幣和傳入的_tokens 數組裡的代幣所構造的 LP 代幣作一致性校驗,並且在涉及流動性添加時未作重入鎖的限制,導致了 LP 代幣數量記賬時被利用。慢霧安全團隊建議在進行 deposit 存款等敏感操作時對指定 pid 對應的池子代幣與所傳入的代幣做好一致性的判斷,並且在添加流動性等涉及 LP 代幣數量變動的函數需添加重入鎖的限制,避免再次出現此類問題。
免責聲明:作為區塊鏈信息平台,本站所發布文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。本文內容僅用於信息分享,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。