编译器漏洞无解?Runtime Protection实现DeFi链上风控保护’ 精简后为: ‘编译器漏洞无解?Runtime Protection实现DeFi链上风控保护

'编译器漏洞无解?Runtime Protection实现DeFi链上风控保护'

重入攻击:挑战与运行时保护的解决方案

摘要: 重入攻击仍然是一个挑战,现有的防御手段主要集中在协议源代码层面,仅在合约进入 runtime 状态前生效。“运行时保护”是 DeFi 安全的重要补充,它以”保护执行结果”为目的,确保协议的执行与其预期设计一致。EVM 的设计不支持”运行时保护”,因为智能合约无法访问 runtime 状态全部上下文信息。Artela探索一种 EVM+Extension 的执行层范式,增强执行层以消除重入攻击。Artela通过 Aspect Programming 实现链上”运行时保护”扩展,逐步展示了如何通过 Aspect 防范对 Curve 合约的重入攻击。

为什么尽管存在风险控制措施,重入攻击仍然是一个挑战

尽管重入攻击是一个众所周知的问题,并且出现了许多风险控制措施,但在过去的两年中,涉及此类攻击的安全事件仍在不断发生。例如:Curve Finance、Origin Protocol、Siren Protocol和Cream Finance等项目都曾受到重入攻击。

目前,防范重入攻击的重点集中在智能合约的源代码层面,措施包括集成OpenZeppelin的ReentrancyGuard和对合约逻辑代码进行安全审计,以避免预定义的安全隐患。这种方法被称为”白盒”解决方案,旨在在源代码层面规避漏洞,以最小化逻辑错误。然而,其主要挑战在于无法防御未知隐患,即使源代码看起来毫无瑕疵,由于编译器问题,漏洞仍可能意外出现。

由此可见,仅仅依靠协议在源代码和编译层面的安全性是不足够的,我们需要一种能够保护协议在运行时执行结果的方法。

我们需要运行时保护

与现有的风险控制措施集中在协议源代码层面并在运行之前生效不同,运行时保护涉及协议开发人员编写运行时保护规则和操作,以处理运行时的未预料情况。这有助于对运行时执行结果进行实时评估及应对。

运行时保护在增强 DeFi 安全性方面至关重要,是现有安全措施的重要补充。通过以”黑盒”方式保护协议,它通过确保最终运行结果与协议预期设计相一致来增强安全性,而无需直接干涉合约代码执行。

实施运行时保护的挑战

不幸的是,EVM 设计不支持在链上实现运行时保护,因为智能合约无法访问完整的运行时上下文。为了克服这一挑战,我们需要满足以下先决条件:

  1. 一个专门的模块,可以访问跨智能合约的所有信息,包括整个交易上下文。
  2. 从智能合约获得必要的授权,使模块有权根据需要回撤(revert)交易。
  3. 确保模块的功能在智能合约执行后和状态提交之前生效。

然而,EVM 目前面临限制,难以容纳更多创新。在模块化区块链的范式下,执行层需要探索超越 EVM 的突破。Artela的思路是EVM + native extension,通过构建 EVM 的 WASM 原生扩展层以实现超越 EVM。

Aspect Programming 介绍

Artela推出了Aspect Programming,这是支持Artela区块链的一种编程框架,支持在区块链上进行原生扩展。

Aspect是可编程的原生扩展模块,用于在运行时动态集成自定义功能到区块链中,作为智能合约的模块化补充,增强链上功能性。

Aspect的特性是能够访问区块链基础层的系统级 API,并在交易生命周期的各个切点(Join Point)添加扩展逻辑。智能合约可以绑定指定的Aspect以触发扩展功能。当交易调用智能合约时,该交易也会经由与该合约关联的Aspect处理。

Aspect Programming 如何实现运行时保护

Aspect可以记录每个函数调用的执行状态,并防止在回调函数执行期间发生重入。当在回调函数执行期间发生重入调用时,Aspect会检测到并立即回撤该交易,防止攻击者利用重入漏洞。通过这种方法,Aspect有效地消除了重入攻击,确保智能合约的安全性和稳定性。

Aspect实现运行时保护的关键属性包括: – 可在智能合约执行后和状态提交前触发:Aspect模块可设置为在智能合约执行后但在状态提交前激活。 – 完整的交易上下文访问:Aspect可以访问完整的交易上下文,包括整个交易信息、调用栈、状态上下文变更以及所有交易触发的事件。 – 系统调用能力:Aspect可以进行系统调用,并在必要时发起交易回撤。 – 与智能合约的绑定和授权:智能合约可以绑定到Aspect,并授予Aspect参与交易处理的权限。

实施 Aspect 进行重入保护

可以在”preContractCall”和”postContractCall”的切点(Join Point)中部署一个实际的”合约保护意图”Aspect,以防止重入攻击。在”preContractCall”切点中,Aspect监控合约调用堆栈。如果在调用堆栈中有任何重复调用,Aspect将回撤该调用,防止意外重入。

部署 Curve 合约并防范重入攻击

我们编写了Curve模拟合约并复刻重入攻击,以更易理解的方式重现了这个过程。合约代码中使用了重入锁以保护add_liquidity和remove_liquidity函数。

通过使用Aspect来保护受攻击的合约,我们可以有效地防范重入攻击。在执行Aspect的相关操作后,再次调用攻击方法会被回撤,验证了Aspect的运行时保护功能。

结论

重入攻击仍然是 DeFi 领域面临的挑战之一。为了增强 DeFi 的安全性,运行时保护变得至关重要。通过以”黑盒”方式保护协议并确保协议的执行与其预期设计一致,可以有效地防止运行时的重入攻击。

Artela通过Aspect Programming提供了一种创新的解决方案,通过在链上实现运行时保护,成功防范了对 Curve 合约的重入攻击。Aspect Programming不仅可以实现运行时保护,在安全性领域还有诸多创新用例。它以 Cosmos SDK 为基础的通用框架,为 Artela 区块链以及其他区块链的构建提供支持。

链接:https://medium.com/artela-io/