重入攻擊是什么?一文解讀智能合約中的重入攻擊
重入攻擊是什么?一文解讀智能合約中的重入攻擊!利用智能合約的可重入性,攻擊者反復(fù)進(jìn)入合約并執(zhí)行惡意代碼。重入攻擊利用了合約執(zhí)行期間的狀態(tài)不一致,從而導(dǎo)致合約在執(zhí)行完攻擊者的代碼后仍然具有余額,攻擊者可以重復(fù)執(zhí)行攻擊并一直提取資金,最終導(dǎo)致合約的損失。
今天腳本之家小編給大家分享的是智能合約中的重入攻擊的詳細(xì)解讀,需要了解的朋友不要錯(cuò)過哦!
一、智能合約中的潛在漏洞
盡管智能合約具有開創(chuàng)性,但它也并非不受惡意方可能利用的缺陷的影響。
輸入驗(yàn)證不足是一個(gè)普遍的弱點(diǎn),使攻擊者能夠通過提供意外的輸入來(lái)影響合約的執(zhí)行。 此外,業(yè)務(wù)邏輯的不當(dāng)應(yīng)用可能會(huì)在合同中產(chǎn)生意外行為或邏輯差距,從而導(dǎo)致漏洞。 此外,如果處理不當(dāng),不安全的外部調(diào)用(例如涉及與外部數(shù)據(jù)源或其他合約的接口的調(diào)用)可能會(huì)造成漏洞。
重入攻擊是一個(gè)合約在完成其自身狀態(tài)更改之前從外部調(diào)用另一個(gè)合約時(shí)發(fā)生的弱點(diǎn)。 這允許被調(diào)用合約重新進(jìn)入調(diào)用合約,并可能再次執(zhí)行其某些操作。 這可能會(huì)導(dǎo)致意外的行為,并允許攻擊者改變合約的狀態(tài),從而耗盡資金或產(chǎn)生其他負(fù)面影響。
考慮到此類攻擊的可能性,開發(fā)人員在使用外部合約或數(shù)據(jù)源時(shí)也應(yīng)謹(jǐn)慎行事,確保正確處理外部調(diào)用,以避免意外行為和漏洞。 他們可以通過密切關(guān)注智能合約測(cè)試等安全程序來(lái)幫助保護(hù)智能合約免受不斷變化的威脅。
二、什么是智能合約中的重入攻擊?
在智能合約中,當(dāng)合約在完成自己的狀態(tài)更改之前從外部調(diào)用另一個(gè)合約或函數(shù)時(shí),就會(huì)發(fā)生重入攻擊。
這允許被調(diào)用合約重新進(jìn)入調(diào)用合約,并可能再次執(zhí)行其部分操作,這可能會(huì)導(dǎo)致不可預(yù)見且頻繁的惡意行為。 例如,合約 A 調(diào)用合約 B 發(fā)送資金,然后修改自己的狀態(tài)。
合約 B 的代碼可能包含一個(gè)回調(diào)函數(shù),允許其重新進(jìn)入合約 A,并可能在合約 A 完成其狀態(tài)更改之前重新執(zhí)行傳輸函數(shù)。 這將使攻擊者能夠在完成初始交易之前多次從合約中獲取資金。
2016 年臭名昭著的以太坊區(qū)塊鏈上的去中心化自治組織 (DAO) 黑客攻擊是另一個(gè)眾所周知的例子。 攻擊者利用智能合約代碼中的重入缺陷,遞歸地從 DAO 中刪除資金,最終導(dǎo)致價(jià)值數(shù)百萬(wàn)美元的以太坊 (ETH) 被盜。
此外,包括 Uniswap、Lendf.Me、BurgerSwap、SURGEBNB、Cream Finance 和 Siren Protocol 在內(nèi)的多個(gè)去中心化金融 (DeFi) 協(xié)議由于可重入漏洞而蒙受了重大財(cái)務(wù)損失。 這些違規(guī)行為造成了 350 萬(wàn)美元至 2500 萬(wàn)美元的損失,凸顯了 DeFi 領(lǐng)域可重入漏洞帶來(lái)的持續(xù)威脅。
三、重入攻擊如何工作
重入攻擊利用智能合約函數(shù)的順序執(zhí)行和外部調(diào)用形成一個(gè)循環(huán),攻擊者可以在完成之前多次執(zhí)行特定函數(shù),這可能會(huì)導(dǎo)致惡意行為和未經(jīng)批準(zhǔn)的資金提取。
在受害者完成狀態(tài)修改之前,攻擊者的合約有效地“欺騙”受害者的合約回調(diào)攻擊者的合約。 此操作可能會(huì)導(dǎo)致反復(fù)提款或其他疏忽行為。
上圖演示了對(duì)智能合約的重入攻擊。 攻擊者的合約調(diào)用受害者的“withdraw()”函數(shù),該函數(shù)在更新余額之前發(fā)送以太坊。 然后,攻擊者的后備函數(shù)被觸發(fā),再次遞歸調(diào)用withdraw()以從受害者合約中耗盡資金。 這種攻擊利用了受害者在發(fā)送資金之前未能更新余額的情況。
讓我們使用一個(gè)簡(jiǎn)化的示例來(lái)分解重入攻擊的工作原理:
具有“提現(xiàn)”功能的智能合約
假設(shè)有一個(gè)允許用戶提取資金的數(shù)字錢包智能合約。 除了跟蹤用戶余額之外,該合約還具有提款功能,方便資金提取。 提款功能通常允許用戶將他們的代幣或以太坊從智能合約提取到他們的個(gè)人錢包。
用戶交互和功能執(zhí)行
用戶自行請(qǐng)求從錢包中提款。 他們使用提款功能輸入所需的提款金額。
提款函數(shù)會(huì)在調(diào)用時(shí)驗(yàn)證用戶是否有足夠的資金進(jìn)行提款。 如果滿足要求,它將所需的資金轉(zhuǎn)移到用戶選擇的地址。
外部調(diào)用
這就是弱點(diǎn)顯現(xiàn)出來(lái)的地方。 在提款反映在用戶的余額中之前,合約會(huì)對(duì)另一個(gè)合約或賬戶進(jìn)行外部調(diào)用。
遞歸調(diào)用
如果外部合約的代碼包含可以再次調(diào)用原始合約的函數(shù)(例如另一個(gè)提款函數(shù)),則會(huì)創(chuàng)建一個(gè)遞歸循環(huán)。 這使得可以在完成之前再次調(diào)用withdraw方法。
可重入利用
然后,攻擊者使用惡意合約來(lái)利用此循環(huán)。 攻擊者合約在錢包合約調(diào)用外部合約期間,在余額更新之前,快速再次調(diào)用錢包的提現(xiàn)函數(shù)。
回退功能
在某些情況下,智能合約的回退功能(一種獨(dú)特的功能,當(dāng)合約收到?jīng)]有任何數(shù)據(jù)或以太坊的調(diào)用時(shí)啟動(dòng))可能會(huì)被攻擊者使用。 重入攻擊可以通過在資金仍在處理過程中重復(fù)調(diào)用回退函數(shù)來(lái)進(jìn)行。
操縱和反復(fù)提款
攻擊者的合約可以在同一筆交易中重復(fù)使用提款功能,因?yàn)殄X包合約會(huì)延遲更新余額,直到收到外部調(diào)用后。 因此,這使得資金更容易在未經(jīng)授權(quán)的情況下被取出,從而使攻擊者能夠竊取超出其合法權(quán)利的資金。 隨后,它給錢包合約的用戶造成了巨大的經(jīng)濟(jì)損失。
四、重入攻擊的后果
重入攻擊會(huì)對(duì)智能合約用戶產(chǎn)生嚴(yán)重影響,因?yàn)樗鼈冇锌赡茉斐芍卮筘?cái)務(wù)損失。
重入攻擊最直接的后果之一是未經(jīng)授權(quán)提取或操縱易受影響的智能合約中保存的現(xiàn)金。 攻擊者利用該漏洞反復(fù)從合約中提取資金,耗盡合約余額,并可能給在受影響合約中投資或存儲(chǔ)資產(chǎn)的用戶造成重大財(cái)務(wù)損失。
此外,重入攻擊可能會(huì)削弱用戶對(duì)智能合約和區(qū)塊鏈技術(shù)安全性和完整性的信心。 重入漏洞可能會(huì)產(chǎn)生災(zāi)難性的影響,2016 年以太坊區(qū)塊鏈上的 DAO 黑客事件等備受矚目的事件就證明了這一點(diǎn),該事件造成了巨大的經(jīng)濟(jì)損失并損害了社區(qū)的聲譽(yù)。
除了短期財(cái)務(wù)后果之外,重入攻擊還可能產(chǎn)生長(zhǎng)期影響,例如監(jiān)管和法律關(guān)注、投資者信任度下降以及對(duì)區(qū)塊鏈平臺(tái)和項(xiàng)目聲譽(yù)的損害。 容易受到攻擊的認(rèn)知可能會(huì)導(dǎo)致用戶在與智能合約交互或投資去中心化應(yīng)用程序(DApp)時(shí)保持謹(jǐn)慎,從而阻礙區(qū)塊鏈技術(shù)的采用和擴(kuò)展。
五、如何減輕重入攻擊
在智能合約創(chuàng)建和審計(jì)方面實(shí)施最佳實(shí)踐對(duì)于減輕重入威脅是必要的。
這包括使用具有安全記錄的知名代碼庫(kù),這是實(shí)現(xiàn)這一目標(biāo)的一種方法。 這些庫(kù)經(jīng)過了廣泛的測(cè)試和同行評(píng)審,這降低了引入漏洞的機(jī)會(huì)。
開發(fā)人員還應(yīng)該使用“檢查-效果-交互”設(shè)計(jì)等安全檢查,通過確保狀態(tài)修改以原子方式發(fā)生,最大限度地減少重入攻擊的機(jī)會(huì)。 如果可用的話,可以使用可重入安全的智能合約開發(fā)框架來(lái)添加針對(duì)此類漏洞的額外防線。
開發(fā)人員不太可能手動(dòng)添加安全保護(hù),因?yàn)檫@些框架通常包含專門設(shè)計(jì)用于避免重入攻擊的內(nèi)置方法和保護(hù)措施。 然而,由于區(qū)塊鏈安全仍在發(fā)展,開發(fā)人員必須繼續(xù)尋找新的威脅和弱點(diǎn)。
六、重入攻擊事件分析
重入攻擊是智能合約最常見的攻擊之一,這在之前許多攻擊事件中都可以看到。
2021年8月17日,BSC上DeFi項(xiàng)目XSURGE遭遇閃電貸攻擊。
當(dāng)?shù)貢r(shí)間8月16日,XSURGE官方在遭攻擊前曾發(fā)布了關(guān)于SurgeBNB漏洞的聲明,由于SurgeBNB合約不可更改且已被放棄,因此無(wú)法修補(bǔ)該漏洞。XSURGE稱沒有透露任何關(guān)于此漏洞性質(zhì)的具體細(xì)節(jié),但強(qiáng)烈建議用戶盡快遷移出SurgereBnb,該漏洞隨時(shí)可能被攻擊者觸發(fā)。在聲明發(fā)布后,XSURGE隨后便遭遇攻擊,攻擊者在SurgeBNB中竊取了500萬(wàn)美元。
攻擊過程如下:
(1)首先攻擊合約通過閃電貸從PancakeSwap中借了10000 BNB
(2)攻擊合約使用10000 BNB買入SURGE,將買入的BURGE賣出,調(diào)用BurgeToken合約中的sell函數(shù)。在BNB轉(zhuǎn)賬的時(shí)候,攻擊合約再次將收到的BNB轉(zhuǎn)賬到了BurgeToken合約中,再次觸發(fā)了購(gòu)買BURGE的業(yè)務(wù)。根據(jù)sell函數(shù)的代碼以及BurgeToken合約的receive函數(shù),的確可能在sell過程中發(fā)生轉(zhuǎn)賬,然后在sell函數(shù)尚未修改狀態(tài)變量之前再次購(gòu)買BURGE。
(3)在sell函數(shù)中重入了purchase函數(shù),在重入的purchase函數(shù)中,_totalSupply沒有減掉sell函數(shù)中賣出的BNB數(shù)量,造成可以買入更多的SURGE。
(4)攻擊者合約中獲取了高達(dá)3,896,288,852,239,440,000 BURGE,兌換成BNB有22191 BNB,償還了閃電貸以及手續(xù)費(fèi)10030 BNB,剩余的12161 BNB為攻擊者此次攻擊獲取的利潤(rùn),最后將獲得的BNB轉(zhuǎn)入到攻擊者的賬戶。
2022 年 3 月 16 日,Gnosis 鏈上的借貸類協(xié)議 Hundred Finance 與 Agave 均遭遇了閃電貸襲擊,包括 AAVE 的分支 Agave 和 Compound 的分支 Hundred Finance 。損失超1100萬(wàn)美元。
攻擊過程如下:
(1)從SushiSwap上通過閃電兌借出USDC和wXDAI
(2)抵押 1,200,000 個(gè) USDC,并借貸 59,999,789.075 個(gè) hUSDC
(3)繼續(xù)超額借貸出其他代幣,并且重復(fù)相同攻擊多次
(4)歸還閃電貸,完成攻擊
可以看出,本次攻擊的根本原因是因?yàn)楹霞s存在超額借貸漏洞,通過分析具體的合約我們發(fā)現(xiàn)合約中存在重入問題,導(dǎo)致攻擊者可以完成攻擊并進(jìn)行超額借貸。
2022 年 3 月 27 日,Revest Finance遭到黑客攻擊。
黑客利用了 Revest 合約的邏輯漏洞盜取了近 770 萬(wàn)枚 ECO、579 枚 LYXe、近 7.15 億枚 BLOCKS 以及超 35 萬(wàn)枚 RENA,價(jià)值約200萬(wàn)美元。黑客攻擊使用從 Tornado Cash 取出的資金發(fā)動(dòng)了攻擊,通過SushiSwap以及Uniswap將盜取的Token兌換成了ETH,最后通過Tornado Cash平臺(tái)將ETH轉(zhuǎn)移到了其他賬戶。
攻擊過程如下:
(1)首先,攻擊者通過UniswapV2的閃電兌換功能調(diào)用Revest合約中的mintAddressLock函數(shù)
(3)在mintAddressLock函數(shù)完成前調(diào)用_mint函數(shù)時(shí),攻擊者重入了depositAdditionalToFNFT函數(shù)【ERC1155 onERC1155Received 重入】。
(4)由于NFT nextId(即FNFTHandler.fnftsCreated)在mint函數(shù)鑄造NFT完成并進(jìn)行更新。因此,在重入調(diào)用depositAdditionalToFNFT函數(shù)時(shí),NFT Id仍然是1027,nextId任仍然是1028。另外,合約并未驗(yàn)證1028的Token數(shù)量是否為0,攻擊者再次成功地鑄造了1個(gè)ID為1028的NFT。
2022年7月10日,去中心化金融協(xié)議NFT市場(chǎng)Omni因智能合約漏洞遭到黑客閃電貸攻擊,耗盡了1300ETH,約143萬(wàn)美元。
這次攻擊交易hash:0x264e16f4862d182a6a0b74977df28a85747b6f237b5e229c9a5bbacdf499ccb4
攻擊過程如下:
(1)首先,攻擊者通過Balancer借貸平臺(tái)閃電貸1000 ETH
(2)通過函數(shù)flashLoan閃電貸20個(gè)DOODLE
(3)通過SushiSwap平臺(tái)使用WETH兌換了1個(gè)DOODLE
(4)贖回20個(gè)NFT,tokenId = 2574, 2595, 6851, 8522, 8883, ……
(5)抵押NFT(supplyERC721),tokenId = 5251, 4777, 3693,然后鑄造nDOODLE
(6)借貸WETH(borrow),數(shù)量為12.15 ETH
(7)提取抵押的3個(gè)NFT中的2個(gè),tokenId = 5251, 4777
(8)銷毀抵押NFT時(shí)鑄造的nDOODLE,然后調(diào)用safeTransferFrom函數(shù)將抵押的NFT轉(zhuǎn)移到攻擊合約,攻擊者利用onERC721Received函數(shù)發(fā)起了重入攻擊
(9)質(zhì)押的3個(gè)NFT提取了兩個(gè),還剩下一個(gè)tokenID = 3693的NFT,此時(shí)抵押倉(cāng)位,攻擊者在重入攻擊中實(shí)現(xiàn)了自我清算,清算完成后,將借貸設(shè)置為false。
(10)在轉(zhuǎn)移剩下的NFT時(shí)再次發(fā)生重入,此次重入,攻擊者抵押了全部的20個(gè)NFT,然后鑄造nDOODLE,以此做抵押,借貸了81 WETH。最后,將所有的20個(gè)NFT提取出來(lái)。
(11)重復(fù)以上抵押、鑄造、銷毀等操作,最終獲利148.8 ETH。
在本次事件中,由于safeTransferFrom函數(shù)調(diào)用onERC721Received函數(shù)引起的重入漏洞。攻擊者利用該漏洞發(fā)起了重入攻擊,最終獲利。
回顧了這么多的重入攻擊事件,可想而知重入漏洞在智能合約中是多么常見。
”2022中國(guó)國(guó)際金融年度論壇“于2022年9月2日在北京舉行,中國(guó)人民銀行數(shù)字貨幣研究所所長(zhǎng)穆長(zhǎng)春發(fā)表了關(guān)于”智能合約與數(shù)字人民幣“主題演講。穆長(zhǎng)春表示,數(shù)字人民幣智能合約應(yīng)用場(chǎng)景比較廣泛,可以降低經(jīng)濟(jì)活動(dòng)的履約成本,優(yōu)化營(yíng)商環(huán)境,推動(dòng)數(shù)字經(jīng)濟(jì)深化發(fā)展。由于智能合約的可信任、可互通優(yōu)勢(shì),可以更好的支撐數(shù)字經(jīng)濟(jì)。
一邊是推動(dòng)智能合約與數(shù)字人名幣的發(fā)展,一邊是頻繁發(fā)生的合約安全問題,我們應(yīng)該采取哪些有效預(yù)防措施,避免損失,保障安全?
以上就是腳本之家小編給大家分享的是智能合約中的重入攻擊的詳細(xì)解讀,希望此篇文章可以幫助大家更好的了解智能合約中的重入攻擊。
你可能感興趣的文章
-
不小心把幣轉(zhuǎn)入智能合約怎么辦?幣轉(zhuǎn)到智能合約地址能找回嗎?
在幣圈,轉(zhuǎn)幣是常見的操作方式,很多投資者不小心把幣轉(zhuǎn)入智能合約不知道怎么辦,想要知道幣轉(zhuǎn)到智能合約地址能找回嗎?一旦遇到這樣的情況,一定要保持冷靜,并聯(lián)系相關(guān)的…
2024-05-09 -
如何成為全能性的智能合約開發(fā)者?
如何成為全能性的智能合約開發(fā)者?本文主要針對(duì) Solidity, Rust 和 Move 合約開發(fā)語(yǔ)言,供大家參考學(xué)習(xí),少走彎路…
2024-04-30 -
三分鐘了解以太坊智能合約是什么意思?
智能合約是以太坊應(yīng)用程序的基本構(gòu)建塊,它們是存儲(chǔ)在區(qū)塊鏈上的計(jì)算機(jī)程序,使我們能夠?qū)鹘y(tǒng)合同轉(zhuǎn)換為數(shù)字合同,那么,以太坊智能合約是什么意思?本文將為大家詳細(xì)介紹…
2023-12-06 -
區(qū)塊鏈和智能合約的關(guān)系是什么?
智能合約和區(qū)塊鏈?zhǔn)钱?dāng)今社會(huì)最熱門的話題之一,二者之間存在著密切的關(guān)系,那么,區(qū)塊鏈和智能合約的關(guān)系是什么?下面將為大家深入分析…
2023-11-17 -
以太坊智能合約可以改嗎?安全嗎?
以太坊是一種去中心化的開放源代碼平臺(tái),其最大的特點(diǎn)之一就是智能合約的支持,智能合約是一種在區(qū)塊鏈上執(zhí)行的自動(dòng)化合約,可以實(shí)現(xiàn)各種功能,如數(shù)字資產(chǎn)的交換、數(shù)據(jù)的驗(yàn)…
2023-11-07 -
以太坊智能合約會(huì)被黑客 攻擊嗎?以太坊是如何避免攻擊的?
以太坊智能合約是基于以太坊區(qū)塊鏈平臺(tái)上的編程代碼,用以實(shí)行及管理數(shù)字貨幣交易和其它去中心化應(yīng)用,雖然以太坊智能合約被設(shè)計(jì)為安全可靠,但它們依然存在被黑客 攻擊的風(fēng)…
2025-04-22 -
智能合約有什么作用? 能實(shí)現(xiàn)哪些功能?
智能合約是一種基于區(qū)塊鏈技術(shù)的自動(dòng)化合約,可以說(shuō)是有各種各樣的應(yīng)用領(lǐng)域,要知道近年來(lái)加密領(lǐng)域的一個(gè)重要話題是去中心化金融,那么究竟智能合約有什么作用,大家想要知…
2023-09-28 -
以太坊智能合約的應(yīng)用有哪些?智能合約的三大要素是什么?
區(qū)塊鏈技術(shù)是當(dāng)前比較流行的一種技術(shù),利用區(qū)塊鏈就可以完成智能合約平臺(tái)的創(chuàng)建,比如以太坊就是采用的區(qū)塊鏈技術(shù)打造的,不但現(xiàn)在以太坊平臺(tái)很受歡迎,而且旗下的代幣也很…
2023-09-26 -
智能合約語(yǔ)言有哪些? 智能合約語(yǔ)言類型匯總
智能合約語(yǔ)言是一種編程語(yǔ)言,用于編寫在區(qū)塊鏈上執(zhí)行的智能合約,需要注意的是,不同的區(qū)塊鏈平臺(tái)可能支持不同的智能合約語(yǔ)言,對(duì)于加密貨幣投資者來(lái)說(shuō),了解智能合約語(yǔ)言有…
2023-09-12 -
智能合約語(yǔ)言的特點(diǎn)是什么? 智能合約語(yǔ)言有哪些類型?
智能合約語(yǔ)言是一種用于編寫智能合約的編程語(yǔ)言,它允許開發(fā)人員定義和執(zhí)行在區(qū)塊鏈上運(yùn)行的自動(dòng)化合約,不同的區(qū)塊鏈平臺(tái)和智能合約平臺(tái)支持不同的智能合約語(yǔ)言,對(duì)于加密貨…
2023-08-29