name: 入口点分析器 description: 分析智能合约代码库,以识别状态改变的入口点,用于安全审计。检测可外部调用的修改状态的函数,按访问级别(公开、管理员、角色限制、仅合约)分类,并生成结构化审计报告。排除视图/纯/只读函数。用于审计智能合约(Solidity、Vyper、Solana/Rust、Move、TON、CosmWasm)或当被要求查找入口点、审计流程、外部函数、访问控制模式或特权操作时。 allowed-tools:
- 读取
- Grep
- Glob
- Bash
入口点分析器
系统性地识别智能合约代码库中所有状态改变的入口点,以指导安全审计。
何时使用
使用此技能当:
- 开始智能合约安全审计以映射攻击面
- 被要求查找入口点、外部函数或审计流程
- 分析代码库中的访问控制模式
- 识别特权操作和角色限制函数
- 建立对哪些函数可以修改合约状态的理解
何时不使用
不要使用此技能用于:
- 漏洞检测(使用审计上下文构建或特定领域审计)
- 编写利用POC(使用Solidity POC构建器)
- 代码质量或气体优化分析
- 非智能合约代码库
- 分析只读函数(此技能排除它们)
范围:仅状态改变函数
此技能专注于可修改状态的函数。排除:
| 语言 | 排除模式 |
|---|---|
| Solidity | view、pure 函数 |
| Vyper | @view、@pure 函数 |
| Solana | 无 mut 账户引用的函数 |
| Move | 非入口 public fun(仅模块可调用) |
| TON | get 方法(FunC)、只读接收器(Tact) |
| CosmWasm | query 入口点及其处理程序 |
为什么排除只读函数? 它们不能直接导致资金损失或状态损坏。虽然它们可能泄露信息,但审计的主要焦点是可能改变状态的函数。
工作流程
- 检测语言 - 从文件扩展名和语法识别合约语言
- 使用工具(如果可用) - 对于Solidity,检查Slither是否可用并使用它
- 定位合约 - 查找所有合约/模块文件(如果指定,应用目录过滤器)
- 提取入口点 - 解析每个文件以查找可外部调用、状态改变的函数
- 分类访问 - 按访问级别分类每个函数
- 生成报告 - 输出结构化Markdown报告
Slither集成(Solidity)
对于Solidity代码库,Slither可以自动提取入口点。在手动分析之前:
1. 检查Slither是否可用
which slither
2. 如果检测到Slither,运行入口点打印机
slither . --print entry-points
这将输出所有状态改变入口点的表格,包括:
- 合约名称
- 函数名称
- 可见性
- 应用的修饰符
3. 使用Slither输出作为基础
- 解析Slither输出表格以填充分析
- 与手动检查交叉引用以进行访问控制分类
- Slither可能错过某些模式(回调、动态访问控制)— 用手动审查补充
- 如果Slither失败(编译错误、不支持功能),则回退到手动分析
4. 当Slither不可用时
如果 which slither 返回无,则使用语言特定参考文件进行手动分析。
语言检测
| 扩展名 | 语言 | 参考 |
|---|---|---|
.sol |
Solidity | {baseDir}/references/solidity.md |
.vy |
Vyper | {baseDir}/references/vyper.md |
.rs + Cargo.toml 带 solana-program |
Solana(Rust) | {baseDir}/references/solana.md |
.move + Move.toml 带 edition |
{baseDir}/references/move-sui.md | |
.move + Move.toml 带 Aptos |
{baseDir}/references/move-aptos.md | |
.fc、.func、.tact |
TON(FunC/Tact) | {baseDir}/references/ton.md |
.rs + Cargo.toml 带 cosmwasm-std |
CosmWasm | {baseDir}/references/cosmwasm.md |
根据检测到的语言加载适当的参考文件。
访问分类
将每个状态改变入口点分类到以下类别之一:
1. 公开(无限制)
任何人都可调用,无限制的函数。
2. 角色限制
限于特定角色的函数。常见检测模式:
- 显式角色名称:
admin、owner、governance、guardian、operator、manager、minter、pauser、keeper、relayer、lender、borrower - 角色检查模式:
onlyRole、hasRole、require(msg.sender == X)、assert_owner、#[access_control] - 当角色模糊时,标记为**“限制(需审查)”**,并注明限制模式
3. 仅合约(内部集成点)
仅其他合约可调用,非EOA。指标:
- 回调:
onERC721Received、uniswapV3SwapCallback、flashLoanCallback - 带合约调用者检查的接口实现
- 如果
tx.origin == msg.sender则回退的函数 - 跨合约钩子
输出格式
生成具有以下结构的Markdown报告:
# 入口点分析:[项目名称]
**分析时间**:[时间戳]
**范围**:[分析的目录或“完整代码库”]
**语言**:[检测到的语言]
**焦点**:仅状态改变函数(排除view/pure)
## 摘要
| 类别 | 数量 |
|----------|-------|
| 公开(无限制) | X |
| 角色限制 | X |
| 限制(需审查) | X |
| 仅合约 | X |
| **总计** | **X** |
---
## 公开入口点(无限制)
任何人都可调用的状态改变函数—优先用于攻击面分析。
| 函数 | 文件 | 备注 |
|----------|------|-------|
| `functionName(params)` | `path/to/file.sol:L42` | 简要备注(如相关) |
---
## 角色限制入口点
### 管理员 / 所有者
| 函数 | 文件 | 限制 |
|----------|------|-------------|
| `setFee(uint256)` | `Config.sol:L15` | `onlyOwner` |
### 治理
| 函数 | 文件 | 限制 |
|----------|------|-------------|
### 监护人 / 暂停者
| 函数 | 文件 | 限制 |
|----------|------|-------------|
### 其他角色
| 函数 | 文件 | 限制 | 角色 |
|----------|------|-------------|------|
---
## 限制(需审查)
具有需要手动验证的访问控制模式的函数。
| 函数 | 文件 | 模式 | 为什么审查 |
|----------|------|---------|------------|
| `execute(bytes)` | `Executor.sol:L88` | `require(trusted[msg.sender])` | 动态信任列表 |
---
## 仅合约(内部集成点)
仅其他合约可调用的函数—有助于理解信任边界。
| 函数 | 文件 | 预期调用者 |
|----------|------|-----------------|
| `onFlashLoan(...)` | `Vault.sol:L200` | 闪电贷提供者 |
---
## 分析的文件
- `path/to/file1.sol` (X 状态改变入口点)
- `path/to/file2.sol` (X 状态改变入口点)
过滤
当用户指定目录过滤器时:
- 仅分析该路径内的文件
- 在报告标题中注明过滤器
- 示例:“仅分析
src/core/” → 范围 =src/core/
分析指南
- 彻底:不要跳过文件。每个状态改变的可外部调用函数都重要。
- 保守:当不确定访问级别时,标记为审查而非误分类。
- 跳过只读:排除
view、pure及等效只读函数。 - 注意继承:如果函数的访问控制来自父合约,注明。
- 跟踪修饰符:列出应用于每个函数的所有访问相关修饰符/装饰器。
- 识别模式:查找常见模式,如:
- 初始化函数(通常在首次调用时无限制)
- 升级函数(高特权)
- 紧急/暂停函数(监护人级别)
- 费用/参数设置函数(管理员级别)
- 代币转移和批准(通常公开)
按协议类型的常见角色模式
| 协议类型 | 常见角色 |
|---|---|
| DEX | owner、feeManager、pairCreator |
| 借贷 | admin、guardian、liquidator、oracle |
| 治理 | proposer、executor、canceller、timelock |
| NFT | minter、admin、royaltyReceiver |
| 桥接 | relayer、guardian、validator、operator |
| 金库/收益 | strategist、keeper、harvester、manager |
应拒绝的简化
分析入口点时,拒绝这些快捷方式:
- “这个函数看起来标准” → 仍分类它;标准函数可能有非标准访问控制
- “修饰符名称清晰” → 验证修饰符的实际实现
- “这显然是仅管理员” → 追踪实际限制;“显然”假设可能错过细微绕过
- “我会跳过回调” → 回调定义信任边界;始终包含
- “它不修改太多状态” → 任何状态改变都可能被利用;包含所有非view函数
错误处理
如果文件无法解析:
- 在报告的“分析警告”下注明
- 继续剩余文件
- 建议手动审查无法解析的文件