DeFiVulnLabs靶场全系列详解(三十一)数字转型时候向下溢出

admin 2025年4月29日00:14:16评论3 views字数 1255阅读4分11秒阅读模式
01
前言
此内容仅作为展示Solidity常见错误的概念证明。它严格用于教育目的,不应被解释为鼓励或认可任何形式的非法活动或实际的黑客攻击企图。所提供的信息仅供参考和学习,基于此内容采取的任何行动均由个人全权负责。使用这些信息应遵守适用的法律、法规和道德标准。
DeFiVulnLabs一共有47个漏洞实验,包括各种经典的合约漏洞和一些少见的可能造成安全问题的不安全代码,本系列将逐一解析每个漏洞,包括官方的解释和自己的理解。
02
数字转型时候向下溢出
漏洞解析:
这个案例也是溢出的一种,uint256变成了uint8,我们都知道在solidity 8.0+版本中,普通的上溢和下溢已经默认会进行检查,但是实际上在8.0+还是存在一种特殊类型的溢出,就是如果是这种强制类型转换的,还是会出现溢出问题。
代码解析:
以下合约方法很简单,主要就是在convert方法里里存在由uint256到uint8的转型,这里出现了问题。
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract SimpleBank {    mapping(address => uintprivate balances;function  convert(uint256 amountpublic{        uint8 balance = uint8(amount);        balances[msg.sender] = balance;    }function  common(uint256 amountpublic{        uint256 balance = amount;        balances[msg.sender] = balance;    }function  getBalance() publicviewreturns (uint) {        return balances[msg.sender];    }}
如下所示,传入的是10000000,最后的值却是128(Uint8最大值是255)
DeFiVulnLabs靶场全系列详解(三十一)数字转型时候向下溢出

可以看到uint256没有什么问题,但是调用了convert函数从uint256到uint8就产生了溢出。

DeFiVulnLabs靶场全系列详解(三十一)数字转型时候向下溢出
03
如何修复该问题

修复的方式就是再次引入外部的方法进行检查:safeMath

import "@openzeppelin/contracts/utils/math/SafeCast.sol";

functionconvert(uint256 amount) public{    uint8 balance = SafeCast.toUint8(amount);    balances[msg.sender] = balance;}
DeFiVulnLabs靶场全系列详解(三十一)数字转型时候向下溢出
此时就会调用失败了。
虽然但是一般人也不会这样写吧?把uint256转换为uint8
04
感谢关注
个人语雀账号:https://www.yuque.com/iceqaq

原文始发于微信公众号(Ice ThirdSpace):DeFiVulnLabs靶场全系列详解(三十一)数字转型时候向下溢出

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月29日00:14:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DeFiVulnLabs靶场全系列详解(三十一)数字转型时候向下溢出https://cn-sec.com/archives/4009629.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息