区块链智能合约美链攻击分析以及安全库的使用(代码片段)

little_stupid_child little_stupid_child     2022-12-28     415

关键词:

1.美链攻击过程

美链代币BEC为发行在以太坊上的ERC20代币,其具体合约的代码在该链接中合约代码
向美链发起攻击的交易链接为攻击交易hash

function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) 
    uint cnt = _receivers.length;
    uint256 amount = uint256(cnt) * _value;
    require(cnt > 0 && cnt <= 20);
    require(_value > 0 && balances[msg.sender] >= amount);

    balances[msg.sender] = balances[msg.sender].sub(amount);
    for (uint i = 0; i < cnt; i++) 
        balances[_receivers[i]] = balances[_receivers[i]].add(_value);
        Transfer(msg.sender, _receivers[i], _value);
    
    return true;

美链攻击的具体流程分为以下四步:
1.首先构造一个_value值,使得_receivers.len() * _value产生向上溢出,结果为一个极小值amount。比如使用_receivers.len()为2,_value值为2**255,那么在上述代码中计算得到的amount值为0。
2.amount,value通过require验证。
3.在msg.sender中减去amount数量的代币。
4.为每个_receivers账户增加value数量的代币。
其中value为一个极大值,相当于对美链的BEC代币进行了增发,对应的_receivers账户可以获取大量BECtoken。

2.solidity中上溢与下溢

在solidity中变量进行+、-、*运算时会产生溢出,如加法运算和乘法运算会产生向上溢出,减法运算产生向下溢出。如2**255变量乘以2,获得的结果为0。具体溢出情况可参考以下合约代码:

pragma solidity 0.4.20;
contract TestFlow 
    uint256 public zero = 0;
    uint256 public max = 2**256 - 1;
    uint256 public mm = 2**255;

    function subUnderFlow() public constant returns (uint) 
        uint256 a =  zero - 1;
        return a;
    

    function addOverFlow() public constant returns (uint) 
        uint256 a =  max + 1;
        return a;
    

    function mulOverFlow() public constant returns (uint) 
        uint256 a =  mm * 2;
        return a;
    

3.定义安全库

在对数字进行运算时,要采用安全函数,保证结果正确且不发生溢出。安全的数学运算库的使用如下所示。
第一步:导入SafeMath库文件

pragma solidity >=0.4.22 <0.6.0;
 
/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
 
library SafeMath 
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) 
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) 
            return 0;
        
 
        uint256 c = a * b;
        require(c / a == b);
 
        return c;
    
 
    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) 
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
 
        return c;
    
 
    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) 
        require(b <= a);
        uint256 c = a - b;
 
        return c;
    
 
    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) 
        uint256 c = a + b;
        require(c >= a);
 
        return c;
    
 
    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) 
        require(b != 0);
        return a % b;
    

第二步,引用

pragma solidity >=0.4.22 <0.6.0;
 
import "./safemath.sol";
 
contract jisuan
    uint a=2;
    uint b=5;
    uint c=8;
    //引入safemath库
    using SafeMath for uint256;
    
    //加法
    function addNum()public view returns(uint d)
        d=a.add(b);
    
    //减法
    function subNum()public view returns(uint d)
        d=b.sub(a);
    
    //乘法
    function mulNum()public view returns(uint d)
        d=a.mul(b);
    
    //除法
    function divNum()public view returns(uint d)
        d=c.div(a);
    

区块链存在的问题,智能合约漏洞分析

目录区块链存在的问题数据存储与交互隐私保护资源分配漏洞攻击分叉攻击 查看详情

区块链智能合约安全重入攻击(re-entrancyattack)daoincident(代码片段)

泄露资金的合约合约有多种导致资金泄露的方式。例如,合约可能将资金转给非指定的收款人;或者将超额资金转给合法收款人等。以下展示了对DAO合约的攻击,该攻击者借此盗取了6000万美元。大家可以观察到,... 查看详情

区块链智能合约安全对关键状态变量的意外更改(代码片段)

合约有状态变量,其中一些可以在合约创建时由创建者实例化,这些在之后是不能更改的,而那些在创建合约时没有实例化的内容可以在之后修改。由于这些变量可以在之后更改,因此如果该变量对合约的安全性... 查看详情

区块链智能合约安全对关键状态变量的意外更改(代码片段)

合约有状态变量,其中一些可以在合约创建时由创建者实例化,这些在之后是不能更改的,而那些在创建合约时没有实例化的内容可以在之后修改。由于这些变量可以在之后更改,因此如果该变量对合约的安全性... 查看详情

区块链|预言机从零开始使用chainlink预言机-智能合约中使用更安全的随机数-代码实战(代码片段)

