一、常見漏洞類型與通俗解釋
1. 重入攻擊(Reentrancy) ??
通俗解釋:就像你去銀行取錢,柜臺人員先給你錢,然后再記賬。你拿到錢后立即又要求取錢,由于賬還沒記,柜臺又給你一次錢,這樣循環下去你就能拿走銀行所有的錢。
漏洞原理:合約在更新狀態前調用外部合約,允許攻擊者遞歸調用提款函數
典型代碼:
Solidity
function withdraw() public {uint bal = balances[msg.sender];require(bal > 0);(bool sent, ) = msg.sender.call{value: bal}(""); // 漏洞點:先轉賬后更新余額require(sent, "Failed to send Ether");balances[msg.sender] = 0;
}
2. 整數溢出/下溢(Integer Overflow/Underflow) ??
通俗解釋:就像汽車里程表,當超過最大值時會從零重新開始。如果你有0元,再花1元,余額會變成非常大的數字。
漏洞原理:算術運算結果超出變量范圍導致意外行為
典型代碼:
Solidity
uint8 public balance = 255;
balance += 1; // 溢出后balance變為0
3. 訪問控制缺陷(Access Control) ??
通俗解釋:就像你家門鎖壞了,任何人都能進來拿東西。智能合約中如果沒有權限檢查,任何人都能調用關鍵函數。
漏洞原理:敏感函數缺乏適當的權限檢查
典型代碼:
Solidity
function transferOwnership(address _newOwner) public {owner = _newOwner;// 沒有檢查msg.sender是否是當前owner
}
4. 時間戳依賴(Timestamp Dependency) ?
通俗解釋:就像用不準確的鬧鐘來決定發工資時間,礦工可以稍微調整時間讓你提前或延后拿到工資。
漏洞原理