智能合约审计之BurnFrom设计缺陷
字数 909 2025-08-22 12:22:59
智能合约审计之BurnFrom设计缺陷详解
漏洞概述
burnFrom函数是ERC20代币标准中的一个重要功能,允许被授权用户操作授权用户的资产。该函数在实现时存在几个关键设计缺陷:
- 授权额度未更新:在销毁授权用户资产后未同步更新授权额度
- 缺乏溢出检查:未进行溢出/下溢防护
- 特权后门:可能存在特权账户滥用风险
漏洞原理分析
标准实现要求
规范的burnFrom函数应完成以下操作:
- 检查调用者是否有足够的授权额度
- 从授权用户地址扣除指定数量的代币
- 更新代币总量
- 更新授权转账额度(关键遗漏点)
- 进行溢出/下溢防护
典型漏洞代码特征
function burnFrom(address account, uint256 amount) public {
require(amount <= allowance[account][msg.sender], "Burn amount exceeds allowance");
balanceOf[account] -= amount; // 扣除账户余额
totalSupply -= amount; // 更新总供应量
// 缺少 allowance[account][msg.sender] -= amount; 更新授权额度
emit Transfer(account, address(0), amount);
}
漏洞复现步骤
环境准备
- 使用Remix IDE部署有缺陷的合约
- 准备测试账户:
- Owner: 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2
- 用户A: 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db
- 用户B: 0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB
复现过程
- Owner向用户A和用户B各转账1000个代币
- 用户A授权用户B可操作200个代币
- 用户B调用
burnFrom销毁用户A的200个代币 - 漏洞表现:授权额度仍显示为200(未减少)
- 用户B可重复调用
burnFrom继续销毁用户A的代币
安全建议
1. 使用OpenZeppelin标准实现
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
2. 正确实现burnFrom函数
function burnFrom(address account, uint256 amount) public virtual {
_spendAllowance(account, _msgSender(), amount); // 更新授权额度
_burn(account, amount); // 执行销毁操作
}
3. 关键防护措施
- 必须使用SafeMath或Solidity 0.8+的自动溢出检查
- 实现完整的授权额度更新逻辑
- 添加必要的事件触发
- 进行充分的输入验证
审计要点
审计ERC20代币合约时应特别检查:
burnFrom函数是否更新了allowance- 所有算术运算是否有溢出/下溢防护
- 授权逻辑是否正确实现
- 事件触发是否完整
- 函数可见性设置是否合理
总结
burnFrom函数的设计缺陷可能导致授权系统被绕过,造成资产非预期销毁。开发者应严格遵循OpenZeppelin等经过验证的实现标准,审计人员则需特别关注授权额度更新和溢出防护等关键点。