一种智能合约短地址攻击检测工具的实现方法

文档序号:26103299发布日期:2021-07-30 18:14阅读:427来源:国知局
一种智能合约短地址攻击检测工具的实现方法

本发明涉及信息技术领域,提供了一种智能合约短地址攻击检测工具的实现方法。



背景技术:

随着去中心化的应用的快速发展,区块链技术目前正被人们广泛地关注。以太坊是一个开源的有智能合约功能的公共区块链平台,智能合约的存在使得人们可以在其上面快速地开发去中心应用。同时,以太坊很好的解决了实体间的纠纷问题,保证了用户的隐私。目前,超过3000万智能合约被部署在以太坊这个最大的智能合约宿主链上。其中,最被人们所关注的便是其中的代币合约,它为人们提供了一种利用数字货币来管理资产的新方式,因此它的安全性尤为重要。

不幸的是,如果缺乏一定的检测机制,就会导致短地址攻击的发生。短地址攻击会导致合约上资金的失窃,这使得智能合约尤其是代币合约的安全性问题遭到严重的挑战,同时也使得人们丧失了对数字货币的信任,因此对这种攻击的检测就显得尤为重要。

当一个用户通过web3api与以太坊上的智能合约进行交互时,其请求中的数据将会按照合约abi规范进行编码,根据不同的数据类型会有不同的编码规则。如果没有按照规范编码,我们认为发送给函数调用的实参是无效的。虽然web3api可以生成有效的实参,但在实践中仍会发现许多无效的实参,其中的原因多种多样,如恶意目的、参数填充混淆、编译器bug、web3兼容性问题、编译器新版本的变化等。无效的实际参数可能导致运行时异常、意外的执行结果,甚至是财产被盗窃。短地址攻击就是利用构造无效实参来进行财产盗窃的一种手段。目前,针对以太坊智能合约的短地址攻击检测手段主要从三个方面出发,在交易所层面,检测输入地址位数是否合规;在以太坊层面,节点发送交易前,校验函数参数位数是否合规;在token合约层面,对transfer函数,检查len(msg.data)==68,对其他函数同理。这些检测手段,都需要定位输入的地址实参。



技术实现要素:

本发明的目的在于检测和发现短地址攻击发生时,使得代币的发行者在短地址攻击发生时,拒绝这笔交易请求,以此来极大程度地保障了代币合约的安全性。

一种智能合约短地址攻击检测工具的实现方法,包括以下步骤

步骤1、利用反编译模块得到函数id:

用户上传到以太坊上的智能合约以字节码的形式存在,对智能合约字节码进行反编译,反编译的过程中会对字节码进行代码块和函数识别,识别结果包括函数id;

步骤2、tase获取函数签名:

反编译模块的输出进入tase模块,tase模块将获取每个函数id对应的参数列表,并将函数id与对应的参数列表进行组合输出函数签名;

步骤3、步骤2中得到的函数签名作为输入,当用户调用智能合约时从调用数据中获取函数签名id,然后找出对应的函数签名中的参数列表;

步骤4、对于函数签名中的每个参数在调用数据中借助tase定位实际参数,并检查其填充是否正确,如填充错误,则判断为攻击。

步骤4.1、如果参数是一个基本类型,根据表1中如下的规则来检查填充的正确性,如正确则;

步骤4.2、如果参数是一个静态array(由基本类型组成的一个结构),根据表1中的规则检查array中的每一项填充的正确性,具体见方法二;

步骤4.3、如果参数是动态struct、嵌套array、动态array、bytes或string(由基本类型组成的一个结构),检查其结构和内容,具体见方法三。表1:

其中uint8,uint16,…,uint256,int8,int16,…,int256,bytes8,bytes16,…,bytes256是solidity编程语言中的基本类型,分别表示相应位数的无符号整数以及带符号整数以及字节;address,bool为地址类型和布尔类型,它们也是solidity编程语言中的基本类型。

一个字节串如11001011,在以太坊虚拟机中,高位为字节串的最左边,低位为字节串的最右边。如该字节串中,高3位为从最左边开始数三个位,结果为110,低3位为从最右边开始数三个位,结果为011。

上述技术方案中,步骤4.1包括以下步骤:

步骤4.1.1、根据参数的类型与参数的值,根据表1中的规则判断其值是否满足相应的标准,比如,某一个实参的类型为bool,其值为其不满足规则1中对bool类型的标准,因为它的高255位不为零,而规则1中要求它的高255位都为零。

