Pawar7349/DeFiHackLab
GitHub: Pawar7349/DeFiHackLab
一个通过重现 9 个真实 DeFi 安全事件来系统学习智能合约漏洞攻防的实验平台,每个模块提供漏洞合约、攻击演示和修复方案的完整闭环。
Stars: 0 | Forks: 0
# DeFiHackLab 🔐
[](https://github.com/Pawar7349/DeFiHackLab)
[](https://soliditylang.org)
[](https://foundry.sh)
[](https://opensource.org/licenses/MIT)
[](https://github.com/Pawar7349/DeFiHackLab/blob/main/.github/workflows/forge-tests.yml# DeFiHackLab 🔐
[](https://github.com/Pawar7349/DeFiHackLab)
[](https://soliditylang.org)
[](https://foundry.sh)
[](https://opensource.org/licenses/MIT)
[](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 开发和智能合约安全相关的职位——初级审计员、协议开发人员或安全研究员。
## [](https://github.com/Pawar7349)
[](https://x.com/PratikP43786754)
[](https://www.linkedin.com/in/pratik-pawar-600731237/)
## 许可证
MIT
标签:CISA项目, DeFi安全, EVM, Foundry, Solidity, Web3安全, 交易回放, 以太坊, 加密货币, 区块链, 合约自毁, 复现环境, 安全测试, 攻击性安全, 整数溢出, 智能合约漏洞, 治理攻击, 漏洞修复, 网络安全培训, 访问控制缺陷, 重入攻击, 闪电贷攻击, 预言机操纵