Eleven Finance是在幣安智能鏈生態(tài)系統(tǒng)中為高APY金庫賦能的平臺,專注于快速發(fā)展為社區(qū)平臺提供動態(tài)和廣泛的保險庫,為用戶提供優(yōu)化的收益策略。
零時科技監(jiān)控到消息,北京時間2021年6月23日,Nerve官方推文稱Nerve相關的保險庫Eleven Finance遭到閃電貸攻擊,并表示$NRV資金安全,零時科技安全團隊及時對該安全事件進行復盤分析。
攻擊信息
通過初步追蹤分析,攻擊者創(chuàng)建了四個攻擊合約,進行了五筆攻擊交易,共盜取資金價值超460萬美元,攻擊信息如下:
攻擊者錢包地址
https://bscscan.com/address/0xc71e2f581b77de945c8a7a191b0b238c81f11ed6
攻擊者合約地址
https://bscscan.com/address/0x8b2979d88be70ba1b0c48691bdcae7909d084401
https://bscscan.com/address/0x01eae4e246dfae08a4ef5c3d8f31d0668686eab3
https://bscscan.com/address/0xc0efd9f475950d71e8c3399d1d1cfc73531fcb8f
https://bscscan.com/address/0x87e950c3b749ee1585c066b78930f7c0cfc465ce
攻擊者盜取資金交易
https://bscscan.com/tx/0x6450d8f4db09972853e948bee44f2cb54b9df786dace774106cd28820e906789
https://bscscan.com/tx/0xeaaa8f4d33b1035a790f0d7c4eb6e38db7d6d3b580e0bbc9ba39a9d6b80dd250
https://bscscan.com/tx/0x9c147db3604e130738142171624eef51f1ff3394433aea64a58401531c5ca8c3
https://bscscan.com/tx/0x153eeae811a9acedad4dc76492316d5503a02ad8a324563a50b7118b4f574469
https://bscscan.com/tx/0xcfcee591a1a7010a8bd084b6f03698dde8eb3ac13c8f561ea20c7fc5d1f936dc
ElevenNeverSellVault合約地址
https://bscscan.com/address/0x025E2e9113dC1f6549C83E761d70E647c8CDE187#code
由于攻擊者的五筆攻擊交易均類似,這里分析攻擊者第四個合約中的第一筆交易,該筆交易也是損失資金最多的交易,下面分步解析該筆交易,方便讀者更清晰的了解攻擊過程。
第一步:攻擊者通過PancakePair閃電貸借出242萬枚USDT。
第二步:攻擊者將閃電貸借出的242萬枚USDT全部在穩(wěn)定幣Nerve 3Pool兌換為241萬枚3NRV-LP。
第三步:攻擊者將241萬枚3NRV-LP添加至ElevenNeverSellVault合約后獲得241萬枚11Pool3 Nerve。
第四步:攻擊者取出在 ElevenNeverSellVault合約添加的萬枚3NRV-LP(這里需要注意的是,這步是攻擊者完成攻擊最重要的一步操作,攻擊者上一步獲得的241萬枚11Pool3 Nerve并沒有進行銷毀)
第五步:攻擊者歸還第三步獲得的241萬枚11Pool3 Nerve,得到241萬枚3NRV-LP。(這里是正常邏輯,歸還11Pool3 Nerve,得到3NRV-LP,但由于第四步憑空取出241萬枚3NRV-LP,加上這里數值,共計歸還241萬枚11Pool3 Nerve,得到482萬枚3NRV-LP,也就是雙倍3NRV-LP)
第六步:攻擊者將得到的482萬枚3NRV-LP兌換為483萬枚USDT。
第七步:攻擊者歸還閃電貸借出的242萬枚USDT,并將剩余的241萬枚USDT轉至攻擊者錢包。
至此
攻擊者通過該筆交易獲取241萬枚USDT,加上攻擊者其余的四筆攻擊交易獲取的資金,攻擊者共計獲取了310萬枚USDT,30枚BTC,284枚ETH,總價值超過460萬美元。
走到這里大家可能會有疑問,看似簡單的步驟,為何可以獲取大量代幣,交易的第四步中為什么取走241萬枚3NRV-LP后,沒有對取款者質押的241萬枚11Pool3 Nerve進行銷毀,下面我們從合約中分析憑空取走241萬枚3NRV-LP的代碼邏輯。
通過以上交易分析可以明確,攻擊者將241萬枚3NRV-LP添加至ElevenNeverSellVault合約后獲得241萬枚11Pool3 Nerve,但從ElevenNeverSellVault合約取款時,取了兩次241萬枚3NRV-LP,這里我們直接分析ElevenNeverSellVault合約取款代碼邏輯,如下圖:
上圖為ElevenNeverSellVault合約中兩個取款方法withdraw()和emergencyBurn()。攻擊者使用的是緊急提款emergencyBurn方法,1132行代碼中,合約邏輯是將調用者地址余額賦值給balan變量,之后1135行中給調用者進行了balan金額的轉賬,轉賬的金額也就是調用者在該合約中的所有余額。
問題點在于:調用者在合約中的余額賦值給balan變量,并給調用者進行了轉賬,但并未對調用者余額balanceOf(msg.sender)數量進行銷毀,所以攻擊者第一次取走241萬枚3NRV-LP代幣后,emergencyBurn方法并未銷毀攻擊者原本的余額,導致攻擊者余額并沒有減少,之后攻擊者又利用本身余額進行了第二次241萬枚3NRV-LP取款。
該問題如何避免!上圖withdraw方法中已給出答案,1123行代碼中,在調用者進行取款時,對調用者取款數量shares隨即進行銷毀,同樣的邏輯也可以應用在emergencyBurn方法,將調用者地址余額賦值給balan變量后,可使用上圖burn方法對調用者余額進行銷毀,從而避免此類安全問題。
通過此次攻擊事件來看,攻擊者通過多次閃電貸,并通過emergencyBurn方法中用戶余額未更新問題,最終獲得了大量代幣,目前類似的閃電貸攻擊事件居多,為何還會頻頻發(fā)生,對于DeFi項目而言,合約代碼的安全,代幣價格的相對穩(wěn)定,舊版本的及時更新都是保證項目安全極其重要的部分,對于合約變量未更新問題,應在合約上線前進行嚴格審查及測試。對于此類閃電貸攻擊事件,零時科技安全團隊給出以下建議:
·對于合約代碼安全,可找多家安全審計公司進行審計。
·對LP價格及獲取獎勵的鑄幣代碼塊,應根據業(yè)務邏輯進行嚴格審核演算,避免出現(xiàn)參數可控制導致大量鑄幣問題。
·使用可信的并且安全可靠的預言機,如Chainlink去中心化預言機,Alpha homera采用的。
·對敏感性較強的代碼,要做到及時更新完善。
來源:安全客