摘自“钱鹏 等:智能合约安全漏洞检测技术研究综述”
三个层面的安全问题:solidity代码层,evm执行层,区块链系统层
漏洞检测方法:形式化验证法,符号执行法,模糊测试法,中间表示法,深度学习法
The Dao重入攻击
parity多签名钱包合约的delegatecall漏洞
bec合约的整数溢出漏洞无限复制代币
EOS.WIN连续随机数攻击
智能合约运行时允许与外部合约函数或接口交互:重复的外部调用
以太坊DAPP总价值应用在博彩、游戏等高风险类别
solidity代码层
1.可重入漏洞
独特的fallback机制,使得恶意攻击者在程序命令执行结束前再次进入被调用函数
转账操作必定会出发接收者合约中的回调函数
攻击者在fallback函数中设计恶意攻击代码,递归调用受害者合同的转账函数从而盗取ether
2.整数溢出漏洞
乘法、加法、减法溢出
若超出定义范围,会自动截断高位
解决方法:在算术逻辑前后进行验证;使用safemath库防范
3.权限控制漏洞
合约代码层面:默认的权限时public
合约逻辑层面:onlyowner,onlyadmin约束
4.异常处理漏洞
3种异常:gas消耗完;调用栈溢出(1024);有throw命令
一般来说,若抛出异常,合约会自动回滚到上一个一致性状态
特殊情况:一个合约以不同的方式调用另一个合约,发起调用的合约可能无法获取被调用合约的异常信息
智能合约的子调用发生异常会自动向上级传播,但一些底层调用函数(Send、call、delegatecall)发生异常只 返回false,不抛出异常
因此,在调用底层函数时必须严格检查返回值(flase),并有一致性的处理
5.拒绝服务漏洞
攻击者通过破坏合约原有逻辑,消耗ether和gas,使得合约在一段时间无法正常执行
Revert攻击:外部函数的执行结果一直失败
gas攻击:区块有gas上限
owner账户攻击:开启或停止合约交易的权限,被盗
6.类型混乱漏洞
solidity强类型编程语言,自动匹配错误
但即使没匹配成功,执行也无异常
开发人员必须人工检查类型匹配问题
7.未知函数调用漏洞
函数名和参数确保函数的唯一性
当一个合约调用另一个合约没有匹配正确时,会自动调用fallback
如果fallback中藏雷就很危险了
8.以太冻结漏洞
一些合约自身不是先转账函数,通过delegatecall委托调用外部合约中国的转账函数来实现转账
但是,若外部合约有自毁操作时,通过委托调用很可能会发生因为被调用合约的自毁而产生的ether冻结情况
EVM执行层:
1.短地址漏洞
特性:EVM自动补0
规范:输入的合约地址必须时20个字节,若小于则末尾自动补0
哇哦有点意思
若第一个参数为地址,第二个参数为以太币数量
地址少输入一个字节,EVM就会从以太币中拿一个字节来填补
这样的话ether就被左移了一个字节
补0是对整串二进制码的末尾补0
2.ether丢失
接收方地址是空地址(不小心转错了),就丢失了
3.调用栈溢出
每调用一次外部合约或自身调用都会增加一次栈深度,1024限制,嵌套调用可能会溢出
4.Tx.Origin漏洞
全局变量,回溯整个调用栈最初发起的合约地址,tx.origin == owner,诱导victim合约转账给attacker
3.区块链系统层:
1.时间戳依赖漏洞
SC经常使用矿工确认的block.timestamp来实现事件约束
然而,创建区块的矿工可以刻意选择有利于他们的时间戳
2.区块参数依赖漏洞
通过随机函数来产生随机数
随机种子:block.number,block.timestamp,blcok.blockhash
被矿工提前获取,可预测,矿工可以产生有利的随机数
3.交易顺序依赖漏洞
交易执行顺序由矿工决定,但有些合约错误的顺序可能有负面影响
恶意矿工可监听,并通过恶意改变顺序从而改变合约状态,从而提前部署攻击