没有合适的资源?快使用搜索试试~ 我知道了~
1、编码规范问题 2、设计缺陷问题 3、编码安全问题 4、编码设计问题 5、编码问题隐患 1、编码规范问题 2、设计缺陷问题 3、编码安全问题
资源详情
资源评论
资源推荐
以太坊智能合约审计CheckList
作者:知道创宇404区块链安全研究团队
时间:2018.11.12
在以太坊合约审计checkList中,我将以太坊合约审计中遇到的问题分为5大种,包括编码规范问题、设计缺陷问题、编码安全问题、
编码设计问题、编码问题隐患。其中涵盖了超过29种会出现以太坊智能合约审计过程中遇到的问题。帮助智能合约的开发者和安全
工作者快速入门智能合约安全。
本CheckList在完成过程中参考并整理兼容了各大区块链安全研究团队的研究成果,CheckList中如有不完善/错误的地方也欢迎大家提
issue.
由于本文的目的主要是CheckList,所以文中不会包含太详细的漏洞/隐患信息,大部分漏洞分析在扫描报告中会有所提及。
以太坊智能合约审计CheckList目录
以太坊智能合约审计CheckList
以太坊合约审计checkList
1、编码规范问题
(1)编译器版本
(2)构造函数书写问题
(3)返回标准
(4)事件标准
(5)假充值问题
2、设计缺陷问题
(1)approve授权函数条件竞争
(2)循环Dos问题
[1]循环消耗问题
真实世界事件
[2]循环安全问题
3、编码安全问题
(1)溢出问题
[1]算术溢出
真实世界事件
[2]铸币烧币溢出问题
真实世界事件
(2)重入漏洞
真实世界事件
(3)call注入
真实世界事件
(4)权限控制
真实世界事件
(5)重放攻击
4、编码设计问题
(1)地址初始化问题
(2)判断函数问题
(3)余额判断问题
(4)转账函数问题
(5)代码外部调用设计问题
(6)错误处理
(7)弱随机数问题
真实世界事件
(8)变量覆盖问题
5、编码问题隐患
(1)语法特性问题
(2)数据私密问题
(3)数据可靠性
(4)gas消耗优化
(5)合约用户
(6)日志记录
(7)回调函数
(8)Owner权限问题
(9)用户鉴权问题
(10)条件竞争问题
真实世界事件
(11)未初始化的储存指针
(12)「输入假名」问题
真实世界事件
以太坊合约审计checkList审计系列报告
REF
1、编码规范问题
(1)编译器版本
合约代码中,应指定编译器版本。建议使用最新的编译器版本
pragmasolidity^0.4.25;
老版本的编译器可能会导致各种已知的安全问题,例如hps://paper.seebug.org/631/#44‐dividenddistributor
v0.4.23更新了一个编译器漏洞,在这个版本中如果同时使用了两种构造函数,即
contracta{
functiona()public{
...
}
constructor()public{
...
}
}
会忽略其中的一个构造函数,该问题只影响v0.4.22
v0.4.25修复了下面提到的未初始化存储指针问题。
hps://etherscan.io/solcbuginfo
(2)构造函数书写问题
对应不同编译器版本应使用正确的构造函数,否则可能导致合约所有者变更
在小于0.4.22版本的solidify编译器语法要求中,合约构造函数必须和合约名字相等,名字受到大小写影响。如:
contractOwned{
functionOwned()public{
}
在0.4.22版本以后,引入了constructor关键字作为构造函数声明,但不需要funcon
contractOwned{
constructor()public{
}
如果没有按照对应的写法,构造函数就会被编译成一个普通函数,可以被任意人调用,会导致owner权限被窃取等更严重的后果。
(3)返回标准
遵循ERC20规范,要求transfer、approve函数应返回bool值,需要添加返回值代码
functiontransfer(address_to,uint256_value)publicreturns(boolsuccess)
而transferFrom返回结果应该和transfer返回结果一致。
(4)事件标准
遵循ERC20规范,要求transfer、approve函数触发相应的事件
functionapprove(address_spender,uint256_value)publicreturns(boolsuccess){
allowance[msg.sender][_spender]=_value;
emitApproval(msg.sender,_spender,_value)
returntrue
(5)假充值问题
转账函数中,对余额以及转账金额的判断,需要使用require函数抛出错误,否则会错误的判断为交易成功
functiontransfer(address_to,uint256_value)returns(boolsuccess){
if(balances[msg.sender]>=_value&&_value>0){
balances[msg.sender]‐=_value;
balances[_to]+=_value;
Transfer(msg.sender,_to,_value);
returntrue;
}else{returnfalse;}
}
上述代码可能会导致假充值。
正确代码如下:
functiontransfer(address_to,uint256_amount)publicreturns(boolsuccess){
require(_to!=address(0));
require(_amount<=balances[msg.sender]);
balances[msg.sender]=balances[msg.sender].sub(_amount);
balances[_to]=balances[_to].add(_amount);
emitTransfer(msg.sender,_to,_amount);
returntrue;
}
2、设计缺陷问题
(1)approve授权函数条件竞争
approve函数中应避免条件竞争。在修改allowance前,应先修改为0,再修改为_value。
这个漏洞的起因是由于底层矿工协议中为了鼓励矿工挖矿,矿工可以自己决定打包什么交易,为了收益更大,矿工一般会选择打包
gasprice更大的交易,而不会依赖交易顺序的前后。
通过置0的方式,可以在一定程度上缓解条件竞争中产生的危害,合约管理人可以通过检查日志来判断是否有条件竞争情况的发
生,这种修复方式更大的意义在于,提醒使用approve函数的用户,该函数的操作在一定程度上是不可逆的。
functionapprove(address_spender,uint256_value)publicreturns(boolsuccess){
allowance[msg.sender][_spender]=_value;
returntrue
上述代码就有可能导致条件竞争。
应在approve中加入
require((_value==0)||(allowance[msg.sender][_spender]==0));
将allowance先改为0再改为对应数字
(2)循环Dos问题
[1]循环消耗问题
在合约中,不推荐使用太大次的循环
剩余18页未读,继续阅读
武藏美-伊雯
- 粉丝: 19
- 资源: 352
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 555springboot + vue 线上教学平台.zip(可运行源码+数据库文件+文档)
- 554springcloud + vue 房产销售平台.zip(可运行源码+数据库文件+文档)
- 小霸王坦克游戏源码.7z
- 蓝桥杯单片机基础学习项目(LED,数码管,蜂鸣器,继电器,按键控制)
- 553springboot + vue 某银行OA系统.zip(可运行源码+数据库文件+文档)
- DatabaseWatermarkingBasedonTextFormat
- yolov8常用二维码检测检测+数据集
- -移动通信-网络课程设计与研究
- 基于Python的PCA人脸识别算法的原理及实现代码+文档详解.zip
- 甘肃移动全业务工程建设项目管理流程优化研究
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0