在本文中,我们将简要解释重入和跨函数重入之间的区别,以及图灵不完全性如何防止一些这样的攻击。
其中,我们将提供一个跨功能复用的案例。在这种情况下,嘉手纳区块链使用编程语言公约,但图灵的不完整性并不能防止这种恶意利用。
活动简介嘉手纳区块链旨在实现比其他L1连锁店更高的可扩展性、安全性和可用性。它开发了一种书写智能合同的新语言:Pact。
该语言可读性强,易于形式化验证,并且具有图灵不完全性,可以提高安全性。
这里说的图灵不完全性,是指Pact做不到图灵完全编程语言(比如Solidity或者Haskell)能做到的事情——这看起来是个缺点,但实际上,智能合约编程,哪怕是最复杂的DeFi协议,也很少需要图灵完全性。
图灵的不完全性最重要的一点是没有递归。虽然这确实大大减少了攻击面,但有些“经典”攻击是无法完全避免的。接下来我们就来说说跨函数再入的问题。
经典再入攻击再入攻击是一个非常常见的安全问题。这个问题不仅开发人员很难发现,审计人员也很难检查它将导致的所有潜在后果。
重入攻击依赖于函数在进行外部调用前后执行特定任务的顺序。
如果一个契约调用了一个不可信的外部契约,攻击者可以让它反复重复函数调用,形成递归调用。而如果重新进入的功能执行了重要的任务(比如更新账户余额),可能会导致灾难性的后果。
下面是一个简化的例子。
我们称易受攻击的合同为不安全合同,恶意合同为攻击合同。
1.攻击者调用不安全的合同将资金转移到攻击合同。
2.不安全契约在接到调用后,首先检查攻击者是否有资金,然后将资金转入攻击契约。
3.在收到资金后,攻击契约执行回退功能,并在更新余额之前回调不安全契约,从而重新开始该过程。
因为这种攻击是通过* *递归调用进行的,如果语言不是图灵完整,攻击是不可能的。
跨函数重入跨函数重入与经典的重入攻击类似,只是重入函数与发出外部调用的函数不同。这种再入攻击通常更难检测——因为在复杂的协议中,组合的可能性太多,无法手动测试每一种可能的结果。
这就引出了我们的概念证明:一个使用Pact语言的简单跨函数再入攻击。
Pact模块中的简单交叉函数再入
正如我们在下面的代码片段中看到的,协定中的函数对实现特定接口的另一个协定进行外部调用。这允许重新进入设计好的攻击合同。Pact中的函数是内置函数,可以授予用户执行敏感任务的权限。以下代码仅用于说明,并非取自真实案例合同。
我们将使用的代码示例包含三个部分:
1.合同界面
用于使主合同与恶意外部模块进行交互。
2.主要模块
被攻击的模拟样本合同
首先,数据库被定义为一个表,其中字符串存储在带有相关十进制数的行中。
然后定义了一个能力:信用(在本例中始终为真)。这个条件是credit函数所必需的,但是它只能由with_capability语句中的bad_function在内部授予。这意味着直接调用信贷会失败。
现在,函数credit定义如下:它增加作为输入的字符串的余额(小数点)。如果地址不在表中,它也会创建条目。
最后,函数bad_function增加了legit_address的余额,但也调用了符合前面定义的接口的契约,该接口可以作为输入参数提供。函数get-balance允许我们读取表格。
3.触发再入的模块:
重新进入主模块,调用信用函数。
一般流程如下:
A.以攻击契约为参数调用bad_function。
B.授予信用功能。
C.“合法地址”的余额增加了10。
D.调用恶意模块的external_function:因为它还有信用函数,所以可以重新进入契约,直接调用信用函数到& # 8220;攻击者地址& # 8220;余额为100英镑。
之后,(get-balance & # 8220;合法地址& # 8221;)返回10,(get-balance & # 8220;攻击者_地址& # 8221;)返回100。
再入成功。
现在,如果我们不再调用credit,而是尝试再次调用bad_function,会发生什么?即使第一次调用credit成功了,由于重入是在bad_function中,所以会是递归调用,执行会失败。
现在,如果我们尝试直接调用external_function,它将不起作用,因为所需的函数CREDIT尚未被授予。
通过去除递归,图灵不完全性可以防止一些载体再次攻击。
但是,由于跨函数重入可以在没有递归调用的情况下进行,所以图灵不完全性并不能阻止所有这类攻击载体,所以用户在与这种语言交互时,不应该假设重入不会造成不良影响。
重入和跨函数重入是非常常见的安全问题,在Web3.0领域发生了一系列大规模的攻击。
作为一种智能契约编程语言,Pact有着巨大的潜力。
它的方法与Solidity或Haskell等其他语言有些不同。Pact并不完全依靠图灵不完全性来提高安全性;该语言旨在更易于阅读、理解和正式验证。
然而,没有一种编程语言能够免受所有攻击媒介的影响。因此,开发人员必须了解他们使用的语言的独特功能,并在部署之前彻底审核所有项目。
目前,CertiK的审计和端到端解决方案已覆盖市面上绝大多数生态系统,支持几乎所有主流编程语言,为区块链平台、数字资产交易平台、智能合约安全等领域的各类生态链提供安全技术支持。
温馨提示:注:内容来源均采集于互联网,不要轻信任何,后果自负,本站不承担任何责任。若本站收录的信息无意侵犯了贵司版权,请给我们来信(j7hr0a@163.com),我们会及时处理和回复。
原文地址"智能合约重入漏洞,以Kadena智能合约为例 简析如何规避重入攻击和跨函数攻击":http://www.guoyinggangguan.com/qkl/179144.html。
微信扫描二维码关注官方微信
▲长按图片识别二维码