首页 > DAO > 智能合约自动检测工具,如何带你解锁Web3.0世界
成都链安  

智能合约自动检测工具,如何带你解锁Web3.0世界

摘要:【链必验】智能合约自动检测工具,可用来检测区块链智能合约漏洞。平台针对每个用户模拟了一条单独的测试链,用户可以自主在测试链上对智能合约进行部署、测试和验证,是集智能合约开发、测试、验证于一体的综合平台

智能合同自动检测工具可用于检测区块链智能合同的漏洞。该平台为每个用户模拟了一个单独的测试链。用户可以独立部署、测试和验证测试链上的智能合同。它是一个集智能合同开发、测试和验证为一体的综合性平台。

在验证过程中,平台采用正式验证技术,建模执行环境,通过数学推理验证安全属性,发现合同运行中可能出现的安全问题,协助合同开发人员发现合同中的潜在安全风险,定位漏洞,提高合同的安全性。主要包括代码规范检测、标准规范检测、函数调用检测、业务逻辑安全检测四个方面。

Web3.0智能合约是世界上最不可或缺的。今天,让我们学习这个智能合约自动检测工具,一起解锁Web3.0世界。

ONE 代码标准检测1.内存ABIEncoderV2数组

等级:ERROR

描述:0.4.7-0.5.9版本solc有一个编译器BUG,此BUG会导致abi.encode接口处理多维数组时产生错误的结果。

样例

br编译版本为0.5.9嵌套数组badArr的返回值是错误的,为 [[1,2],[2,3],[3,4]]。编译版本为0.6.7嵌套数组badArr返回值正确,为 [1,2],[3,4],[5,6]。

修理建议:避免使用0.4.7-0.5.9禁止使用编译器0.4.7-0.5.9编译器中的abi.encode接口。

2.多重构造函数

等级:ERROR

描述:在0.4.22在版本的编译器中,合同允许合同同时具有两种格式的结构函数(以constructor关键字声明构造函数,或以合同名称声明函数)。因此,构造函数中的变量有相互覆盖的危险。

样例

br

constructor()初始化x为1,而Test()初始化x因此,位置后定义的构造函数会失效x最终将初始化为1。

修复建议:只使用一个结构函数。

3.公开的mapping嵌套结构变量

等级:ERROR

描述:默认只读公开变量getter函数,但是公开的mapping嵌套引用结构会导致非法getter函数。

样例

br公开的mappingm引用类型嵌套struct,将导致针对public默认读取变量的方法m[1].a失败。

修理建议:避免使用public mapping嵌套引用类型,或使用pragma experimental ABIEncoderV2。

4.从右到左读写控制字符

等级:ERROR

描述:Unicode [U 202E] 强制编译器从右到左读取,与正常顺序相反,可能会误导用户。

样例

br_f函数期待输入值i,j,m依次传递给a,b,c由于有U 202E输入函数需要存在j,i,m给出顺序。

修理建议:避免使用U 202E字符。

5.状态变量覆盖

等级:ERROR

描述:合同的继承包括状态变量的继承,在子合同中重载基类合同的状态变量可能会导致变量的逻辑错误。

样例

br合约Test是Base的子合约,Test中a定义重载Base状态变量中a。调用f1()将返回Base中的a,调用f2()将返回Test中的a。

修复建议:避免重载基类合约状态变量。

6.未初始化的storage变量

等级:ERROR

描述:未初始化storage状态变量的地址将指向第一个状态变量的地址,使用它可能造成数据覆盖或数据丢失。

样例

br

未初始化变量st存储指针将指向状态变量a,st.b赋值将覆盖变量a使a的值变为2。

修复建议:使用前初始化storage局部变量,或重用memory局部变量。

7.常量函数改变状态

等级:WARNING

描述:在Solidity 0.5.0以前,它的可变性被定义为constant/prue/view函数,但改变了函数体中的句子。这样的函数可以编译,但只报告warning,进一步调用函数将失败。问题是0.5.0以后的版本已经修复,常量函数中实现的状态修改无法编译。

样例

br变量a在f()函数中改变了它的值,但是a()函数标记为view。所以调用 f() 不会改变 a。

