此篇文章由Cobo 區塊鏈安全團隊供稿,團隊成員來自知名安全實驗室,有多年網絡安全與漏洞挖掘經驗,曾協助谷歌、微軟等廠商處理高危漏洞並獲致謝,在微軟MSRC 最有價值安全研究員Top 榜單中取得卓越的成績。團隊目前重點關注智能合約安全、DeFi 安全等方向,研究並分享前沿區塊鏈安全技術。我們也希望對加密數字貨幣領域有研究精神和科學方法論的終身迭代學習者可以加入我們的行列,向行業輸出思考洞察與研究觀點!此篇是CoboLabs的第9篇文章。
Treasure DAO NFT市場被攻擊
3月3日,Treasure DAO 的NFT 市場遭受攻擊,攻擊者從市場中盜取了100 多個NFT。但事件發生幾小時後,攻擊者將盜取的NFT歸還。
NFT 市場的TreasureMarketplaceBuyer.buyItem 函數接口支持ERC721 和ERC1155 兩種NFT 的交易,並可傳入quantity 參數表示購買NFT 的數量(針對ERC1155 來說),計算總費用時,會通過數量*單價的形式進行計算。
由於合約代碼未對用戶傳入的quantity 參數進行校驗,用戶可以將quantity 設置為0,使得後續計算所需花費為0。而ERC721 Token 具有唯一性,所以代碼不會對傳入的quantity 進行處理,在quantity 為0 時TreasureMarketplace.buyItem 後續對於存量和quantity 的檢查也能通過。最終結果攻擊者可以免費從市場中買到任意ERC721 NFT 商品。
另外,如果攻擊者通過查詢對應的tokenid 的擁有者,可以直接調用TreasureMarketplace.buyItem 函數繞過TreasureMarketplaceBuyer 合約直接購買。
整個攻擊流程中,market 只做為中間商,除了沒有收到手續費外並沒有承擔其他經濟上的損失,最終的損失由賣家承擔。
CoboComment:
合約在實現處理不同代幣類型的接口時,需要充分考慮不同代幣標準的區別。歷史上合約因處理ERC20 與原生代幣、ERC777、ERC2612 不同標準不當均產生過安全問題。開發者謹慎考慮邊界情況,並組織代碼審計,畢竟不是每次被盜取的資產都會被返還。
R
e
f
e
r
e
n
c
e
:
https://mp.weixin.qq.com/s/E7dfEDO0R7SZK16xUhMzag
https://mp.weixin.qq.com/s/SEbXWmugJBz0C00vyzYcCw
Bacon Protocol 重入攻擊事件
3月5日,抵押借貸協議Bacon Protocol 遭到重入攻擊,損失約100 萬美元。
Bacon Protocol 的bHome 代幣用於作為用戶存入資產憑證,該Token 實現ERC777 標準接口。當進行轉賬時,會調用ERC777 標準規定的回調函數tokensReceived。攻擊者在自己實現的tokensReceived 函數可再次調用Bacon Protocol 的lend 函數,造成重入攻擊。
由於生成的bHome 代幣計算公式中會記錄用戶的累計存款,並根據累計存款來計算生成的bHome 代幣數量,而這一變量的更新則是在調用完回調函數後進行的。因此利用重入漏洞,可以使合約過量更新攻擊者bHome 的balance,使攻擊者在每次存款時得到比預期更多的bHome 代幣,以此獲利。
CoboComment:
利用ERC777 代幣回調函數進行重入攻擊在歷史上出現過多次同類問題,項目開發者在採用這一代幣標準時就應重點檢查代碼是否可以處理回調中重入的情況。
或者使用OpenZeppelin ReentrancyGuard 進行防護也能防範一些重入攻擊的實施。
另外值得一提的是,本次攻擊被BlockSec Team 檢測到。
他們通過部署同樣合約並用flashbot 搶跑的方式先於攻擊者提前進行白帽攻擊,幫助項目方挽回了一部分的損失。
隨著此類系統發展的更加成熟,可預見的是,未來攻擊者也將開始逐步使用flashbot 執行攻擊交易以進行對抗。
R
e
f
e
r
e
n
c
e
:
https://www.tofreedom.me/bacon-protocolerc777
https://mp.weixin.qq.com/s/o41Da2PJtu7LEcam9eyCeQ
Fantasm Finance 攻擊事件3月9日,Fantom 鏈上DeFi 項目Fantasm Finance 遭到攻擊,損失約270 萬美金。漏洞點發生在抵押池Pool 合約的mint 函數,mint 函數會根據用戶傳入的FSM 代幣和FTM 鑄造對應的xFTM 代幣。用戶調用mint 函數應該按一定的抵押比例轉入FSM 和FTM(缺少的FSM 也可用FTM 補齊)。但實際合約代碼並沒有校驗用戶轉入的FTM 數量,從而讓攻擊者在只轉入FSM 不轉入FTM的情況也能鑄造xFTM 代幣,從而可獲得(1-collateralRatio) 倍數量的額外收益。 CoboComment:從文檔和公開信息中可以看到,Fantasm 在3 月1 日上線,3 月5 日提交代碼給Obelisk 進行審計,3 月9 日被攻擊。互聯網行業的“不管有沒有bug 先上線再說” 的惡習似乎也傳到了區塊鏈世界,在新項目中這種先上線後審計的現象屢見不鮮。在DeFi 上安全漏洞的代價要遠高於傳統互聯網C 端產品。希望項目方本著對用戶負責的態度務必先再完成代碼審計後再進行上線。對於普通用戶來說,遇到類似的情況則要保持謹慎態度,避免造成資產損失。 Reference:https://twitter.com/nipun_pit/status/1501816047711580160https://www.tofreedom.me/fantasm-financehttps://medium.com/@fantasmfinance/fantasm-finance-post-mortem-exploit-09-march -2022-daf48ead016fParaluni 閃電貸重入攻擊事件3月13日,Parallel Universe 在BSC 發布的Paraluni 項目遭到重入攻擊,損失超過170萬美元。 Paraluni 的Masterchef 合約實現depositByAddLiquidity 方法,允許用戶轉入兩種token 的地址,由合約組成LP token 並進行deposit。合約沒有校驗傳入的token 是否與deposit pool 中的LP token 的原始token 是否一致,只是檢查合約自身LP token 數量有沒有增多以判斷用戶是否進行LP token 的抵押。在這種情況下,攻擊者自行偽造了2 個ERC20 token,並調用depositByAddLiquidity。偽造的ERC20 token 中重寫了transferFrom 方法,在transferFrom 函數內調用合約的deposit 函數(這裡形成重入攻擊)。 deposit 函數完成後,合約自身LP token 數量會增多,從而回到depositByAddLiquidity 函數後,會再次計算一次deposit 數量,導致重複計算LP token。攻擊者通過閃電貸借入BUSD 和USDT,利用上述方式deposit 再withdraw,即可以獲得借入資產相同的獲利。 CoboComment:代碼層面看,漏洞產生的原因有二:一,depositByAddLiquidity 沒有對傳入的token 參數與pool 的匹配性進行檢查,通過傳入偽造token 合約可以實現任意合約調用;二,對於deposit 等關鍵方法,沒有使用OpenZeppelin ReentrancyGuard 進行防護,從而利用一進行重入攻擊。從項目運營角度來說,項目方沒有通過知名安全廠商進行安全審計,且沒有披露完整的審計報告。對於普通用戶而言,儘管第三方審計不能完全保證項目代碼安全,對於沒有經過知名廠商安全審計的項目,仍然需要保持謹慎態度。 Reference:https://mp.weixin.qq.com/s/a5fFI5sFNAyuDxGqTFmC2Ahttps://mp.weixin.qq.com/s/BHViq_7vBUJDWIsMgGDU4whttps://bscscan.com/address/0xa386f30853a7eb7e6a25ec8389337a5c6973421d#codeDeus Finance遭閃電貸攻擊3月15日,部署在Fantom 鏈上的Defi 協議Deus Finance 遭閃電貸攻擊,攻擊者獲利約300 萬美元。 Deus Finance 的價格預言機直接利用交易池兩代幣餘額與總流動性比值計算價格,導致攻擊者可以通過閃電貸從交易池中藉取大量的DEI Token 來操縱幣價,隨後攻擊者以低價清算其他用戶的抵押資產,以此獲利。事件發生後,Deus Finance 項目方已經將原預言機修改,並且展開了調查工作。 CoboComment:Deus Finance 使用交易池的實時代幣餘額進行報價,屬於典型的易受閃電貸進行價格操作的預言機模型。攻擊者利用此預言機控制攻擊進行惡意清算,造成普通用戶資產受損。對於投資者,在投資抵押借貸類項目時,建議關注項目文檔和代碼中使用的預言機模型,避免遭受預言機控制導致的惡意清算。目前各類預言機模型中:ChainLink 等去中心化預言機通常認為最為可靠;Uniswap V2/V3 的TWAP 預言機也會受大資金的操縱,但有延遲報價機會,因此不受閃電貸操縱;直接使用交易池實時餘額進行報價則非常容易遭受預言機操縱攻擊。 Reference:https://twitter.com/peckshield/status/1503632734299701250https://cryptopotato.com/3-million-in-dai-and-eth-stolen-from-deus-finance-in-the-latest-defi- hack/Hundred FInance 重入攻擊事件3月16日,xDai 鏈上借貸項目Hundred FInance 遭重入攻擊,項目方損失約2363 ETH。漏洞成因是Hundred FInance 在實現借款函數borrowFresh 時,轉賬操作是在記賬操作之前,且沒有使用ReentrancyGuard 進行重入保護,因此存在重入攻擊的風險。 xDai 鏈上的WETH、USDC 等幣均使用PermittableToken 合約模板。該模板中實現了對ERC677 標準的支持。當轉賬收款地址是合約時,會自動回調onTokenTransfer 函數。結合上述兩個條件,攻擊者得以進行重入攻擊。攻擊者首先通過閃電貸獲得攻擊資金,在攻擊合約的onTokenTransfer 函數中重複調用borrow 函數,由於記賬操作在轉賬操作後,所以攻擊者可以通過一份抵押資產反複使用,貸出遠超過抵押金額的貸款,以此獲利。 CoboComment:3 月出現了多起重入攻擊事件。重入攻擊漏洞的存在通常需要滿足3 個條件:(1)存在可觸發重入的調用,如:合約使用.call 底級調用進行轉賬;存在回調函數,如ERC777 或ERC677 標準;(2)合約的狀態修改代碼在重入代碼之後;(3)沒有使用OpenZeppelin ReentrancyGuard 進行保護。開發者應該高度關注此類問題,尤其是項目要支持ERC777 或ERC677 資產時,涉及資產轉移、記賬功能等關鍵函數都需要考慮是否有重入的可能,防患於未然。 Reference:https://mp.weixin.qq.com/s/tlXn3IDSbeoxXQfNe_dH3Ahttps://www.anquanke.com/post/id/270609https://blockscout.com/xdai/mainnet/address/0xf8D1677c8a0c961938bf2f9aDc3F3CFDA759A9d9/contracts
Li Finance 攻擊事件
3月20日,Li Finance 發生攻擊事件,攻擊者利用合約漏洞從多個用戶錢包中盜取了總價值約60萬美元的多種虛擬資產。事件發生後官方第一時間修補了漏洞並且補償了用戶的損失。
漏洞點發生在交易池的swap 函數,協議設計初衷是為了能夠同時處理多筆swap操作,在合約進行swap 時允許根據用戶自定義傳入的calldata 進行底層調用。攻擊者利用這一功能構造calldata ,使協議可以調用token 的transferFrom 函數,將其他用戶approve 給協議的資產盜走。
CoboComment:
使用用戶可控的參數進行合約調用是相當危險的操作,相當於傳統安全領域中代碼注入漏洞。開發者應盡量使用特定數據結構進行功能封裝,避免將這類底層操作權限直接暴露給用戶。
Reference:
https://cointelegraph.com/news/li-finance-protocol-loses-600-000-in-latest-defi-exploit
https://knownseclab.com/news/623842bed5b228005a55cd57
Compound Finance 修復嚴重漏洞
3月22日,ChainSecurity 發文稱Compound Finance 的CToken 合約對TrueUSD(TUSD) 代幣的支持存在安全漏洞。根據OpenZeppelin 的分析,此漏洞除Compound 外也可能對多達30 個協議造成影響。如被利用,可能造成上百萬美金的損失。
TUSD 實現了DelegateERC20 機制,支持將所有與原始合約0x8dd5fbCe2F6a956C3022bA3663759011Dd51e73E 交互delegate 到當前合約0x0000000000085d4780B73119b644AE5ecd22b376 上來(注意與Proxy 機制相區別,這裡delegate 機制所有storage 修改都在0x0000..b376 上完成)。最終導致TUSD 存在兩個合約入口,即通過兩個合約地址,都可以操縱TUSD 資產。由於許多合約代碼都默認不同合約地址的ERC20 為不同的兩種資產,並要一些權限校驗位置通過合約地址進行校驗。這種不一致導致許多合約在處理TUSD 時可能存在問題。
其中Compound 的CToken 就設計了sweepToken 接口允許將underlying資產以外的Token 轉移給管理員(用以回收其他錯誤轉入的Token),這裡就通過比較合約地址與underlying 是否一致進行校驗。因此攻擊者可以傳入0x8dd5..e73E 地址繞過校驗,將池中的TUSD 資產轉移給管理員。利用這種方法,攻擊者可任意移除借貸池中的TUSD 流動性,從而操縱exchangeRate 套利或者進行惡意清算獲利。
CoboComment:
TUSD 的DelegateERC20 機制和CToken 的sweepToken 接口在單獨工作時均不會產生任何問題。但二者組合時就會因兼容性問題產生安全風險。項目方對接入新資產時將仔細審計Token 協議代碼中是否有與自身設計不兼容的情況。
目前TUSD 官方已經升級,移除了對0x8dd5fbCe2F6a956C3022bA3663759011Dd51e73E DelegateERC20 的支持,發向此合約的所有ERC20 交易都將revert。用戶日常使用時請注意使用TUSD 主合約0x0000000000085d4780B73119b644AE5ecd22b376。
Reference:
https://medium.com/chainsecurity/trueusd-compound-vulnerability-bc5b696d29e2
https://blog.openzeppelin.com/compound-tusd-integration-issue-retrospective/
One Ring Finance 遭閃電貸攻擊
3月22日,Fantom 鏈上Defi 項目One Ring Finance 遭閃電貸攻擊,項目方損失約146萬美金。事件發生後One Ring Finance 項目管理方暫停了漏洞合約,併計劃對此次攻擊受影響的用戶提供補償。
合約漏洞發生在Oshare 合約在計算share price 時,使用了對應的pair 中的實時代幣餘額做為價格參數。由於vault 合約的deposit 和withdraw 函數都會調用getSharePrice 函數來進行價格計算,攻擊者可以通過閃電貸向交易對中通過調用deposit 函數注入大量的資金操縱share price,導致在後續調用withdraw 函數時得到的share price遠高於deposit 時的數值,形成價差以此獲利。
CoboComment:
DeFi 項目在所有價格計算模型中,都應避免使用任何交易池的實時餘額、比例等作為計算參數。因這類參數易遭受大資金的操縱。尤其是當使用實時餘額時,更可能通過閃電貸進行操作,使用攻擊者以較低的攻擊成本發起價格操縱攻擊。
Reference:
https://mp.weixin.qq.com/s/MyR_O8wuZJUT1S6eIMH9TA
https://medium.com/oneringfinance/onering-finance-exploit-post-mortem-after-oshare-hack-602a529db99b
PYESwap 攻擊事件
3月24日,PeckSheild 發表Twitter 稱bsc 鏈上Defi 項目PYESwap 遭到攻擊,損失約260萬美金。
PYESwap 採用了類似Uniswap 的交換機制,利用恆定價格公式來計算交換的比值。與Uniswap 不同,PYESwap 的pair 合約在每次進行swap 時並沒有檢查交換後的K 值守恆問題,而是由router 維護K 值以保證兌換過程資金不會出現損失,並在pair 合約中限制了只有router 合約可以調用swap 函數。
此次攻擊前PYE 項目方部署了新的factory 和router 合約,在factory 合約中註釋掉了部署pair 合約中swap 函數對調用者是否是router 合約的校驗,導致任何用戶都可以調用沒有K 值檢查的swap 函數,使攻擊者可以任意設置兌換的金額,從而盜取交易池中的資產。
事件發生後,有聲音指責稱此次攻擊事件為PYE 官方進行Rug Pull。但PYE 方則否認這一指控,稱此次事件是開發者疏忽。
CoboComment:
3月23日1:30 PM,PYE 項目管理方部署了新的有漏洞的Factory 和Router 合約;3月24日9:05 AM, PYE 項目方發布Twitter 稱此次部署為項目移植升級,號召用戶將資產轉移到新的PYE 交易池中;3月24日2:16 PM,本次攻擊發生。連續操作的時間節點以及異常註釋檢驗代碼的操作,都加重了項目方面內部做惡的嫌疑。
投資者面對項目方突發進行的大規劃流動性遷移和合約升級時務必保持警醒,避免資產損失。
Reference:
https://twitter.com/PeckShieldAlert/status/1507024110534422532
https://twitter.com/PyeEcosystem/status/1506799371874037765
Revest Finance 遭重入攻擊
3月27日,以太坊主鏈上的Defi 項目Revest Finance 遭到重入攻擊,項目損失約200萬美金。
Revest Finance 採用將ERC20 代幣打包生成ERC1155 NFT 代幣的形式來進行資產管理和交易。用戶可以自定義生成NFT 數量以及每個NFT 所包含的ERC20 代幣種類和數量,生成NFT 後用戶也可以對NFT 對應的ERC20 種類和數量進行修改。
本次攻擊的漏洞點在於ERC1155 的回調函數onERC1155Received 發生了重入,由於每次生成NFT代幣的fnftsCreated 這一全局變量是在NFT 代幣生成後進行累加,所以攻擊者可以通過重入攻擊在fnftsCreated沒有更新前修改之前的NFT 代幣所對應的ERC20 代幣種類和數量。
具體來說,以盜取RENA 交易序列為例,攻擊者首先生成了2個編號為1027的NFT 代幣,且沒有向其中質押ERC20 代幣,而後攻擊者再次生成3600個編號為1028 的NFT 代幣,同樣沒有向其中質押ERC20 代幣。
在生成編號為1028 代幣的過程中發生了重入攻擊,攻擊者調用depositAdditionalToFNFT 函數向編號為1027、數量為1 的NFT 代幣增加1 個RENA 代幣的質押資產。此時由於1027 代幣數量為2,而攻擊者只改變了其中一個NFT 的質押信息,所以需要生成新的NFT 代幣以做區別。
因為生成的新的NFT 代幣的行為是在重入攻擊中實施,所以代表新生成NFT 編號的fnftsCreated 沒有更新(在本例中為1028),且在後續更新NFT 信息的函數中沒有檢查對應的NFT 信息是否已經存在,這就導致攻擊者原本質押的1 個代幣的更新信息被更新到了所有之前生成的3600 個編號為1028 的NFT 中,攻擊者以此獲利。
事件發生後, Revest Finance 採取了補救措施,包括更新漏洞合約,使用對每一個函數都進行重入攻擊保護,並且會展開新一輪的安全審計工作。
CoboComment:
涉及到轉賬回調函數的代幣實現都需要考慮重入攻擊發生的可能。同時涉及到狀態變化的操作也應該考慮在轉賬調用之前進行更新。比較保險的做法就是對所有函數都使用OpenZeppelin ReentrancyGuard進行保護。
Reference:
https://coinyuppie.com/erc1155s-reentrancy-attack-appears-again-a-brief-analysis-of-revest-finance-being-attacked/
https://coincodecap.com/revest-protocol-exploit-2-million-stolen
https://slowmist.medium.com/revest-finance-incident-analysis-6fcd9b6be207
Cobo Labs 希望協助加密世界投資者規避風險、提高收益,為傳統金融機構、風險投資公司、通證基金、個人投資者、交易所、媒體等夥伴提供客觀、有深度的數據分析。
關於亞太最大的加密貨幣託管及資管平台Cobo:我們向機構提供領先的安全託管與企業資管業務;我們向全球高淨值合格投資人提供加密數字錢包業務和豐富靈活的定期與結構化產品,我們關注金融創新,並於2020 年第三季度成立了第一家面向全球機構的基金產品「DeFi Pro」。