Pawar7349/DeFiHackLab

GitHub: Pawar7349/DeFiHackLab

一个通过重现 9 个真实 DeFi 安全事件来系统学习智能合约漏洞攻防的实验平台,每个模块提供漏洞合约、攻击演示和修复方案的完整闭环。

Stars: 0 | Forks: 0

# DeFiHackLab 🔐 [![Tests](https://img.shields.io/badge/Tests-26%20passing-brightgreen)](https://github.com/Pawar7349/DeFiHackLab) [![Solidity](https://img.shields.io/badge/Solidity-0.8.24-blue)](https://soliditylang.org) [![Built with Foundry](https://img.shields.io/badge/Built%20with-Foundry-FF6B6B)](https://foundry.sh) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![CI](https://img.shields.io/badge/CI-passing-brightgreen)](https://github.com/Pawar7349/DeFiHackLab/blob/main/.github/workflows/forge-tests.yml# DeFiHackLab 🔐 [![Tests](https://img.shields.io/badge/Tests-26%20passing-brightgreen)](https://github.com/Pawar7349/DeFiHackLab) [![Solidity](https://img.shields.io/badge/Solidity-0.8.24-blue)](https://soliditylang.org) [![Built with Foundry](https://img.shields.io/badge/Built%20with-Foundry-FF6B6B)](https://foundry.sh) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![CI](https://img.shields.io/badge/CI-passing-brightgreen)](https://github.com/Pawar7349/DeFiHackLab/blob/main/.github/workflows/forge-tests.yml) ## 为什么我要构建这个项目 了解重入攻击是一回事。但编写攻击者合约,在测试中看着它掏空金库,然后再修复它——这是一种完全不同层次的理解。 我建立这个实验室是因为我希望不仅停留在*知道*这些漏洞存在的层面上,而是要在 EVM 级别上真正理解它们是*如何*运作的。这里的每个模块都始于一个真实的安全事件,在 Solidity 中重现该漏洞利用过程,并最终以一个行之有效的修复方案和证明修复成功的测试结束。 ## 包含内容 9 个漏洞利用模块。每个模块包含: - 一个**漏洞合约** :—— 包含缺陷的代码 - 一个**攻击者合约**:—— 漏洞利用过程 - 一个**修复合约** :—— 修复后的版本 - **测试** :—— 证明漏洞利用有效且修复成功 - 一份**事件说明** :—— 关联到真实的现实事件 我在适用的地方使用 Foundry 测试和基于分叉的重现来模拟攻击。 | 模块 | 真实事件 | 损失 | |---|---|---| | 整数溢出 | Beauty Chain (2018) | 无限铸币 | | 重入 | The DAO (2016) | $60M | | 访问控制 | Parity Wallet init bug (2017) | $30M 冻结 | | tx.origin 误用 | 钓鱼模式 | 身份验证绕过 | | Selfdestruct | Parity Library kill (2017) | $150M 冻结 | | Oracle 操纵 | Mango Markets (2022) | $117M | | 治理攻击 | Beanstalk (2022) | $182M | | 签名重放 | 可重放的签名操作 | 资金抽干 | | 升级配置错误 | Wormhole UUPS risk (2022) | 接管风险 | ## 漏洞利用模块 ### 1. 🔢 整数溢出 — Beauty Chain (2018) Solidity <0.8 版本的算术运算会进行静默溢出包裹。将两个较大的 `uint256` 值相乘会溢出归零——从而让攻击者凭空无限铸币。 ``` // VULNERABLE — overflows to 0, then adds 0 to balance uint256 amount = _value * 2**255; balances[msg.sender] += amount; ``` **修复:** Solidity ^0.8 默认会对溢出执行 revert。对于较老的代码,请使用 OpenZeppelin 的 `SafeMath`。 ### 2. 🔄 重入 — The DAO (2016) 合约在发送 ETH 之后才更新发送者的余额。攻击者的 fallback 函数在余额被扣除之前递归调用 `withdraw()`——从而抽干了整个金库。 ``` // VULNERABLE — state update comes after the external call (bool success,) = msg.sender.call{value: amount}(""); // ← attacker re-enters here balances[msg.sender] -= amount; // ← never reached ``` ``` // FIXED — state first, then interaction balances[msg.sender] -= amount; (bool success,) = msg.sender.call{value: amount}(""); ``` 这正是导致 Ethereum 发生硬分叉的漏洞。修复方法可以用三个词来概括:Checks-Effects-Interactions(检查-生效-交互)。 ### 3. 🔑 访问控制 — Parity Wallet (2017) 共享库合约的 `initWallet()` 没有任何访问控制——也没有检查它是否已经被初始化。任何人都可以调用它,声称所有权,然后调用 `kill()`。有人正是这么做的,导致价值 $150M 的 ETH 被永久冻结,无法恢复。 **修复:** 使用 OpenZeppelin 的 `initializer` 修饰符,或者在允许初始化之前手动检查 `owner == address(0)`。 ### 4. 🧾 tx.origin 误用 — 钓鱼模式 `tx.origin` 始终是原始的 EOA——而不是直接的调用者。位于调用链中间的恶意合约可以利用这一点,冒充触发交易的用户。 ``` // VULNERABLE require(tx.origin == owner); // passes even if called through a malicious contract ``` **修复:** 使用 `msg.sender`。切勿在访问控制中使用 `tx.origin`。 ### 5. 💣 Selfdestruct — Parity Library Kill (2017) 共享库中一个公开可调用的 `kill()` 函数。一次意外的调用摧毁了数以百计的多重签名钱包所依赖的库——导致其所有资金被永久冻结,没有任何升级或恢复途径。 **修复:** `selfdestruct` 应该尽量不使用,或者被锁定在严格的多重签名访问控制之后。在现代合约中,尽可能完全避免使用它。 ### 6. 📈 Oracle 操纵 — Mango Markets (2022) 攻击者利用自己的资金在一个流动性薄弱的链上市场中拉高了 MNGO 代币的价格,然后使用膨胀的代币余额作为抵押品进行借贷——从而抽干了整个协议金库。 核心问题在于:该协议信任了一个可以在单次交易中被操纵的现货价格。 **修复:** 使用时间加权平均价格 (TWAP) 或像 Chainlink 这样的外部预言机。来自低流动性池的现货价格在一个区块内极易被操纵。 ### 7. 🏛️ 治理攻击 — Beanstalk (2022) Beanstalk 允许通过闪电 loan 获取的代币立即进行投票,并且在执行时没有任何时间锁。一名攻击者借入了足够多的代币以占据绝对多数投票权,对自己的恶意提案进行投票并执行——所有这些都发生在一次原子交易中。 ``` Flash loan → Hold majority → Vote → Execute → Drain treasury → Repay loan ``` 这整条链式反应在单次交易中就完成了。没有等待期。没有人能够阻止它。 **修复:** 在之前的区块对投票权进行快照。在提案通过与其可被执行之间添加一个强制性的延迟时间。 ### 8. ✍️ 签名重放 — 可重放的签名操作 没有包含 nonce 或 chain ID 的签名消息可以被多次提交。如果一个协议接受签名来授权提款,攻击者就可以重复提交同一个签名——利用用户仅签名过一次的消息不断抽走资金。 **修复:** 每个签名消息都必须包含 `nonce`、`chainId` 和过期时间戳。使用 EIP-712 处理类型化的结构化数据。在非ces 使用后将其作废。 ### 9. 🔧 升级配置错误 — Wormhole UUPS Risk (2022) UUPS 代理将所有调用转发给实现合约。如果实现合约在未初始化的状态下部署,任何人都可以调用 `initialize()`,声称所有权,然后将代理升级指向一个恶意合约——从而接管它控制的所有内容。 **修复:** 始终在实现合约的 constructor 中调用 `_disableInitializers()`。已部署但未初始化的实现合约就是一扇敞开的大门。 ## 快速开始 ``` git clone https://github.com/Pawar7349/DeFiHackLab.git cd DeFiHackLab forge install forge test -vvv ``` 运行特定模块: ``` forge test --match-contract ReentrancyTest -vvv forge test --match-contract GovernanceAttackTest -vvv ``` ## 项目结构 ``` DeFiHackLab/ │ ├── src/ ← vulnerable, attacker, and fixed contracts │ ├── overflow/ │ ├── reentrancy/ │ ├── access-control/ │ ├── txorigin/ │ ├── selfdestruct/ │ ├── oracle/ │ ├── governance/ │ ├── signature-replay/ │ └── upgrade-misconfig/ │ ├── test/ ← 26 tests, all passing ├── incidents/ ← incident notes per module └── .github/workflows/ ← CI runs on every push ``` ## 路线图 - [x] 9 个漏洞利用模块 — 包含漏洞、攻击者和修复后的合约 - [x] 所有模块共 26 个测试 - [x] CI 流水线 (GitHub Actions) - [ ] 每个模块的不变性和模糊测试 - [ ] 针对 Oracle 和治理模块的主网分叉测试 - [ ] 每个安全事件的详细漏洞追踪分析报告 - [ ] Gas 快照比较 — 漏洞版本 vs 修复版本 - [ ] 分析报告完成后的模块链接(将补充在此 README 中) ## 作者 **Pratik Pawar** — 专注于智能合约安全的 Solidity 开发者 我住在印度浦那。我正在积极寻找 Solidity 开发和智能合约安全相关的职位——初级审计员、协议开发人员或安全研究员。 ## [![GitHub](https://img.shields.io/badge/GitHub-Pawar7349-black?logo=github)](https://github.com/Pawar7349) [![Twitter](https://img.shields.io/badge/Twitter-@PratikP43786754-1DA1F2?logo=twitter)](https://x.com/PratikP43786754) [![LinkedIn](https://img.shields.io/badge/LinkedIn-pratik--pawar-blue?logo=linkedin)](https://www.linkedin.com/in/pratik-pawar-600731237/) ## 许可证 MIT
标签:CISA项目, DeFi安全, EVM, Foundry, Solidity, Web3安全, 交易回放, 以太坊, 加密货币, 区块链, 合约自毁, 复现环境, 安全测试, 攻击性安全, 整数溢出, 智能合约漏洞, 治理攻击, 漏洞修复, 网络安全培训, 访问控制缺陷, 重入攻击, 闪电贷攻击, 预言机操纵