摘要
论文提出了一种动态的分析工具,可以保护智能合约在执行期间不被利用。它检测新漏洞的能力可以被所谓的“攻击模式”(attack pattern)所扩展。这种模式用特定领域的语言来编写,这种语言专门用来执行以太坊智能合约的模型,还可以用来描述恶意的控制和数据流。此外,还提出了一种新的机制来简化和加快管理攻击模式的过程。 模式pattern通过一个智能合同被投票和存储,从而利用了区块链提供的防篡改以及透明度的优点。
重入攻击
这是一个重入攻击的例子,攻击者B通过调用合约A的withdraw函数取款,当A执行call.value()时自动调用B的fallback函数,实现函数的重入。
论文定义了一种DSL语言,来描述攻击模式。当用户执行操作时,对比这个操作和已有的攻击模式,如果匹配就判断这是一个攻击操作。
这是一个重入攻击,用DSL来创建这个攻击模式,可以检测并防止函数重入问题:
如果一个交易满足以下两个条件,则认为这是一个重入攻击模式:
(1)两个CALL指令之间有一个控制流关系,前面的称为源操作码,后面的称为目的操作码。条件是两个指令共享相同的调用目的地(即. src. stack(1) = dst.stack(1))),由同一合约执行(即src.address = dst.address),并共享相同的程序计数器(即src.pc=dst.pc);
(2)两个SSTORE指令 遵循前向控制流关系,其中两个指令都写入相同的存储位置(即src.stack(0)=dst.stack(0)),由同一合约执行(即src.address = dst.address),并且第一个指令的堆栈深度比第二指令更深(即src.depth > dst.depth)
Decentralized Security Updates
将模式存储在区块链上并且实现去中心化的安全更新,需要考虑两个问题:
(1) 如何在所有客户端中分发和执行相同的模式
(2)如何对模式进行去中心化管理,以防止单个实体随意决定添加或删除模式
解决方案是使用一个部署在区块链上的智能合约,将模式存储在智能合约中,区块链协议本身保证每个客户端都获得完全相同的状态,因此可以访问完全相同的模式。
第二个对模式进行去中心化治理的问题是通过允许对模式进行提议和投票来解决的。
步骤1) 信用良好的用户检测到漏洞并向智能合约提出一个新攻击模式(使用我们的DSL编写)。
步骤2) 智能合约中维护着一个合法的投票人列表,他们投票选择接受或拒绝这个新的模式。如果大多数人投了“是”,即接受该模式,该模式将被添加到活动模式列表中。这个时候,每个客户端都会收到智能合约事件机制的自动通知,并从区块链中检索更新的模式列表。
步骤3) 当攻击者尝试去攻击存在漏洞的智能合约,如果这个恶意的交易的执行轨迹和投票通过的模式匹配,那么攻击者就被判断为恶意攻击,攻击失败。
Architecture of ÆGIS
EVM:修改以太坊虚拟机使它在运行时以有序列表的形式跟踪记录所有执行的指令及其状态。 列表中的每条记录都包含了已执行的操作码、程序计数器的值、调用堆栈的深度、正在执行的合同的地址,以及所有存储在堆栈和内存中的值 。这个列表传递给解释器组件。
Interpreter:解释器循环执行指令列表,并将相关指令传递给控制流提取器和数据流提取器组件。一旦发现交易的执行轨迹与已有的攻击模式匹配,便向EVM发送恢复信号,撤销恶意的操作。
控制流提取器:负责推断控制流信息,根据从翻译器中得到的指令,动态创建一棵调用树,如果在树中存在一条从源指令到目的指令的路径,则得到一个控制流关系。
数据流提取器:负责收集数据流信息,使用动态污点分析来跟踪指令之间的数据流。每当我们遇到源指令时,都会引入taint污点,每当我们遇到目标指令时,都会进行检查是否有污点。如果污点从源指令流向目标指令,则判断为数据流关系。
模式解析器:负责从投票的智能合约中提取和和解析模式