Musyg/vyper-access-control-audit
GitHub: Musyg/vyper-access-control-audit
一个展示 Vyper 智能合约访问控制漏洞完整审计流程的演示项目,包含可复现的 Foundry PoC 和已修复分支。
Stars: 0 | Forks: 0
# Vyper 访问控制演示安全审查

这是一个使用 Vyper 编写的智能合约安全审查的自包含演示:一个故意留下漏洞的 vault,其 `set_owner` 函数缺少了同级管理函数所具备的 owner 权限校验,由此导致的接管所有权和抽空资金操作(已通过通过的 [Foundry](https://book.getfoundry.sh) 概念验证证明),以及一个已消除相同场景的 `fixed` 分支。
## 为什么创建此仓库
任何人都可以在个人简介中写上“我审计智能合约”。本仓库展示的是实际工作:一个目标、一个具体的发现、一个可执行的证明,以及一个经过验证的修复。如果不能复现,就等于没有完成。
## 仓库结构
本次审查分布在两个分支中:
| 分支 | 内容 | 绿色的 `forge test` 意味着 |
|--------|----------|---------------------------------|
| `master` | 存在漏洞的 vault 及利用该漏洞的 PoC | 任何账户都能夺取所有权并抽空余额 |
| `fixed` | 已修复的 vault 及相同场景 | 接管操作会 revert 且余额保持不变 |
- `src/Vault.vy`,接受审查的合约(Vyper 0.4.3)
- `test/Vault.poc.t.sol`,概念验证(Foundry,基于 Vyper 合约的 Solidity 测试套件)
- `Vyper_Access_Control_Review.pdf`,完整的书面报告
## 发现
| ID | 严重程度 | 摘要 |
|----|----------|---------------------------------------------------------------|
| H-01 | 高 | 未受保护的所有权转移。`set_owner` 缺少了 `pause` 和 `withdraw_all` 都强制执行的 `assert msg.sender == self.owner` 校验。攻击者调用 `set_owner(attacker)` 成为 owner,然后调用受正常保护的 `withdraw_all` 取走资金。同级函数之间的这种不对称性正是 bug 所在。 |
`master` 分支上的 PoC 数据:受害者存入 10 ether。攻击者调用 `set_owner` 夺取所有权,然后调用 `withdraw_all`,拿走全部 10 ether。在 `fixed` 分支上,接管操作会 revert,所有权得以保留,并且 vault 继续持有其 10 ether。
## 复现
需要安装 [Foundry](https://book.getfoundry.sh/getting-started/installation) 并在 `PATH` 中配置
[Vyper](https://docs.vyperlang.org) 0.4.x 编译器(`pip install vyper`),
Foundry 将调用它来编译 `.vy` 合约。
```
git clone https://github.com/Musyg/vyper-access-control-audit.git
cd vyper-access-control-audit
forge install
# master: 接管和 drain 成功
forge test -vv
# fixed: 相同的攻击被恢复
git checkout fixed
forge test -vv
```
## 修复方案
在 `set_owner` 中添加 owner 权限校验,使其与同级函数保持一致:
```
@external
def set_owner(new_owner: address):
assert msg.sender == self.owner, "not owner"
self.owner = new_owner
```
规则是机械化的:每个改变状态的管理入口点都必须强制执行相同的访问检查。当五个同级函数中有四个带有权限校验时,那个未受保护的例外就是审查发现的问题所在。
## 严重程度评级标准
高:未经授权的攻击者完全控制合约并抽空 100% 的余额。唯一的前提条件是 vault 持有资金,这也是它的正常状态。
标签:Foundry, Streamlit, Vyper, Web3安全, 智能合约, 漏洞PoC, 访问控制