一 以太坊安全总览
权限控制问题
设计/业务逻辑错误
算术精度导致的问题
未作异常处理导致的问题
伪随机数问题
拒绝服务漏洞
上/下溢漏洞
重入漏洞
变量覆盖漏洞
假充值漏洞
缺失的输入验证
二 权限控制问题
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分钟的交易攻击分析》
网友评论