修理建议:保证Solidity 0.5.0之前合同的可变性是正确的。

8.删除包含mapping的结构

等级:WARNING

描述:使用delete重置包含mapping的struct时,struct中的mapping它不会被重置,这可能会导致后续逻辑错误。

样例

br合同初始化后实例化struct a,并将a.i初始化为10和a.j初始化为100f1中使用delete a重置了结构a。f2数据可以在()中读取,结果是变量a.i已被重置为0,但是a.j[10]数据仍然是100。

修理建议:避免使用delete重置包含mapping的struct。

9.返回值失配

等级:WARNING

描述:在returns声明了返回的名称和类型,但实际返回值与声明中的变量不一致。

样例

br函数f()定义返回类型和名称uint a,而return句子直接返回100,和return声明不匹配。

修理建议:保证return句子中的值与returns句子中的返回声明相匹配。

10.重用基类结构函数

等级:WARNING

描述:允许在合同之间继承,子合约继承父合约的状态变量、函数和结构函数。当子合约继承多个结构函数时,可以重用多个结构函数。

样例

brTest1和Test2都继承了合同test子合约,并重用构造函数来变量各自的状态a合同初始化为1和2Test3继承了合约Test1和Test2,因此具有两个不同的构造函数,导致Test3中状态变量a多次赋值,最终赋值为2。

修复建议:确保子合约具有唯一继承的结构函数。

TWO 标准规范检测1.未检查转账操作

等级:ERROR

描述:当合同定义时ERC20标准的transfer/transferFrom需要检查接口transfer/transferFrom接口的返回值,否则会导致对转账状态的误判。

样例

br

token.transferFrom(msg.sender,address(this),amount);返回值需要检查。

修复建议:检查所有转账函数的结果。

2.错误的ERC20接口

等级:WARNING

描述:标准的定义ERC20接口和标准ERC20接口不完全一致。

样例

brERC20标准的Transfer事件是event Transfer(address indexed from,address indexed to,uint256 value);。

修复建议:完全参考ERC20标准设置ERC20事件及接口。

3.错误的ERC721接口

等级:WARNING

描述:定义标准ERC721接口和标准ERC721接口不完全相同。

样例

br

函数ownerOf(uint256 tokenId)是ERC721但缺乏参数或返回值。

修复建议:对比ERC721

THREE 函数调用检测1 受控代理调用

等级:ERROR

描述:委托调用是调用合同的一种方式。委托调用的操作空间正在调用发起人,因此侵没有任何权限控制或调用地址未知的调用。

样例

braddr可由调用者任意控制。

修复建议:执行delegatecall函数设置权限控制,指定调用者。

2.未检查的底层call

等级:ERROR

描述:智能合同的底部调用具有返回数据。调用合同执行失败不会导致调用启动合同执行失败。如果调用操作失败,未检查返回值,则可能导致预期逻辑和实际状态现差异。

样例

braddress(f).call(abi.encodePacked(function_selector)); 实现了合同Base中函数f()调用。但是用了call调用返回值未验证,调用状态无法判断。

修复建议:所有底层call验证方法返回值。

3.未检查的send方法

等级:ERROR

描述:智能合约的转账函数send有返回值,如果转账代码失败,将继续执行,调用不会返回状态send转账时,应检查返回值,以确定转账是否成功。

样例

br函数f使用send进行转移ether,由于没有对send验证返回值将无法知道转账是否真正成功。

修复建议:使用send转账时,检查返回值。

4.底层call

等级:INFO

描述:使用低级调用是有风险的。低级调用不检查代码是否存在或调用成功。

修复建议:避免底层call

FOUR业务逻辑安全检测1.未知的转账地址

等级:ERROR

描述:转账函数没有任何权限限制,转账接受人可以设置,任何人都可以获得合同资金。

样例

br函数f()无权限控制,转账接受者为msg.sender。调用f()可获得合同全部资金。

修复建议:当合同具有外部转账功能时,将正确的权限控制添加到包含转账函数中。

2.修改动态数组长度

等级:ERROR

描述:在solc 0.6.0可以直接修改动态数组类型的长度信息,长度信息的变化将直接影响存储的数组数据。

