最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

當前位置:主頁 > 區(qū)塊鏈 > 區(qū)塊鏈技術(shù) > 什么是重入攻擊

重入攻擊是什么?Curve池內(nèi)的7000萬美元如何丟的?

2026-06-14 15:42:07 | 來源: | 作者:佚名
之前的 Curve 池漏洞與我們在過去幾年里看到的大多數(shù)加密貨幣黑客事件有所不同,因為與之前的許多漏洞不同,這一次并不直接與智能合約本身的漏洞有關(guān),而是與它所使用的語言的底層編譯器有關(guān)

近期 Curve 的 Vyper 編譯語言漏洞導(dǎo)致超過 7000 萬美元被盜,此次的漏洞被稱為「重入攻擊」,本文將深入介紹重入攻擊。本文源自 CyberPunkMetalHead 于 Medium 所著文章 《A Deep Dive Into How Curve Pool’s $70 Million Reentrancy Exploit Was Possible》,由 星球日報Odaily 編譯、整理。

近期的 Curve 池漏洞與我們在過去幾年里看到的大多數(shù)加密貨幣黑客事件有所不同,因為與之前的許多漏洞不同,這一次并不直接與智能合約本身的漏洞有關(guān),而是與它所使用的語言的底層編譯器有關(guān)。

在這里,我們談?wù)摰氖?strong> Vyper:一個面向智能合約的、具有Pythonic風格的編程語言,旨在與以太坊虛擬機(EVM)交互。我對此次漏洞的背后原因非常感興趣,所以我決定深入研究。

隨著這次漏洞的發(fā)展,每天的新聞頭條都在報告新的數(shù)字?,F(xiàn)在看來,情況終于得到了控制,但在此之前已經(jīng)有超過 7000 萬美元被盜。根據(jù) LlamaRisk 的事后評估,截止到今天,有幾個 DeFi 項目的池子也被黑客攻破,包括PEGD 的 pETH/ETH: 1100 萬美元;Metronome 的 msETH/ETH: 340 萬美元;Alchemix 的 alETH/ETH: 2260萬美元;和Curve DAO: 大約2470萬美元。

這次漏洞被稱為重入錯誤,它是在 Vyper 編程語言的某些版本上出現(xiàn)的,特別是 v0.2.15、v0.2.16 和 v0.3.0。因此,使用這些特定版本的 Vyper 的所有項目都可能成為攻擊的目標。

什么是重入(reentrancy)?

為了理解這次漏洞為什么會發(fā)生,我們首先需要了解什么是重入以及它是如何工作的。

如果一個函數(shù)在運行過程中可以被中斷,并且在其之前的調(diào)用完成運行之前可以安全地再次被調(diào)用「重新進入」,則稱該函數(shù)為可重入的??芍厝牒瘮?shù)在硬件中斷處理、遞歸等應(yīng)用中都有使用。

為了使一個函數(shù)變得可重入,它需要滿足以下條件:

  • 它不能使用全局和靜態(tài)數(shù)據(jù)。這只是一種約定,沒有硬性的限制,但如果使用全局數(shù)據(jù)的函數(shù)被中斷和重新啟動,它可能會丟失信息。
  • 它不應(yīng)修改自己的代碼。無論函數(shù)何時被中斷,都應(yīng)該能夠以相同的方式運行。這可以管理,但通常不建議這樣做。
  • 它不應(yīng)該調(diào)用其他非重入函數(shù)。 重入不應(yīng)與線程安全混淆,盡管它們緊密相關(guān)。一個函數(shù)可以是線程安全的,但仍然不是可重入的。為了避免混淆,重入只涉及到一個線程的運行。這是在沒有多任務(wù)操作系統(tǒng)存在的時代的一個概念。

這里有一個實際的例子:

i = 5
def non_reentrant_function():
return i**5
def reentrant_function(number:int):
return number**5

函數(shù) non_reentrant_function:

  • 這個函數(shù)沒有參數(shù)。
  • 它直接返回全局變量 i 的五次方。
  • 所以當你調(diào)用這個函數(shù)時,它總是返回 5**5,即 3125。

函數(shù) reentrant_function:

  • 這個函數(shù)有一個參數(shù) number,是整型。
  • 它返回參數(shù) number 的五次方。
  • 這意味著你可以給這個函數(shù)傳入任何整數(shù),并得到這個數(shù)的五次方作為返回值。例如,如果你傳入 2,它會返回 2 的 5 次方 ,即 32。

