美文网首页
以太坊智能合约安全问题总结

以太坊智能合约安全问题总结

作者: 剑有偏锋 | 来源:发表于2018-10-28 17:33 被阅读53次

    一 以太坊安全总览

    权限控制问题
    设计/业务逻辑错误
    算术精度导致的问题
    未作异常处理导致的问题
    伪随机数问题
    拒绝服务漏洞
    上/下溢漏洞
    重入漏洞
    变量覆盖漏洞
    假充值漏洞
    缺失的输入验证

    二 权限控制问题

    parity钱包被接管控制问题

    防止
    1 使用修饰符(onlyOwn) 或 require检查访问权限
    2 高权限控制设为内部才能访问
    3 增加冻结任意用户功能,当发现存在恶意账号是,可以冻结

    三 设计/业务逻辑错误

    争夺king游戏

    使用合约参加游戏
    解决方法:使用openzepplin的Address.sol来判断是否合约,isContract函数

    四 算术精度导致的问题

    以太坊没有浮点数(即运算结果会取整),当同时计算乘除时,先算乘法,后算除法。减少误差

    五 未作异常处理导致的问题

    在solidity中,如下方法时不会抛出异常的,只会返回true或false,因此武罗是否正常执行,都不会因此执行失败导致整个事务失败
    address.call,
    address.callcode()
    address.delegatecall(),
    address.send

    call/callcode/delegatecall/send单个语句异常,一样继续执行下面的语句
    解决
    使用require/assert/revert/throw机制即可

    六 伪随机数问题

    使用now block.number, tx.gasprice等作为seed实现的随机数,都是伪随机的,

    七 拒绝服务漏洞

    fomo3d事件
    加大gasLimit ,让别人的交易无法打包

    八 上/下溢漏洞

    BeautyChain事件
    SmartMesh事件

    uint/int上溢变小,下溢变大; 数组越界访问
    避免:引入SafeMath的方法,做上下限安全检查
    数组访问索引,币须检查大于0 (不可以变负数)

    九 重入漏洞

    The DAO事件
    SpankChain合约事件

    解决方法
    减少函数全局变量
    在转账的时候,减少余额,再执行发送事务

    十 变量覆盖漏洞

    struct和数组在局部变量中,默认是存放在storage中的,因此可以利用为定义的存储指针的问题,使用这个未定义的指针访问struct或数组。

    解决方法:
    定声明的时候马上定义临时变量。

    十一 假充值漏洞

    判断事务transfer的交易回执status字段返回true,判断充值成功。这个是有问题的。
    引发问题:如果攻击者使用这个事务没有异常(status字段返回true),实际上并没有进行充值

    十二 缺失的输入验证

    使用require前置检查(如余额>0等)。SafeMath模块防止溢出。

    十三 其他参考

    https://github.com/slowmist/eos-smart-contract-security-best-practices
    《EOS 智能合约最佳安全开发指南》

    https://paper.seebug.org/603/ 《慢雾科技 以太坊智能合约安全 Dasp Top10》

    https://www.jianshu.com/p/ca87479c520b 《【安全】Fomo3D死亡3分钟的交易攻击分析》

    相关文章

      网友评论

          本文标题:以太坊智能合约安全问题总结

          本文链接:https://www.haomeiwen.com/subject/jpcmtqtx.html