样例

br合约部署后,动态数组a的第20位数据a[20]为1,若调用f(10)将a将长度修改为10,然后a[20]指向值将丢失。

修复建议:避免直接或间接修改动态数组的长度。

3.小心使用枚举

等级:ERROR

描述:在0.4.5在版本之前,枚举类型的调用不会溢出判断。

样例

brE是长度为3的enum类型,即使试着读E的第10个,bug()函数不会恢复。

修理建议:避免使用0.4.0-0.4.4版本的solc编译器,或区间判断枚举值。

4.锁定ETH的合约

等级:ERROR

描述:智能合约中有收取以太币的函数,但没有发行货币的函数,会导致以太币锁定在合同中。

样例

br函数f()有一个payable符号,但合同无法花费/转移以太币。

修理建议:删除收钱函数payable属性,或添加可消耗性Ether/向外转Ether的函数。

5.错误的修饰器

等级:ERROR

描述:如果修饰器无法到达,修饰器起到状态/权限控制的作用_;代码段将无法执行函数,并导致逻辑错误。

样例

br

修饰符 bug1() 有一个 if 语句,当bool_test 为 false 时,_; 不会到达,所以函数 use() 将不会被使用。

修理建议:确保修饰器能到达_;修饰器功能正确执行代码段。

6.缺少返回值

等级:ERROR

描述:函数返回声明中有返回值,但未实现相应的返回。

样例

br函数f()声明返回一个uint函数体中缺乏类型值return关键字,这将导致返回0(uint )类型的最小值。

修复建议:添加相应的返回值或删除返回声明。

7.重入风险

等级:ERROR

描述:调用外部合同的主要危险之一是它们可以接管控制流。恶意合约在函数第一次调用完成前,在重新攻击(也称为递归调用攻击)中回调调用合约。这可能会导致不同的函数调用以不希望的方式交互call调用后改变关键状态的变量容易造成重新进入的危险。

样例

br在函数f()判断地址的数额后,使用call最后发送以太币storage变量book转账后发生变化。因此,攻击者可以循环调用f()提取以太币。

维修建议:使用检查-生效-避免重攻。

8.合同自毁函数

等级:ERROR

描述:合同包含自毁函数,不使用任何身份认证,使合同处于不稳定状态。

样例

br任何人都可以调用f()销毁合同并提取合同中的资金。

修复建议:尽量避免使用自毁函数,或添加正确的权限控制。

9.构造函数中存在未初始化的函数指针

等级:ERROR

描述:合同构造函数中有未初始化的函数指针,直接调用会出错。

样例

brf是constructor在函数指针完全实现之前,中函数指针已被调用。这种行为会导致部署失败。

修复建议:在函数指针完全实现之前,不要调用函数指针。

10.状态变量未初始化

等级:ERROR

描述:使用未初始化的状态变量可能导致逻辑错误。

样例

br

状态变量a未初始化,默认为0地址。在转账操作中,以太币将丢失(转账)0x0地址)。

修复建议:在声明状态变量时尽可能初始化状态变量。

11.可入侵的升级合同

等级:ERROR

描述:合同包含自毁函数,任何人都可以调用初始函数。

样例

br

函数initialize()合同将初始化,但如果攻击者在所有者之前被调用,任何人都可以调用initialize()攻击者可以随时调用kill()使代理合同功能失效。

修复建议:在构造函数中执行初始中的初始函数功能,以确保owner不得随意修改。

12.断言错误

等级:ERROR

描述:assert必须满足限制。

修复建议:请查看代码逻辑,找出问题并修复。

13.整型上溢出

等级:ERROR

描述:上溢出是指运算结果超过结果类型所能表示的上限。

修复建议:请添加溢出判断或使用SafeMath运算库。

14.整型下溢出

等级:ERROR

描述:下溢出表示计算操作中的结果超过了结果类型可以表示的下限。

修复建议:请添加溢出判断或使用SafeMath

以上只选择一些案例

查阅更多安全检测项目

可复制以下网站阅读

https://beosinofficial.gitbook.io/vaas-zhong-wen/

免责声明
世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:msy2134。