首页
/ Foundry全课程F23项目中的抵押品赎回问题分析

Foundry全课程F23项目中的抵押品赎回问题分析

2025-06-12 15:47:37作者:魏侃纯Zoe

问题概述

在Foundry全课程F23项目的DSCEngine智能合约中,发现了一个与抵押品赎回功能相关的重要安全问题。该问题允许任何用户调用redeemCollateralredeemCollateralForDsc函数时传入未被允许的代币地址,可能导致严重的算术下溢错误。

问题详情

问题定位

在DSCEngine.sol合约中,两个关键函数redeemCollateralredeemCollateralForDsc缺少了对抵押代币地址的有效性检查。虽然合约中已经定义了isAllowedToken修饰器来验证代币是否被允许作为抵押品,但这两个函数并未应用此修饰器。

潜在风险

当用户传入一个未被允许的代币地址时,合约会尝试从s_collateralDeposited映射中减去赎回金额。由于该代币从未被存入,映射中的值为零,减法操作将导致算术下溢,触发Solidity的panic错误(错误代码0x11)。

技术影响

这种问题可能导致:

  1. 合约功能异常中断
  2. 用户资金操作失败
  3. 潜在的服务中断
  4. 合约状态不一致

修复方案

正确的做法是在这两个函数上添加isAllowedToken(tokenCollateralAddress)修饰器,确保只有被允许的代币才能用于赎回操作。修复后的函数签名应如下:

function redeemCollateralForDsc(
    address tokenCollateralAddress, 
    uint256 amountCollateral, 
    uint256 amountDscToBurn
) 
    external 
    moreThanZero(amountCollateral)
    isAllowedToken(tokenCollateralAddress)
{
    // 函数实现
}

function redeemCollateral(
    address tokenCollateralAddress, 
    uint256 amountCollateral
)
    external
    moreThanZero(amountCollateral)
    isAllowedToken(tokenCollateralAddress)
    nonReentrant
{
    // 函数实现
}

安全建议

在开发DeFi协议时,特别是涉及抵押品管理的系统,应当:

  1. 对所有输入参数进行严格验证
  2. 确保状态变更操作前的所有前置条件检查
  3. 使用修饰器来统一执行常见检查
  4. 编写全面的测试用例覆盖边界情况
  5. 考虑使用SafeMath库或Solidity 0.8+的内置安全检查

这个案例展示了即使是简单的参数验证遗漏也可能导致严重的合约故障,强调了智能合约开发中防御性编程的重要性。

登录后查看全文
热门项目推荐