值得注意的是,許多智能合約函數(shù)都不是可重入的,因為它們訪問如錢包余額之類的全局信息。

什么是鎖(Lock)?

鎖本質(zhì)上是一種線程同步機制,某個進程可以聲稱或「鎖定」另一個進程。

最簡單的鎖類型被稱為二進制信號量。這種鎖為被鎖定的數(shù)據(jù)提供獨占訪問。還有更復(fù)雜的鎖類型,可以提供對讀數(shù)據(jù)的共享訪問。在編程中誤用鎖可能導(dǎo)致死鎖或活鎖,進程持續(xù)互相阻塞,狀態(tài)不斷改變但沒有進展。

編程語言在后臺使用鎖來優(yōu)雅地管理和共享多個子程序之間的狀態(tài)更改。但是,某些語言,如 C# 和 Vyper 允許在代碼中直接使用鎖。

@nonreentrant(‘lock’)
def func():
assert not self.locked, “l(fā)ocked”
self.locked = True
# Do stuff
# Release the lock after finishing doing stuff
raw_call(msg.sender, b””, value=0)
self.locked = False
# More code here

在上面的例子中,我們希望確保如果 msg.sender(合約調(diào)用者)是另一個合約,它不會在運行時調(diào)用代碼。如果在 raw_call() 下面還有更多的代碼,而沒有鎖,msg.sender 可能會在我們的函數(shù)運行完畢之前調(diào)用上面的所有代碼。

因此,在 Vyper 中,nonreentrant(‘lock’) 裝飾器是一種控制對函數(shù)的訪問的機制,以防止調(diào)用者在它們完成運行之前反復(fù)運行智能合約函數(shù)。

在許多 DeFi 黑客事件中,通常都是合約開發(fā)者沒有預(yù)見到的智能合約錯誤,一個聰明但惡意的利用者發(fā)現(xiàn)了某些函數(shù)或數(shù)據(jù)暴露的方式中的弱點。但這次的情況獨特之處在于,Curve 的智能合約以及所有其他成為攻擊受害者的池和項目在代碼本身中都沒有已知的漏洞。合約是穩(wěn)固的。

nonreentrant(‘lock’)是存在的。

由于 Vyper 語言在處理重入鎖的方式上出現(xiàn)了問題,導(dǎo)致了這個問題的發(fā)生。所以,合約創(chuàng)建者可能部署了看似合理的代碼,但由于編譯器沒有正確處理鎖,使得攻擊者能夠利用這個有缺陷的鎖進行利用,導(dǎo)致合約行為出現(xiàn)意料之外的結(jié)果。

讓我們看看真正受到重入攻擊的合約。注意 @nonreentrant(‘lock’) 修飾符嗎?通常情況下,這應(yīng)該可以防止重入,但實際上并未能防止。攻擊者能夠在函數(shù)返回結(jié)果之前反復(fù)調(diào)用 remove_liquidity()。

@nonreentrant(‘lock’)
def remove_liquidity(
_burn_amount: uint256,
_min_amounts: uint256[N_COINS],
_receiver: address = msg.sender
) -> uint256[N_COINS]:
“””
@notice Withdraw coins from the pool
@dev Withdrawal amounts are based on current deposit ratios
@param _burn_amount Quantity of LP tokens to burn in the withdrawal
@param _min_amounts Minimum amounts of underlying coins to receive
@param _receiver Address that receives the withdrawn coins
@return List of amounts of coins that were withdrawn
“””
total_supply: uint256 = self.totalSupply
amounts: uint256[N_COINS] = empty(uint256[N_COINS])
for i in range(N_COINS):
old_balance: uint256 = self.balances[i]
value: uint256 = old_balance * _burn_amount / total_supply
assert value >= _min_amounts[i], “Withdrawal resulted in fewer coins than expected”
self.balances[i] = old_balance – value
amounts[i] = value
if i == 0:
raw_call(_receiver, b””, value=value)
else:
response: Bytes[32] = raw_call(
self.coins[1],
concat(
method_id(“transfer(address,uint256)”),
convert(_receiver, bytes32),
convert(value, bytes32),
),
max_outsize=32,
)
if len(response) > 0:
assert convert(response, bool)
total_supply -= _burn_amount
self.balanceOf[msg.sender] -= _burn_amount
self.totalSupply = total_supply
log Transfer(msg.sender, ZERO_ADDRESS, _burn_amount)
log RemoveLiquidity(msg.sender, amounts, empty(uint256[N_COINS]), total_supply)
return amounts

