最後學習常見的智能合約安全漏洞,不論是合約或軟體安全性都是非常重要的一環,了解攻擊方法才能有助於提高合約的安全性,防止潛在的攻擊。知己知彼,百戰百勝。
1. 重入攻擊(Reentrancy Attack)
* 合約在外部調用另一個合約時,沒有妥善防範重入的情況,攻擊者可以在第一次轉移資金後再次進入合約執行,從而重複執行提取操作。
* 典型案例:DAO 攻擊事件。
示例:
* 攻擊風險:攻擊者可以在 call 函數執行後但在 balances[msg.sender] -= amount; 更新前再進行一次withdraw,從而提取多次資金。
* 解決方案:採用「先更新狀態,再進行外部調用」的方式,或使用 ReentrancyGuard 來防範重入攻擊。
2.區塊時間依賴性
* 問題:某些合約依賴 block.timestamp 或 block.number 來確定特定操作的執行時間,但這些值可能會被礦工操縱,從而對結果產生不利影響。
* 解決方案:使用較寬鬆的時間窗口來避免礦工操縱,並限制時間依賴的敏感性。
3.隨機數生成漏洞
* 問題:區塊鏈上的隨機數不是真正隨機的,依賴 blockhash、block.timestamp 等值來生成隨機數的合約可能被攻擊者預測和操縱。
* 解決方案:使用鏈下隨機數生成器(如 Chainlink VRF)來生成真正的隨機數。