WHCSRL 技术网

Smart Contract Vulnerabilities:Vulnerable Does Not Imply Exploited总结

Smart Contract Vulnerabilities:

Vulnerable Does Not Imply Exploited

Usenix Security A 2021

研究背景

通过调查了最近六个学术项目所报告的23327个易受攻击的领域,结果发现,尽管这些领域的风险很大,但自部署以来,只有1.98%%的领域被开发利用。这最多相当于8487 ETH(约170万美元),或仅占300万ETH(6亿美元)的0.27%%。我们通过证明资金非常集中于少数在实践中不可利用的合同来解释这些结果

然后介绍了引起智能合约漏洞的背景

要执行智能合约,发送方必须向合约发送交易,并支付一笔费用,该费用来自合约的计算成本(以gas为单位)。每一条执行的指令消耗一个商定的气体量。消耗的gas贷记给包含交易的区块的矿工,而未使用的gas则退还给发送者。为了避免从不终止程序导致的系统故障,事务为合同执行指定了gas限制。一旦达到此限制,就会抛出gas不足异常。

智能合约本身有能力调用以太坊区块链上的其他账户。这个函数是重载的,因为它既用来调用另一个契约中的函数,也用来将以太坊中的基础货币ETH(ETH)发送到一个帐户。以太坊的一个特殊之处是,来自合同内部的调用(也称为内部事务)不会创建新的事务,因此不会直接记录在链上。这意味着在不执行事务的情况下查看事务并不能提供足够的信息来跟踪事务流。

然后介绍了六种智能合约的漏洞

Re-Entrancy (RE)。重入攻击 以太坊智能合约的特点之一是合约之间可以进行相互间的外部调用。同时,以太坊的转账不仅局限于外部账户,合约账户同样可以拥有Ether,并进行转账等操作。向以太坊合约账户进行转账,发送Ether的时候,会执行合约账户对应合约代码的回调函数(fallback)。一旦向被攻击者劫持的合约地址发起转账操作,迫使执行攻击合约的回调函数,回调函数中包含回调自身代码,将会导致代码执行“重新进入”合约。这种合约漏洞,被称为重入漏攻击Re-Entrancy。

Unhandled Exceptions (UE)未处理异常.发送以太时,在失败时不会抛出异常,而是通过返回布尔值来报告状态。如果未选中此返回值,则即使支付失败,调用方也会继续执行,这很容易导致不一致。

Locked Ether (LE). 以太坊智能合约可以像以太坊上的任何帐户一样接收以太。然而,有几个原因使收到的资金可能被永久地锁定在合同中。本文关注的是合约依赖于不再存在的外部合同的情况,因为这是对以太坊财务影响最大的模式。

2017年11月发生的Parity Wallet漏洞,锁定了价值数百万美元的以太,一个原因是,合同可能依赖于另一个合同,该合同已被使用EVM的自毁指令销毁,即其代码已被删除,其资金已被转移。如果这是这样一个合同发送Ether的唯一方式,它将导致资金被完全锁定。

还有一些情况下,合同将总是用尽gas时,试图发送Ether,这可能导致锁定合同资金。

Transaction Order Dependency (TO)事物顺序依赖. 在以太坊,多个事务包含在一个块中,这意味着合同的状态可以在同一块中多次更新。如果调用同一智能合约的两个事务的顺序改变了最终结果,则攻击者可以利用此属性进行攻击。例如,给定一个期望参与者提交exchange中一个谜题的解决方案以获得奖励的合同,恶意合同所有者可以在提交交易时减少奖励金额。

Integer Overflow (IO).整数上溢和下溢在许多编程语言中是一种常见的错误类型,但在以太坊环境中,它可能会产生非常严重的后果。例如,如果一个循环计数器溢出,产生一个无限循环,合同的资金可能会被完全冻结。如果攻击者能够增加循环的迭代次数(例如,通过注册足够的用户来触发溢出),则可以利用此漏洞。

Unrestricted Action (UA). 这样的问题不仅发生在开发人员忘记执行关键检查,也会发生在攻击者可以执行任意代码,例如通过控制委派调用的地址。合约通常通过检查消息的发送者来执行身份验证,以限制用户可以执行的操作类型。通常,只有合同的所有者才可以销毁合同或设置新的所有者。

用于分析的智能合约

本文收集了6篇学术论文中易受攻击的智能合约