這是如何被利用的?

到目前為止,我們知道重入攻擊是一種反復(fù)調(diào)用智能合約中的某個函數(shù)的方法。但這是如何導(dǎo)致資金被盜和在Curve 攻擊中損失 7000 萬美元的呢?

注意智能合約末尾的 self.balanceOf[msg.sender] -= _burn_amount 嗎?這告訴智能合約池中 msg.sender 的流動性,減去燃燒費。接下來的代碼行為 message.sender 調(diào)用 transfer()。

因此,一個惡意合約可以在金額更新之前不斷地調(diào)用提現(xiàn),幾乎讓他們可以選擇提取池中的所有流動性。

這樣的攻擊通常的流程是這樣的:

  • 易受攻擊的合約有 10 個 eth。
  • 攻擊者調(diào)用存款并存入 1 個 eth。
  • 攻擊者調(diào)用提現(xiàn) 1 個 eth,此時提現(xiàn)函數(shù)運行一些檢查:
  • 攻擊者的帳戶中是否有 1 個 eth?是的。
  • 將 1 個 eth 轉(zhuǎn)移到惡意合約。注意:合約的余額尚未更改,因為該函數(shù)仍在運行。
  • 攻擊者再次調(diào)用提現(xiàn) 1 個 eth。(重新入場)
  • 攻擊者的帳戶中是否有 1 個 eth?是的。

這將重復(fù),直到池中沒有更多的流動性。

Vyper 語言中的這個問題已經(jīng)被修復(fù),在 0.3.0 版本之后不再存在。如果您是開發(fā)人員,或使用 Vyper 的 Web3 組織,請確保立即更新您的版本。

免責聲明:本文只為提供市場訊息,所有內(nèi)容及觀點僅供參考,不構(gòu)成投資建議,不代表本站觀點和立場。投資者應(yīng)自行決策與交易,對投資者交易形成的直接或間接損失,作者及本站將不承擔任何責任。!
Tag:重入攻擊  

你可能感興趣的文章