步骤4.1.2、如果满足标准,则输出true,代表不存在短地址攻击;否则输出false,代表检测到短地址攻击。

上述技术方案中,步骤4.2具体包括以下步骤:

步骤4.2.1、对于array中的每一项,判断每一项的类型为一个静态array或者一个基本类型,如为一个静态array则进行步骤4.2.3,如为一个基本类型则进行步骤4.2.2;

步骤4.2.2、如果该项为基本类型,则利用步骤4.1对该项进行检测,如果检测结果输出false,则最终输出false,代表检测到短地址攻击,进行步骤4.2.4,如检测结果输出为true,则代表未检测到短地址攻击,继续检测下一项,直至每一项都检测完之后进行步骤4.2.4;

步骤4.2.3、如果该项为一个静态array,则继续执行步骤4.2.1对该项进行检测;;

步骤4.2.4、如果每一项都检测完之后没有输出false,则输出true,代表不存在短地址攻击。

上述技术方案中,步骤4.3具体包括以下步骤:

步骤4.3.1、根据它们的类型,可以确定其结构和内容,其内容可能包含很多项,每一项可能为基本类型、array或者动态struct,判断每一项的类型,如为基本类型则进行步骤4.3.2,如为静态array类型进行步骤4.3.3,如为动态struct则进行步骤4.3.4;

步骤4.3.2、如果该项为基本类型,则利用步骤4.1对该项进行检测,如果检测结果输出false,则最终输出false,代表检测到短地址攻击。

步骤4.3.3、如果该项为静态array,则利用步骤4.2对该项进行检测,如果检测结果输出false,则最终输出false,代表检测到短地址攻击。

步骤4.3.4、如果该项为动态struct,则递归调用步骤4.3对该项进行检测,如果检测结果输出false,则最终输出false,代表检测到短地址攻击。如对于一个struct,其定义为structexample{int×[10];inty},那么对于structexample声明的变量,它由两项组成,对于这个struct的每一项,第一项x的正确性可以由方法二确定,第二项y的正确性可以由步骤4.3.2确定,最终struct的正确性由它们共同决定。进一步地,如果另一个struct,其定义为structtest{structexamplee;intz},那么对于test声明的变量,首先确定第一项e的正确性,在确定一项正确性时,需要借助步骤4.3,步骤4.3又会调用步骤4.3.3和步骤4.3.2,从而确定步骤4.3的正确性,然后在直接借助步骤4.3.2确定第二项的正确性,最终确定这个struct的正确性,不正确则输出false,否则输出true。如图3所示

步骤4.3.5、如果每一项都检测完之后没有输出false,则输出true,代表不存在短地址攻击。

因为本发明采用以上技术手段,因此具备以下有益效果:

在本发明中,利用恢复的函数签名自动检测发送到solidity智能合约中的无效实参的工具,通过它可以轻松地检测和发现短地址攻击。

本发明利用函数签名技术提供了一种快速检测短地址攻击的方法与装置,利用该发明可以使得代币的发行者在短地址攻击发生时,拒绝这笔交易请求,以此来极大程度地保障了代币合约的安全性。

附图说明

图1为工作流程图;

图2为短地址攻击施例图;

图3为struct示例图。

具体实施方式

示例

我们使用parchecker检测到的交易(如图2所示)来解释短地址攻击如何窃取令牌,然后给出检测结果。

该事务调用函数id为0xa9059cbb的令牌智能合约的transfer()函数来传递token。transfer()函数有两个参数:表示接收方的address类型的_to,以及表示token数量的uint256类型的_value。攻击者将to的末尾零去掉,然后evm将to的高阶零填充到32个字节。在这之后,evm(ethereumvirtualmachine)在_value的最低字节后加0到32字节的长度,因此_value从0x2710变成0x271000。攻击者可以发起这样的攻击,欺骗受害者交换钱包,将更多的token转移到他们控制的地址(即to)。

通过首先定位transfer()的调用,我们可以从parchecker的结果中发现此类攻击。然后,我们检查实际参数len的长度是否小于64字节,即一个有效的address加上一个有效的uint256的长度。如果是,对于参数的最后32个字节,我们检查它的最高64-len字节是否为零。如果是这种情况,则检测到短地址攻击,因为最高的64-len字节将被用于补充短address。最终,我们发现73个攻击交易,它们调用了25个智能合约。详细结果如表2所示。

表1parchecker检测到的短地址攻击

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1