-
bitcoin $87959.907984 USD
1.34% -
ethereum $2920.497338 USD
3.04% -
tether $0.999775 USD
0.00% -
xrp $2.237324 USD
8.12% -
bnb $860.243768 USD
0.90% -
solana $138.089498 USD
5.43% -
usd-coin $0.999807 USD
0.01% -
tron $0.272801 USD
-1.53% -
dogecoin $0.150904 USD
2.96% -
cardano $0.421635 USD
1.97% -
hyperliquid $32.152445 USD
2.23% -
bitcoin-cash $533.301069 USD
-1.94% -
chainlink $12.953417 USD
2.68% -
unus-sed-leo $9.535951 USD
0.73% -
zcash $521.483386 USD
-2.87%
什麼是重新進入攻擊?如何防止這種脆弱性?
Reentrancy attacks exploit smart contract flaws, allowing repeated function calls before state resolution, leading to unauthorized actions; prevent with checks-effects-interactions pattern.
2025/04/12 00:35
重新進入攻擊是智能合約,尤其是以太坊區塊鏈上的一種安全漏洞。此攻擊利用了合同邏輯中的缺陷,該缺陷允許攻擊者在完全解決初始呼叫之前反複調用功能。這可能導致未經授權的戒斷或其他惡意行動。在本文中,我們將探討重新進入攻擊的機制,檢查現實世界的示例,並提供有關如何防止智能合約中這種脆弱性的詳細指導。
了解重新進入攻擊
當智能合約在解決自己的狀態之前,智能合約調用外部合同時,就會發生重新攻擊。這可以為外部合同創造一個機會窗口,以重新獲得原始合同並操縱其狀態。襲擊通常涉及一項惡意合同,該合同通過在受害者合同可以更新其餘額之前反複調用諸如withdraw()之類的職能,從而從受害者合同中流失了資金。
為了說明,請考慮一個簡單的合同示例,該合同允許用戶存入和提取資金:
contract Vulnerable {mapping(address => uint) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint amount) public { require(balances[msg.sender] >= amount, 'Insufficient balance'); (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); balances[msg.sender] -= amount; }
}
在此示例中, withdraw功能首先檢查用戶是否有足夠的餘額,然後嘗試將資金發送給用戶,並最終更新用戶的餘額。漏洞在於以下事實:直到在msg.sender.call的外部呼叫之後, balances[msg.sender]才能更新。如果msg.sender是惡意合同,則可以在更新余額之前重新進入withdraw功能,允許在將餘額設置為零之前進行多次提款。
重新進入攻擊的現實示例
最臭名昭著的重新進入攻擊之一發生在2016年的DAO Hack期間。 DAO(分散的自治組織)是以太坊區塊鏈的智能合同,允許用戶投資於項目。該合同的脆弱性類似於上述合同,該合同使攻擊者從DAO中漏了大約360萬ETH。
另一個例子是2017年的奇特錢包黑客。奇偶錢包是一個流行的以太坊上流行的多簽名錢包,由於重新進入的脆弱性而被利用。攻擊者能夠從多個錢包中排出資金,從而給用戶帶來了重大損失。
如何防止重新進入攻擊
防止重新進入攻擊需要仔細設計和實施智能合約。以下是減輕這種脆弱性的一些策略:
使用檢查效應互動模式
檢查效應互動模式是編寫安全智能合約的最佳實踐。此模式可確保在執行任何外部呼叫之前進行所有狀態更改。在withdraw功能的上下文中,這意味著在發送資金之前更新用戶的餘額:
contract Secure {mapping(address => uint) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint amount) public { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }
}
通過在進行外部呼叫之前更新余額,合同確保在發生任何重新輸入之前正確將用戶的餘額設置為零。
使用撤回模式
防止重新進入攻擊的另一種有效方法是使用撤回模式。該合同不是直接向用戶發送資金,而是存儲提款金額,並允許用戶在以後的時間撤出資金。這種方法消除了在撤回過程中對外部呼叫的需求:
contract WithdrawalPattern {mapping(address => uint) public balances; mapping(address => uint) public withdrawalPending; function deposit() public payable { balances[msg.sender] += msg.value; } function requestWithdrawal(uint amount) public { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; withdrawalPending[msg.sender] += amount; } function withdraw() public { uint amount = withdrawalPending[msg.sender]; require(amount > 0, 'No pending withdrawal'); withdrawalPending[msg.sender] = 0; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }
}
在此示例中, requestWithdrawal函數更新用戶的餘額,並將提款金額存儲在withdrawalPending中。然後, withdraw功能將資金發送給用戶,而沒有任何重新進入的風險。
實施重新進取後衛
重新進入後衛是防止重新進入攻擊的另一種技術。這些警衛使用狀態變量來跟踪當前是否正在執行函數。如果重新輸入功能,則警衛將阻止進一步執行:
contract ReentrancyGuard {bool private _notEntered; constructor() { _notEntered = true; } modifier nonReentrant() { require(_notEntered, 'ReentrancyGuard: reentrant call'); _notEntered = false; _; _notEntered = true; } function withdraw(uint amount) public nonReentrant { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }
}
nonReentrant修飾符可確保在仍在執行時withdraw函數無法重新輸入。
測試和審核重新進入漏洞
除了採取預防措施外,至關重要的是要徹底測試和審核您的智能合約是否有重新進入脆弱性。以下是一些步驟:
- 單元測試:編寫單元測試,以模擬重新進入攻擊,以確保您的合同在這種情況下正確行為。
- 靜態分析:使用MyThril和Slither之類的工具自動檢測代碼中潛在的重新輸入漏洞。
- 手動審核:經驗豐富的智能合同審核師會查看您的代碼是否有潛在的重新輸入問題。手動審核可以發現自動化工具可能會錯過的複雜漏洞。
智能合同開發的最佳實踐
為了進一步降低重新進入攻擊的風險,請考慮以下最佳實踐:
- 保持合同簡單:複雜的合同更有可能包含漏洞。使您的合同盡可能簡單明了。
- 使用已建立的圖書館:利用審核的圖書館和框架,例如Openzeppelin ,可提供共同合同模式的安全實現。
- 定期更新:請了解最新的安全性最佳實踐,並相應地更新合同。
常見問題
問:除了以太坊以外,還可以在其他區塊鏈平台上發生重新進入攻擊嗎?答:雖然重新進入攻擊最常見於以太坊,因為它廣泛使用了智能合約,但在支持智能合約的其他區塊鏈平台上可能會發生類似的漏洞,例如Binance Smart Chain和Solana。防止重新進入攻擊的原則在不同平台之間保持不變。
問:是否有專門設計用於檢測重新進入漏洞的工具?答:是的,幾種工具旨在檢測智能合約中的重新輸入漏洞。 MyThril和Slither是流行的靜態分析工具,可以識別潛在的重新進入問題。此外, echidna是一種基於屬性的測試工具,可用於通過自動測試案例生成來測試重新進入漏洞。
問:如果我不是安全專家,我該如何確保我的智能合同可以防止重新進入攻擊?答:如果您不是安全專家,強烈建議您參與專業的智能合同審核員來查看您的代碼。此外,使用諸如Openzeppelin的既定庫以及遵循最佳實踐(例如檢查效應之間的互動模式)可以大大降低重新進入脆弱性的風險。定期更新有關智能合同安全性並參與社區討論的知識也可以幫助您了解最新的安全慣例。
免責聲明:info@kdj.com
所提供的資訊並非交易建議。 kDJ.com對任何基於本文提供的資訊進行的投資不承擔任何責任。加密貨幣波動性較大,建議您充分研究後謹慎投資!
如果您認為本網站使用的內容侵犯了您的版權,請立即聯絡我們(info@kdj.com),我們將及時刪除。
- 比特幣、eCash 分叉和空投動態:深入探討加密貨幣的最新爭議
- 2026-05-03 12:55:01
- 2026 年邁阿密共識:Web3、區塊鏈、加密貨幣、NFT、Metaverse,會議,5 月 5 日 — 華爾街與數位前沿相遇的地方
- 2026-05-02 12:45:01
- 聯準會維持利率穩定,地緣政治緊張局勢引發比特幣價格下跌
- 2026-05-01 06:45:01
- 比特幣礦工為電網供電:收購俄亥俄州天然氣廠開啟數位黃金新時代
- 2026-05-01 00:45:01
- MegaETH的MEGA代幣登陸紐約:為即時區塊鏈設定新的效能基準
- 2026-05-01 00:55:01
- Solana 的滑坡:價格預測顯示阻力損失和潛在的進一步下跌
- 2026-05-01 06:45:01
相關知識
什麼是加密貨幣風險管理?哪些規則區分贏家和輸家?
2026-06-12 11:59:57
加密貨幣風險管理的核心原則1. 每個部位的規模必須根據總資本的固定百分比來決定-通常每筆交易不超過 1.5%。 2. 私鑰和助記詞絕不會以數位方式儲存在連網裝置上;實體備份仍然是唯一可接受的標準。 3. 智能合約互動需要在簽署任何交易之前手動驗證字節碼雜湊和函數簽章。 4. 交易所帳戶僅持有交易活躍...
什麼是權益證明 (PoS)?它比挖礦好嗎?
2026-06-20 17:20:17
權益證明的核心機制1. 權益證明 (PoS) 的運作方式是根據驗證者持有並鎖定為權益的加密貨幣的數量和期限來選擇驗證者。 2. 與挖礦不同,參與區塊驗證不需要專門的硬體或電力密集計算。 3. 驗證者被選擇提出或證明某個區塊的機會與其質押金金額相對於總質押供應量成正比。 4. 驗證者必須將代幣存入智能...
什麼是工作量證明 (PoW)?為什麼Bitcoin仍然使用它?
2026-06-13 04:03:54
PoW核心機制1. 工作量證明要求礦工對區塊頭數據與可變隨機數進行重複的 SHA-256 哈希計算。 2. 目標條件要求產生的雜湊以特定數量的前導零開始,並動態調整以保持一致的區塊間隔。 3. 每次嘗試在計算上都是獨立的;不存在捷徑-只有強力迭代才能產生有效的解。 4. 一旦發現,解決方案將在網路上...
什麼是市場流動性?為什麼低流動性會造成極度波動?
2026-06-19 15:19:37
什麼是市場流動性? 1.市場流動性是指市場吸收大額買賣訂單而不造成重大價格偏差的能力。 2. 它透過三個核心維度來衡量:寬度、深度和彈性——其中寬度反映了買賣價差,深度捕獲了最佳價格的訂單簿數量,而彈性則表明了交易衝擊後價格恢復平衡的速度。 3. 在加密貨幣市場中,流動性受到集中交易訂單簿、去中心化...
什麼是黑天鵝事件?它如何消滅加密貨幣投資組合?
2026-06-17 14:59:57
黑天鵝事件的定義與起源1. 黑天鵝事件是一種極為罕見的事件,因其極為罕見、影響嚴重且具有回顧性可預測性,超出了常規預期範圍。 2. 納西姆·尼古拉斯·塔勒布 (Nassim Nicholas Taleb) 在其 2007 年出版的《黑天鵝》一書中介紹了這一概念,強調此類事件如何違背標準統計模型和機率...
什麼是加密貨幣中的搶先交易?它如何損害您的交易?
2026-06-18 05:40:05
去中心化環境中定義的搶先交易1. 搶先交易是一種做法,參與者觀察記憶體池中的待處理交易,並提交具有較高汽油費的競爭交易,以獲得區塊中的優先位置。 2. 這種行為利用了以太坊記憶體池的公共、透明性質,所有未經確認的交易對網路參與者都是可見的。 3. 攻擊者不需要內部存取或特權資訊-只需要即時監控能力和...
什麼是加密貨幣風險管理?哪些規則區分贏家和輸家?
2026-06-12 11:59:57
加密貨幣風險管理的核心原則1. 每個部位的規模必須根據總資本的固定百分比來決定-通常每筆交易不超過 1.5%。 2. 私鑰和助記詞絕不會以數位方式儲存在連網裝置上;實體備份仍然是唯一可接受的標準。 3. 智能合約互動需要在簽署任何交易之前手動驗證字節碼雜湊和函數簽章。 4. 交易所帳戶僅持有交易活躍...
什麼是權益證明 (PoS)?它比挖礦好嗎?
2026-06-20 17:20:17
權益證明的核心機制1. 權益證明 (PoS) 的運作方式是根據驗證者持有並鎖定為權益的加密貨幣的數量和期限來選擇驗證者。 2. 與挖礦不同,參與區塊驗證不需要專門的硬體或電力密集計算。 3. 驗證者被選擇提出或證明某個區塊的機會與其質押金金額相對於總質押供應量成正比。 4. 驗證者必須將代幣存入智能...
什麼是工作量證明 (PoW)?為什麼Bitcoin仍然使用它?
2026-06-13 04:03:54
PoW核心機制1. 工作量證明要求礦工對區塊頭數據與可變隨機數進行重複的 SHA-256 哈希計算。 2. 目標條件要求產生的雜湊以特定數量的前導零開始,並動態調整以保持一致的區塊間隔。 3. 每次嘗試在計算上都是獨立的;不存在捷徑-只有強力迭代才能產生有效的解。 4. 一旦發現,解決方案將在網路上...
什麼是市場流動性?為什麼低流動性會造成極度波動?
2026-06-19 15:19:37
什麼是市場流動性? 1.市場流動性是指市場吸收大額買賣訂單而不造成重大價格偏差的能力。 2. 它透過三個核心維度來衡量:寬度、深度和彈性——其中寬度反映了買賣價差,深度捕獲了最佳價格的訂單簿數量,而彈性則表明了交易衝擊後價格恢復平衡的速度。 3. 在加密貨幣市場中,流動性受到集中交易訂單簿、去中心化...
什麼是黑天鵝事件?它如何消滅加密貨幣投資組合?
2026-06-17 14:59:57
黑天鵝事件的定義與起源1. 黑天鵝事件是一種極為罕見的事件,因其極為罕見、影響嚴重且具有回顧性可預測性,超出了常規預期範圍。 2. 納西姆·尼古拉斯·塔勒布 (Nassim Nicholas Taleb) 在其 2007 年出版的《黑天鵝》一書中介紹了這一概念,強調此類事件如何違背標準統計模型和機率...
什麼是加密貨幣中的搶先交易?它如何損害您的交易?
2026-06-18 05:40:05
去中心化環境中定義的搶先交易1. 搶先交易是一種做法,參與者觀察記憶體池中的待處理交易,並提交具有較高汽油費的競爭交易,以獲得區塊中的優先位置。 2. 這種行為利用了以太坊記憶體池的公共、透明性質,所有未經確認的交易對網路參與者都是可見的。 3. 攻擊者不需要內部存取或特權資訊-只需要即時監控能力和...
看所有文章














