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

一 以太坊安全总览

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

二 权限控制问题

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分钟的交易攻击分析》

你可能感兴趣的:(以太坊智能合约安全问题总结)