幣圈快訊

  • WLFI關(guān)聯(lián)公司ALT5Sigma轉(zhuǎn)移18.15億枚WLFI至新地址

    2026-08-03 03:25
    8月3日,據(jù)OnchainLens監(jiān)測,與特朗普家族支持的加密項目WorldLibertyFinancial相關(guān)的數(shù)字資產(chǎn)財庫公司ALT5Sigma,將18.15億枚WLFI轉(zhuǎn)入一個新地址,按當時價格計算價值約9,977萬美元。轉(zhuǎn)賬完成后,ALT5Sigma相關(guān)地址仍持有約50.9億枚WLFI,價值約2.82億美元。
  • 證監(jiān)會對多家券商開出罰單投行業(yè)務(wù)繼續(xù)嚴監(jiān)管

    2026-08-03 02:42
    8月2日,7月31日,證監(jiān)會及屬地派出機構(gòu)集中披露多份投行業(yè)務(wù)相關(guān)行政監(jiān)管措施決定書,對多家券商執(zhí)業(yè)及內(nèi)控問題進行問責。本次監(jiān)管對象涵蓋廣發(fā)證券、紅塔證券、世紀證券、甬興證券、國融證券、國元證券六家券商,監(jiān)管部門根據(jù)各家機構(gòu)違規(guī)情節(jié)的不同,分別采取出具警示函、責令改正兩類行政監(jiān)管措施。廣發(fā)證券、紅塔證券、世紀證券三家機構(gòu)被監(jiān)管出具警示函,違規(guī)問題聚焦投行內(nèi)控管理與執(zhí)業(yè)規(guī)范短板。甬興證券、國融證券、國元證券則被監(jiān)管采取力度更嚴苛的責令改正措施。
  • 資源充足卻無法自行檢測Benchmark合伙人質(zhì)疑Anthropic推動限制模型蒸餾

    2026-08-03 02:14
    8月3日,Benchmark合伙人ChetanPuttagunta在X平臺發(fā)文表示,Anthropic公開呼吁加強對AI模型蒸餾的監(jiān)管令人感到困惑,他表示Anthropic目前是一家估值約1萬億美元、擁有大量技術(shù)和資金資源的公司,按照其描述的規(guī)模,所謂“大規(guī)模蒸餾攻擊”理論上應(yīng)該較容易被識別和追蹤,如果Anthropic選擇限制相關(guān)行為,真正的成本可能并非技術(shù)能力不足,而是放棄部分API收入。“唯一需要付出的成本似乎是減少相關(guān)API業(yè)務(wù)收入?!?/div>
  • 伊朗外交部:霍爾木茲海峽不會恢復(fù)戰(zhàn)前狀態(tài)開放問題與阿曼談判無關(guān)

    2026-08-03 01:25
    8月3日,伊朗外交部發(fā)言人巴加埃表示,霍爾木茲海峽“永遠不會恢復(fù)到戰(zhàn)前狀態(tài)”。巴加埃稱,伊朗與阿曼目前圍繞該水道進行的談判,與霍爾木茲海峽的開放或關(guān)閉無關(guān)。他表示,海峽關(guān)閉是由于“美國破壞行動以及對伊朗實施海上封鎖”導(dǎo)致的。他補充說,相關(guān)談判屬于雙邊性質(zhì),雙方就“維護自身利益的機制”展開討論并非新議題,雙方已經(jīng)進行了很長時間的磋商。他并稱,伊朗根據(jù)國家利益和關(guān)切采取行動,不會受到其他方面威脅和恐嚇的影響而改變決定,伊朗“不會因威脅和媒體壓力而放棄自身立場”。他表示,地區(qū)鄰國都應(yīng)認識到,美國方面任何針對伊朗基礎(chǔ)設(shè)施的襲擊,其后果都將波及整個地區(qū)。(金十)
  • 阿拉格齊:伊朗與阿曼談判接近完成

    2026-08-03 01:06
    8月3日,當?shù)貢r間8月2日,伊朗外交部長阿拉格齊在政府內(nèi)閣會議上介紹伊朗與阿曼談判最新進展時表示,雙方談判目前進展順利,已進入最后階段,接近完成。據(jù)伊朗方面7月26日消息,伊朗外交部發(fā)言人巴加埃表示,伊朗與阿曼就管理霍爾木茲海峽安全航運的共同原則及操作機制進行討論,會談“富有成效并取得一些進展”。阿拉格齊27日與阿曼以及沙特阿拉伯外交大臣分別通話,討論霍爾木茲海峽事宜。根據(jù)伊朗外交部發(fā)表的聲明,阿拉格齊在通話中強調(diào)“加強合作的必要性”。
  • 查看更多
更多

熱門幣種

  • 幣種
    最新價格
    24H漲跌幅
  • bitcoin BTC 比特幣

    BTC

    比特幣

    $ 63390.01¥ 428446.73
    +1.41%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 1875.82¥ 12678.47
    +2.42%
  • tether USDT 泰達幣

    USDT

    泰達幣

    $ 0.999¥ 6.7521
    -0.03%
  • binance-coin BNB 幣安幣

    BNB

    幣安幣

    $ 589.34¥ 3983.29
    +2.39%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 1.0008¥ 6.7643
    +0.01%
  • ripple XRP 瑞波幣

    XRP

    瑞波幣

    $ 1.0812¥ 7.3077
    +2.82%
  • solana SOL Solana

    SOL

    Solana

    $ 73.5667¥ 497.22
    +3.76%
  • tron TRX 波場

    TRX

    波場

    $ 0.3275¥ 2.2135
    +0.09%
  • hyperliquid HYPE Hyperliquid

    HYPE

    Hyperliquid

    $ 52.6045¥ 355.54
    +1.13%
  • dogecoin DOGE 狗狗幣

    DOGE

    狗狗幣

    $ 0.070926¥ 0.4793
    +3.8%
大新县| 伊金霍洛旗| 潞西市| 海口市| 醴陵市| 台中县| 曲沃县| 梨树县| 沙洋县| 常德市| 铜山县| 凤阳县| 沙坪坝区| 梁河县| 梁河县| 板桥市| 特克斯县| 肇东市| 读书| 门源| 常德市| 固始县| 乌鲁木齐县| 铜山县| 玉山县| 墨竹工卡县| 永丰县| 呈贡县| 新民市| 镶黄旗| 定兴县| 吉安市| 宜章县| 县级市| 常州市| 凉山| 瓦房店市| 连山| 山西省| 抚顺市| 鄯善县|