为了检查潜在的漏洞,我们执行字节码级别的事务分析,在执行特定事务时查看契约执行的代码。我们使用这种类型的分析来检测第2节中介绍的六种类型的漏洞。为了执行我们的分析,我们首先检索数据集中所有合约的事务数据。接下来,为了执行字节码级别的分析,我们提取可能影响合同的交易的执行跟踪。我们使用EVM的调试功能,这使我们能够在跟踪执行的指令时重放事务操作。为了加快数据收集过程,我们修补了Go以太坊客户端,而不是依赖默认以太坊客户端提供的远程过程调用(RPC)功能。

这是本文定义的函数方法

通过调用不同的方法来检测不同的漏洞  在本节中,我们逐一介绍每个漏洞的结果;我们的结果是使用第4节中描述的方法获得的;目的是显示这些资金中有多少实际处于风险之中。

最后通过检查得到了最后的结果如下图

总的来说,我们发现被利用的合同数量是不可忽略的,在我们的研究中涉及的6个漏洞中,约有2%%4%%的脆弱合同被利用了4个。然而,值得注意的是,开采的Ether百分比要低一个数量级,最多有0.4%%Ether用于再进入。这表明开发的合同通常价值较低。

我们认为,报告的脆弱合同数量与利用的合同数量之间存在差异的一个主要原因是Ether在合同中的分布。事实上,在我们数据集中的23327份合同中,只有大约2000份含有以太,而且大多数合同的余额低于1Ether。图12a显示了数据集中包含Ether的合同的平衡分布。此外,排名前10位的合约约占总合约的95%%。我们在图12b中显示了Ether在含有10Ether以上的合同中的累积分布。这表明,只要顶级合约无法交割,实际处于风险中的Ether总量就不会接近脆弱”Ether的上限.

为了确保这一事实推广到整个以太坊区块链,而不仅仅是我们的数据集,我们获取所有现有合约的余额。总共有15459193份合同。其中,只有463538份合同有非零余额,仅占所有合同的3%%。余额非零的合同中,前10名、前100名和前1000名分别占Ether总量的54%%92%%99%%。这表明,我们的数据集与整个以太坊区块链的趋势相同:只有极少量的合约持有大部分财富。我们决定手动检查前6个合同,在撰写本文时的余额方面,这些合同被数据集中的任何工具标记为易受攻击。我们把重点放在前6位,因为这恰好是目前持有超过10ETH的合同数量。这些合同总计持有1695240 ETH,占我们数据集中所有合同目前持有的2037521 ETH总数的83%%

介绍了由于智能合约漏洞导致的严重后果

The DAO漏洞。DAO漏洞[45]是以太坊区块链上最著名的漏洞之一。攻击者利用了合同的重入漏洞[11],该漏洞允许耗尽合同资金。攻击者可以在DAO余额减少之前调用函数以重新进入的方式提取资金,从而使资金的自由外流成为可能。共排出350多万Ether。考虑到攻击的严重性,以太坊社区最终同意了硬分叉。

Parity wallet bugParity wallet漏洞[14]是以太坊区块链上的另一个突出漏洞,导致价值2.8亿美元的以太坊被冻结在Parity wallet账户上。这是由于一个非常简单的漏洞:Parity wallet使用的库契约没有正确初始化,任何人都可能破坏它。一旦库被毁,任何对平价钱包的调用都将失败,从而有效地锁定了所有资金。

总结

本文调查了最近6个学术项目所报道的23327份弱势合同。我们提出了一个基于数据日志的公式,用于对EVM执行跟踪执行分析,并使用它来分析这些契约执行的总计超过2000万个事务。我们发现,在23327份合同中,最多有463份受到了侵害,但最多有8487 ETH170万美元),或者说只有0.27%%300ETH6亿美元)的潜在风险被发现。最后,我们发现大部分Ether仅由少数合同持有,并且报告的这些漏洞要么是误报,要么在实践中不可利用,从而为我们的结果提供了合理的解释。

静态工具和动态工具

分析工具大致可以分为两类:静态分析工具和动态分析工具。使用术语静态相当宽松,静态分析工具可以定义为不需要部署智能合约就可以捕获bug或漏洞的工具。运行时分析工具试图通过执行部署的契约来检测这些。我们的工具属于第二类。

静态分析工具。静态分析工具一直是研究的重点。这是可以理解的,因为避免已部署契约中的漏洞是多么重要。这些工具大多通过分析字节码或契约的高级代码以及检查已知的易受攻击的模式来工作。

推荐阅读