unspecifiedcoder/invariant_suites

GitHub: unspecifiedcoder/invariant_suites

该项目提供了一套可复用的 Foundry 有状态 invariant 测试套件,用于对 ERC-4626 策略金库和 Compound-fork 借贷市场进行深入的模糊测试与漏洞复现。

Stars: 0 | Forks: 0

# Invariant Suites [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/unspecifiedcoder/invariant_suites/actions/workflows/test.yml) 专为 ERC-4626 策略金库和 Compound-fork 借贷市场定制的**有状态 invariant 测试套件**。 大多数审计依赖于人工审查和 Slither。我提供可用于生产环境的 Foundry invariant 测试——包含 handler、针对性的 invariant 以及可复现的 PoC——并根据您协议特定的 harvest、rebalance 和记账逻辑进行量身定制。 该套件可直接放入您现有的 Foundry 设置中。您的审计员可以直接继承它。在发布后,您的 CI 会在每次 commit 时运行它。 ## 包含内容 - **[`exploits/erc4626-inflation/`](exploits/erc4626-inflation/)** — 完整复现了经典的 ERC-4626 首批存款者膨胀攻击。包含确定性 PoC 以及自主 invariant fuzzer,可在 3 次调用的缩减序列上暴露该类 bug。 - **[`exploits/hundred-finance/`](exploits/hundred-finance/)** — 实时 fork 复现了 Hundred Finance Optimism 空市场捐赠攻击(2023 年 4 月,损失约 680 万美元)。单次捐赠造成了 6.5×10⁹ 的汇率膨胀,该结果基于真实的 2023 年 4 月 15 日 fork 状态进行断言。 - **[`templates/erc4626-base/`](templates/erc4626-base/)** — 适用于任何 ERC-4626 策略金库审计的可重用基础 handler 和 invariant。抽象基类;针对不同协议,只需继承并重写 `_fundActor` + `maxAmount()` 即可。 - **[`templates/lending-class/`](templates/lending-class/)** — 适用于任何 Compound-v2-fork 借贷市场审计的可重用基础 handler 和 invariant。结构相同;适用于借贷领域。 ## 在本地运行 ``` git clone https://github.com/unspecifiedcoder/invariant_suites.git cd invariant_suites forge install forge test ``` 在全新克隆(未配置 RPC)时的预期最终状态: ``` 7 passed; 2 failed; 1 skipped ``` **这两个失败是故意的** —— 它们是 invariant 成功捕获了各自预先植入的 bug: - `ToyVault` 上的 `invariant_vaultSolvent` — 在 2 次调用的缩减序列上捕获了植入的“忘记递减 `totalShares`”bug。 - `VulnerableVault` 上的 `invariant_noZeroShareDeposit` — 在 3 次调用的缩减序列上捕获了经典的 ERC-4626 膨胀攻击。 **被跳过** 的是 Hundred Finance 的 fork 测试 —— 当未设置 `OPTIMISM_RPC_URL` 时,它会自动跳过。要运行它,请将环境变量放入本地 `.env` 文件(已被 gitignore 忽略)中: ``` echo "OPTIMISM_RPC_URL=https://opt-mainnet.g.alchemy.com/v2/" > .env forge test ``` 设置好环境变量后,您将看到 `10 passed; 2 failed; 0 skipped`。 ## 参与项目能产出什么 针对您协议的 invariant 套件服务将交付以下内容: 1. **一个 handler 合约**,能够执行您协议的实际状态机 —— 包括偏离标准基础合约的定制化 harvest、rebalance 和奖励分配路径。 2. **一套针对性的 invariant 集**,用于编码您协议的实际安全属性 —— 而不是通用的 ERC-4626 属性(这些已经包含在此处的模板中了)。 3. **针对每个发现的可复现 PoC** —— 编写为独立的 `forge test` 用例,您的审计员和 CI 日后可以永远运行它们。 服务结束时,该套件将保留在您的代码库中。您的审计员将继承它。您的 CI 将持续运行它。 ## 仓库结构 ``` src/ Solidity reference implementations ToyVault.sol 1:1 ETH vault with one planted bug (pedagogical) VulnerableVault.sol Naive ERC-4626 (no inflation mitigation) test/ Foundry tests ToyVault.t.sol Unit tests + PoC for the ToyVault bug ToyVault.invariant.t.sol Invariant fuzzer for ToyVault ToyVaultHandler.sol Handler for the ToyVault fuzzer Inflation.t.sol Deterministic PoC of the ERC-4626 inflation attack Inflation.invariant.t.sol Invariant fuzzer for the inflation attack VulnerableVaultHandler.sol Handler for the inflation fuzzer HundredFinance.fork.t.sol Live-fork reproduction (Optimism, block 90761917) interfaces/ICToken.sol Minimal Compound-v2 cToken interface mocks/MockERC20.sol Minimal mintable ERC-20 for testing templates/ Reusable starting points erc4626-base/ For ERC-4626 strategy-vault audits lending-class/ For Compound-fork lending market audits exploits/ Case-study writeups erc4626-inflation/ ERC-4626 first-depositor inflation hundred-finance/ Hundred Finance Optimism (April 2023) ``` ## 联系方式 如有审计/预审计咨询:请提交一个 issue,或在 Twitter 上私信。
标签:DeFi, Foundry, LNA, Solidity, 区块链安全, 智能合约审计, 漏洞复现