您好,欢迎您来到国盈网!
官网首页 小额贷款 购房贷款 抵押贷款 银行贷款 贷款平台 贷款知识 区块链

国盈网 > 区块链 > 智能合约重入漏洞,以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击

智能合约重入漏洞,以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击

区块链 岑岑 本站原创

在本文中,我们将简要解释重入和跨函数重入之间的区别,以及图灵不完全性如何防止一些这样的攻击。

其中,我们将提供一个跨功能复用的案例。在这种情况下,嘉手纳区块链使用编程语言公约,但图灵的不完整性并不能防止这种恶意利用。

活动简介嘉手纳区块链旨在实现比其他L1连锁店更高的可扩展性、安全性和可用性。它开发了一种书写智能合同的新语言:Pact。

该语言可读性强,易于形式化验证,并且具有图灵不完全性,可以提高安全性。

这里说的图灵不完全性,是指Pact做不到图灵完全编程语言(比如Solidity或者Haskell)能做到的事情——这看起来是个缺点,但实际上,智能合约编程,哪怕是最复杂的DeFi协议,也很少需要图灵完全性。

图灵的不完全性最重要的一点是没有递归。虽然这确实大大减少了攻击面,但有些“经典”攻击是无法完全避免的。接下来我们就来说说跨函数再入的问题。

经典再入攻击再入攻击是一个非常常见的安全问题。这个问题不仅开发人员很难发现,审计人员也很难检查它将导致的所有潜在后果。

重入攻击依赖于函数在进行外部调用前后执行特定任务的顺序。

如果一个契约调用了一个不可信的外部契约,攻击者可以让它反复重复函数调用,形成递归调用。而如果重新进入的功能执行了重要的任务(比如更新账户余额),可能会导致灾难性的后果。

下面是一个简化的例子。

我们称易受攻击的合同为不安全合同,恶意合同为攻击合同。

1.攻击者调用不安全的合同将资金转移到攻击合同。

2.不安全契约在接到调用后,首先检查攻击者是否有资金,然后将资金转入攻击契约。

3.在收到资金后,攻击契约执行回退功能,并在更新余额之前回调不安全契约,从而重新开始该过程。

以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击

因为这种攻击是通过* *递归调用进行的,如果语言不是图灵完整,攻击是不可能的。

跨函数重入跨函数重入与经典的重入攻击类似,只是重入函数与发出外部调用的函数不同。这种再入攻击通常更难检测——因为在复杂的协议中,组合的可能性太多,无法手动测试每一种可能的结果。

这就引出了我们的概念证明:一个使用Pact语言的简单跨函数再入攻击。

Pact模块中的简单交叉函数再入

正如我们在下面的代码片段中看到的,协定中的函数对实现特定接口的另一个协定进行外部调用。这允许重新进入设计好的攻击合同。Pact中的函数是内置函数,可以授予用户执行敏感任务的权限。以下代码仅用于说明,并非取自真实案例合同。

我们将使用的代码示例包含三个部分:

1.合同界面

以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击

用于使主合同与恶意外部模块进行交互。

2.主要模块

以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击

被攻击的模拟样本合同

首先,数据库被定义为一个表,其中字符串存储在带有相关十进制数的行中。

然后定义了一个能力:信用(在本例中始终为真)。这个条件是credit函数所必需的,但是它只能由with_capability语句中的bad_function在内部授予。这意味着直接调用信贷会失败。

现在,函数credit定义如下:它增加作为输入的字符串的余额(小数点)。如果地址不在表中,它也会创建条目。

最后,函数bad_function增加了legit_address的余额,但也调用了符合前面定义的接口的契约,该接口可以作为输入参数提供。函数get-balance允许我们读取表格。

3.触发再入的模块:

以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击

重新进入主模块,调用信用函数。

一般流程如下:

A.以攻击契约为参数调用bad_function。

B.授予信用功能。

C.“合法地址”的余额增加了10。

D.调用恶意模块的external_function:因为它还有信用函数,所以可以重新进入契约,直接调用信用函数到& # 8220;攻击者地址& # 8220;余额为100英镑。

以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击

之后,(get-balance & # 8220;合法地址& # 8221;)返回10,(get-balance & # 8220;攻击者_地址& # 8221;)返回100。

再入成功。

现在,如果我们不再调用credit,而是尝试再次调用bad_function,会发生什么?即使第一次调用credit成功了,由于重入是在bad_function中,所以会是递归调用,执行会失败。

以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击

现在,如果我们尝试直接调用external_function,它将不起作用,因为所需的函数CREDIT尚未被授予。

以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击

通过去除递归,图灵不完全性可以防止一些载体再次攻击。

但是,由于跨函数重入可以在没有递归调用的情况下进行,所以图灵不完全性并不能阻止所有这类攻击载体,所以用户在与这种语言交互时,不应该假设重入不会造成不良影响。

重入和跨函数重入是非常常见的安全问题,在Web3.0领域发生了一系列大规模的攻击。

作为一种智能契约编程语言,Pact有着巨大的潜力。

它的方法与Solidity或Haskell等其他语言有些不同。Pact并不完全依靠图灵不完全性来提高安全性;该语言旨在更易于阅读、理解和正式验证。

然而,没有一种编程语言能够免受所有攻击媒介的影响。因此,开发人员必须了解他们使用的语言的独特功能,并在部署之前彻底审核所有项目。

目前,CertiK的审计和端到端解决方案已覆盖市面上绝大多数生态系统,支持几乎所有主流编程语言,为区块链平台、数字资产交易平台、智能合约安全等领域的各类生态链提供安全技术支持。

温馨提示:注:内容来源均采集于互联网,不要轻信任何,后果自负,本站不承担任何责任。若本站收录的信息无意侵犯了贵司版权,请给我们来信(j7hr0a@163.com),我们会及时处理和回复。

原文地址"智能合约重入漏洞,以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击":http://www.guoyinggangguan.com/qkl/179144.html

微信扫描二维码关注官方微信
▲长按图片识别二维码