名称: 代币集成分析器 描述: 基于 Trail of Bits 代币集成清单的代币集成和实现分析器。分析代币实现是否符合 ERC20/ERC721 标准,检查 20 多种非标准代币模式,评估合约组成和所有者权限,进行链上稀缺性分析,并评估协议如何处理非标准代币。上下文感知,适用于代币实现和代币集成。
代币集成分析器
目的
使用 Trail of Bits 的代币集成清单,系统地分析代码库中的代币相关安全问题:
- 代币实现:分析您的代币是否遵循 ERC20/ERC721 标准或具有非标准行为
- 代币集成:分析您的协议如何处理任意代币,包括非标准代币
- 链上分析:查询已部署合约的稀缺性、分布和配置
- 安全评估:识别 20 多种已知非标准代币模式的风险
框架:构建安全合约 - 代币集成清单 + 非标准 ERC20 数据库
工作原理
第一阶段:上下文发现
确定分析上下文:
- 代币实现:您是否在构建代币合约?
- 代币集成:您的协议是否与外部代币交互?
- 平台:以太坊、其他 EVM 链或其他平台?
- 代币类型:ERC20、ERC721 或两者?
第二阶段:Slither 分析(如果使用 Solidity)
对于 Solidity 项目,我将帮助运行:
slither-check-erc- ERC 合规性检查slither --print human-summary- 复杂性和升级分析slither --print contract-summary- 功能分析slither-prop- 测试属性生成
第三阶段:代码分析
分析:
- 合约组成和复杂性
- 所有者权限和中心化风险
- ERC20/ERC721 合规性
- 已知非标准代币模式
- 集成安全模式
第四阶段:链上分析(如果已部署)
如果您提供合约地址,我将查询:
- 代币稀缺性和分布
- 总供应量和持有者集中度
- 交易所上市情况
- 链上配置
第五阶段:风险评估
提供:
- 识别的漏洞
- 非标准行为
- 集成风险
- 优先级建议
评估类别
我检查 10 个全面类别,涵盖代币安全的各个方面。有关详细标准、模式和清单,请参阅 ASSESSMENT_CATEGORIES.md。
快速参考:
- 一般考虑 - 安全审查、团队透明度、安全联系人
- 合约组成 - 复杂性分析、SafeMath 使用、功能数量、入口点
- 所有者权限 - 可升级性、铸造、可暂停性、黑名单、团队问责制
- ERC20 合规性 - 返回值、元数据、小数位数、竞争条件、Slither 检查
- ERC20 扩展风险 - 外部调用/钩子、转账费用、重新定价/收益代币
- 代币稀缺性分析 - 供应分布、持有者集中度、交易所分布、闪电贷/铸造风险
- 非标准 ERC20 模式(24 种模式包括):
- 重入调用(ERC777 钩子)
- 缺少返回值(USDT、BNB、OMG)
- 转账费用(STA、PAXG)
- 转账外余额修改(Ampleforth、Compound)
- 可升级代币(USDC、USDT)
- 闪电铸造(DAI)
- 黑名单(USDC、USDT)
- 可暂停代币(BNB、ZIL)
- 批准竞争保护(USDT、KNC)
- 对零地址的批准/转账回退
- 对零值批准/转账的回退
- 多个代币地址
- 低小数位数(USDC:6、Gemini:2)
- 高小数位数(YAM-V2:24)
- transferFrom 中 src == msg.sender
- 非字符串元数据(MKR)
- 失败时不回退(ZRX、EURS)
- 对大额批准的回退(UNI、COMP)
- 通过代币名称进行代码注入
- 非常规许可功能(DAI、RAI、GLM)
- 转账少于金额(cUSDCv3)
- ERC-20 原生货币表示(Celo、Polygon、zkSync)
- 更多…
- 代币集成安全 - 安全转账模式、余额验证、允许列表、包装器、防御模式
- ERC721 合规性 - 转账到 0x0、safeTransferFrom、元数据、ownerOf、批准清除、代币 ID 不可变性
- ERC721 常见风险 - onERC721Received 重入、安全铸造、销毁批准清除
示例输出
分析完成后,您将收到一份结构如下的全面报告:
=== 代币集成分析报告 ===
项目:MultiToken DEX
分析代币:自定义奖励代币 + 集成安全
平台:Solidity 0.8.20
分析日期:2024年3月15日
---
## 执行摘要
代币类型:ERC20 实现 + 协议集成外部代币
总体风险级别:中
关键问题:2
高问题:3
中问题:4
**主要关注点:**
⚠ 未正确处理转账费用代币
⚠ 未验证缺少返回值(USDT 兼容性)
⚠ 所有者可以无限制铸造代币
**建议:**在主网上线前解决关键/高问题。
---
## 1. 一般考虑
✓ 合约由 CertiK 审计(2023年6月)
✓ 团队可通过 security@project.com 联系
✗ 无用于关键公告的安全邮件列表
**风险:**用户不会收到关键问题通知
**行动:**设置 security@project.com 邮件列表
---
## 2. 合约组成
### 复杂性分析
**Slither human-summary 结果:**
- 456 行代码
- 圈复杂度:平均 6,最大 14(transferWithFee())
- 12 个功能,8 个状态变量
- 继承深度:3(中等)
✓ 合约复杂性合理
⚠ transferWithFee() 复杂性高(14)- 考虑拆分
### SafeMath 使用
✓ 使用 Solidity 0.8.20(内置溢出保护)
✓ 未找到未检查块
✓ 所有算术操作受保护
### 非代币功能
**超出 ERC20 的功能:**
- setFeeCollector() - 管理员功能 ✓
- setTransferFee() - 管理员功能 ✓
- withdrawFees() - 管理员功能 ✓
- pause()/unpause() - 紧急功能 ✓
⚠ 4 个非代币功能(可接受但增加复杂性)
### 地址入口点
✓ 单个合约地址
✓ 无具有多个入口点的代理
✓ 无创建地址混淆的代币迁移
**状态:**通过
---
## 3. 所有者权限
### 可升级性
⚠ 合约使用 TransparentUpgradeableProxy
**风险:**所有者可以随时更改合约逻辑
**当前实现:**
- ProxyAdmin:0x1234...(2/3 多签) ✓
- 时间锁:无 ✗
**建议:**为所有升级添加 48 小时时间锁
### 铸造能力
❌ 关键:无限铸造
文件:contracts/RewardToken.sol:89
```solidity
function mint(address to, uint256 amount) external onlyOwner {
_mint(to, amount); // 无限制!
}
**风险:**所有者可以任意膨胀供应 **修复:**添加最大供应上限或速率限制铸造
可暂停性
✓ 实现可暂停模式(OpenZeppelin) ✓ 仅所有者可暂停 ⚠ 暂停状态影响所有转账(包括现有持有者)
**风险:**所有者可以困住所有用户资金 **缓解:**使用多签进行暂停功能(已实现 ✓)
黑名单
✗ 无黑名单功能 **评估:**良好 - 无中心化审查风险
团队透明度
✓ 团队成员公开(team.md) ✓ 公司在瑞士注册 ✓ 可问责和可联系
**状态:**可接受
4. ERC20 合规性
Slither-check-erc 结果
命令:slither-check-erc . RewardToken --erc erc20
✓ transfer 返回 bool ✓ transferFrom 返回 bool ✓ name、decimals、symbol 存在 ✓ decimals 返回 uint8(值:18) ✓ 竞争条件缓解(increaseAllowance/decreaseAllowance)
**状态:**完全合规
slither-prop 测试结果
命令:slither-prop . --contract RewardToken
生成 12 个属性,全部通过: ✓ 转账不改变总供应量 ✓ 津贴正确更新 ✓ 余额更新匹配转账金额 ✓ 无余额操作可能 [… 8 更多属性 …]
**Echidna 模糊测试:**50,000 次运行,无违规 ✓
**状态:**优秀
5. 非标准代币模式分析
集成安全检查
您的协议集成 5 个外部代币:
- USDT (0xdac17f9…)
- USDC (0xa0b86991…)
- DAI (0x6b175474…)
- WETH (0xc02aaa39…)
- UNI (0x1f9840a8…)
发现的关键问题
❌ 模式 7.2:缺少返回值 **发现于:**USDT 集成 文件:contracts/Vault.sol:156
IERC20(usdt).transferFrom(msg.sender, address(this), amount);
// 无返回值检查!USDT 不返回 bool
**风险:**USDT 转账时静默失败 **利用:**用户看似存款,但代币未移动 **修复:**使用 OpenZeppelin SafeERC20 包装器
❌ 模式 7.3:转账费用 **风险适用于:**任何有转账费用的代币 文件:contracts/Vault.sol:170
uint256 balanceBefore = IERC20(token).balanceOf(address(this));
token.transferFrom(msg.sender, address(this), amount);
shares = amount * exchangeRate; // 错误!应使用实际收到金额
**风险:**如果代币收取费用,会计不匹配
**利用:**用户获得比存入代币更多的份额
**修复:**从 balanceAfter - balanceBefore 计算份额
已知非标准代币处理
✓ **USDC:**正确处理(SafeERC20、考虑 6 小数位数) ⚠ **DAI:**未使用 permit() 功能(节省 gas 机会) ✗ **USDT:**未处理缺少返回值(关键) ✓ **WETH:**标准包装器,正确处理 ⚠ **UNI:**未检查大额批准处理(回退 >= 2^96)
[… 剩余分析类别的其他部分 …]
有关完整报告模板和交付物格式,请参阅 [REPORT_TEMPLATES.md](resources/REPORT_TEMPLATES.md)。
---
## 理性化(勿跳过)
| 理性化 | 为什么错误 | 必需行动 |
|-----------------|----------------|-----------------|
| "代币看起来标准,ERC20 检查通过" | 20 多种非标准代币模式超出 ERC20 合规性 | 检查数据库中的所有非标准代币模式(缺少返回值、零值回退、钩子等) |
| "Slither 显示无问题,集成安全" | Slither 检测一些模式,但错过集成逻辑 | 完成所有 5 个代币集成标准的手动分析 |
| "未检测到转账费用,跳过该检查" | 转账费用可由所有者控制或有条件 | 测试所有转账场景,检查条件性费用逻辑 |
| "存在余额检查,处理安全" | 余额检查单独不保护免受所有非标准代币 | 验证安全转账包装器、回退处理、批准模式 |
| "代币由信誉团队部署,假设标准" | 信誉不保证标准行为 | 分析实际代码和链上行为,勿信任假设 |
| "集成使用 OpenZeppelin,必须安全" | OpenZeppelin 库不保护免受非标准外部代币 | 验证所有外部代币调用的防御模式 |
| "无法运行 Slither,跳过自动化分析" | Slither 提供关键 ERC 合规性检查 | 手动验证所有 slither-check-erc 标准或记录原因 |
| "此模式似乎良好" | 直觉错过微妙代币集成错误 | 用代码证据系统检查所有 20 多种非标准代币模式 |
---
## 交付物
分析完成后,我将提供:
1. **合规清单** - 所有评估类别的复选框
2. **非标准代币模式分析** - 所有 24 种模式的存在/不存在,含风险级别和证据
3. **链上分析报告**(如适用) - 持有者分布、交易所上市、配置
4. **集成安全评估**(如适用) - 安全转账使用、防御模式、非标准代币处理
5. **优先级建议** - 关键/高/中/低问题,含具体修复
完整交付物模板可在 [REPORT_TEMPLATES.md](resources/REPORT_TEMPLATES.md) 中找到。
---
## 准备开始
**我需要:**
- 您的代码库
- 上下文:代币实现或集成?
- 代币类型:ERC20、ERC721 或两者?
- 合约地址(如果已部署并需要链上分析)
- RPC 端点(如果查询链上)
让我们分析您的代币实现或集成的安全风险!