智能合约中使用更安全的随机数(代码实战篇)Chainlink最近推出一款革命性的产品,VRF—VerifiableRandomFunction可验证随机数,给智能合约带来了真正安全的随机数。本文我们就来介绍一下如何在智能合约中使用VRF吧。我们先简要介... 查看详情

区块链技术开发智能合约与图像存储在外部存储器ipfs(interplanetaryfilesystem)

专栏:【区块链技术开发】前期文章:【区块链技术开发】十个比较流行的以太坊智能合约开发框架【区块链技术开发】剖析区块链Ganache模拟器工具及其智能合约部署区块链的查询方式【区块链技术开发】基于Web3.js以太坊网络... 查看详情

区块链游戏fomo3d智能合约核心分析

最近做一个区块链的项目,需要彻底分析FOMO3D的智能合约,顺便熟悉一下区块链的开发流程。首先为了能跑FOMO3D的智能合约我尝试了truffle+galanche,对我来说不太理想,我就自己用python+solc做了一个类似的框架。可以编译部署发布合... 查看详情

区块链项目实战-使用以太坊/智能合约solidity,全栈开发区块链借贷记账小应用,含完整源码(代码片段)

本文使用区块链平台以太坊+智能合约实现一个区块链记账的功能,具体为:借款人和贷款人以及数额被记录在区块链中。使用区块链地址来表示借款人或者贷款人。若一个借款人多次向一个贷款人借钱,更新所有... 查看详情

区块链里的智能合约安全

...我写这遍文章的时候,距离EOS曝出漏洞已经有三天时间,区块链行业热点来的快去的也快,每每出现安全相关问题,都会给整个行业带来震荡。自从我开始关注区块链行业以来,安全事故有增无减,交易平台、智能合约、共识机... 查看详情

区块链里的智能合约安全

...我写这遍文章的时候,距离EOS曝出漏洞已经有三天时间,区块链行业热点来的快去的也快,每每出现安全相关问题,都会给整个行业带来震荡。自从我开始关注区块链行业以来,安全事故有增无减,交易平台、智能合约、共识机... 查看详情

区块链及智能合约简介&安全相关介绍-1-区块链概念

rua,明天要讲课,贴一下第一次梳理的内容2333。区块链入门。blockchain特点分布式去中心化无须信任系统不可篡改和加密安全性去中心化没有中心节点区块链是一个只能查找和插入,没有管理员的非关系型分布式数据库。主要作... 查看详情

区块链(代码片段)

介绍区块链,搭建私链,智能合约以及开发DAPP。概念用人类的语言讲什么是区块链、挖矿、智能合约区块链公有链和私有链、联盟链、许可链区块链主流开源技术体系介绍什么是区块链广义:区块链是分布式数据存储,点对点... 查看详情

知道创宇区块链安全实验室|oneringfinance闪电贷攻击事件分析(代码片段)

前言北京时间2022年3月22日,知道创宇区块链安全实验室监测到Fantom生态稳定币收益优化器OneRingFinance遭到闪电贷攻击,黑客窃取逾145万美元。分析攻击事件如下图所示,该次攻击事件的问题点在于OneRingFinance直接使用... 查看详情

解读区块链智能合约!

  解读区块链智能合约!  区块链和智能合约技术的广泛适用性使得该领域参与者按照各自所在学科来解读它,因此现在还缺乏统一的术语定义,对于一个发展如此快速的技术领域来说是一大缺憾。本文作者JoshStark是律师和... 查看详情

solana区块链智能合约开发简要流程(代码片段)

Solana区块链智能合约开发简要流程Solana区块链是当今市值第5的区块链,已经有很多知名生态准备部署在Solana上。相比于类以太坊(EVM)区块链来讲,Solana上智能合约开发(叫Program)存在一定的门槛,... 查看详情

第157篇合约安全-随机数(代码片段)

...要用到随机数。目前来说常见的随机数获取有两种:使用区块变量生成随机数,使用预言机来生成随机数。使用区块变量生成随机数,常见的区块变量有:block.basefee(uint):当前区块的基本费用block.chainid(uint):当前链idblock.coinbase... 查看详情

第157篇合约安全-随机数(代码片段)

...要用到随机数。目前来说常见的随机数获取有两种:使用区块变量生成随机数,使用预言机来生成随机数。使用区块变量生成随机数,常见的区块变量有:block.basefee(uint):当前区块的基本费用block.chainid(uint):当前链idblock.coinbase... 查看详情

暂停交易?erc20合约整数溢出安全漏洞案例技术分析(一)(代码片段)

区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地作者:吴寿鹤,《区块链开发实战——以太坊关键技术与案例分析》的第一作者,《区块链开发实战——HyperledgerFabric关键技术与案例分析》联合作者... 查看详情