在这篇文章中,我们将简要地解释重入和跨函数重入之间的区别,以及图灵不完备性如何能够防止一些这样的攻击。
其中我们将提供一个跨函数重入利用的案例,该案例中Kadena区块链使用的是编程语言Pact,但图灵不完备性并未防止该恶意利用的发生。
Kadena区块链旨在实现比其他L1链更高的可扩展性、安全性和可用性。其开发了一种新的语言用以编写智能合约:Pact。
这种语言是人类可读的,且易于形式化验证,并具备可提高安全性的图灵不完备性。
这里提到的图灵不完备性意味着Pact无法做到图灵完备编程语言(如Solidity或Haskell)所能做到的那些事——看起来好像是个劣势,但其实智能合约编程,哪怕是最复杂的DeFi协议也很少会需要用到图灵完备性。
图灵不完备性最重要的一点是没有无界递归。虽然这确实大大减少了攻击面,但一些「经典」攻击是无法被100%避免的,接下来我们就会讲述跨函数重入的问题。
zkSync Era网络用户地址数量突破100万个:6月27日消息,据 Dune Analytics 数据显示,zkSync Era 网络用户地址(指将资金转移至 zkSync Era 网络地址)数量已突破 100 万个。
截至发稿时,该网络总锁仓量为 6.39 亿美元。[2023/6/27 22:03:28]
重入攻击是非常常见的安全问题。这个问题不仅很难被开发者发现,也很难被审计师审查出其会导致的所有潜在后果。
重入攻击取决于函数在进行外部调用之前和之后执行的特定任务的顺序。
如果一个合约调用了一个不受信任的外部合约,攻击者可以让它一次又一次地重复这个函数调用,形成一个递归调用。而如果重新输入的函数执行重要的任务(如更新账户的余额),那这可能就会导致灾难性的后果。
下方是一个简化的例子。
我们把易受攻击的合约称为unsafe合约,把恶意的合约称为Attack合约。
ApeCoin社区关于“向以太坊社区捐赠100万美元”的提案已获投票通过:4月20日消息,Snapshot投票页面显示,ApeCoin社区关于“向以太坊社区捐赠100万美元”的AIP-230提案已获投票通过。该提案拟向ETHGlobal捐赠30万美元,向11场ApeCoin黑客松和至少5项公益活动赞助70万美元,旨在响应V神曾与2022年呼吁Ape资助公共商品的号召。
该提案投票的最终支持率为46.21%,反对率为29.96%,弃权率为23.84%。在ApeCoin投票机制中,弃权不影响表决结果。[2023/4/20 14:15:25]
1. 攻击者调用unsafe合约,以将资金转移到Attack合约中。
2. 收到调用之后,unsafe合约首先检查攻击者是否有资金,然后将资金转移到Attack合约。
3. 收到资金后,Attack合约执行回退函数,在它能够更新余额之前回调到不安全的合约,从而重新启动该过程。
加密行业游说团体寻求针对合法加密业务的de-banking信息:金色财经报道,加密行业游说团体 Blockchain Association 向美国联邦存款保险公司(FDIC)、美联储理事会和审计长办公室提交了《信息自由法》(FOIA) 请求,寻求在美国涉及加密货币公司的去银行化(de-banking)的文件和通信。BA 正在调查有关 de-banking 指控,包括关闭账户和拒绝开设新账户,以及监管机构可能处理不当导致 Signature、硅谷银行和 Silvergate 倒闭的行为。
Blockchain Association 呼吁所有受影响的加密货币行业参与者挺身而出,正在收集普通美国人和企业家因这种 de-banking 而受到伤害的故事。[2023/3/17 13:09:59]
因为这种攻击是通过无界递归调用进行的,所以如果语言不是图灵完备的,攻击就不可能进行。
BlockSec:项目/img/2023525234139/1.jpg" />
用以使主合约与一个恶意的外部模块进行交互
2. 主要模块
被攻击的模拟示例合约
首先,数据库被定义为一个表,其中字符串存储在具有关联十进制数的行中。
然后定义了一个能力:CREDIT(在这个示例中始终为真)。这个条件将是credit函数所需要的,但只被with_capability语句中的bad_function内部授予。这意味着直接调用credit会失败。
现在,函数credit被定义如下:它增加了作为输入的字符串的余额(小数点)。如果该地址不在表中,它还会创建该条目。
最后,函数bad_function增加了legit_address的余额,但也执行了对符合之前定义的接口的合约的调用,该合约可以作为一个输入参数提供。函数get-balance允许我们读取该表格。
3. 用于触发重入的模块:
重新进入主模块,调用credit函数
大致流程如下:
a. 以攻击合约为参数调用bad_function
b. CREDIT功能被授予
c. “legit_address”的余额增加了10
d. 调用恶意模块的external_function:因为它仍然具有CREDIT功能,它可以重新进入合约并直接调用credit函数,给 "attacker_address "一个100的余额。
之后,(get-balance "legit_address")返回10,(get-balance "attacker_address")返回100。
重入成功。
现在,如果我们不重入调用credit,而是尝试重入再次调用bad_function,会发生什么?即使第一次调用credit成功,由于重入是在bad_function中,这将是一个递归调用且执行将会失败。
现在,如果我们尝试直接调用external_function,这将不起作用,因为所需的功能CREDIT没有被授予。
通过移除无界递归,图灵不完备性可以防止一些重入攻击的载体。
然而,由于跨函数重入可以在没有递归调用的情况下进行,图灵不完备性并不能阻止所有此类攻击载体,因此用户在与这种语言交互时不应该假设重入不会造成恶劣影响。
重入和跨函数重入是非常常见的安全问题,Web3.0领域也因此发生了一系列规模巨大的攻击事件。
Pact作为一种智能合约编程语言,极具潜力。
它采取的方法与其他语言如Solidity或Haskell有些不同。Pact并不完全依靠图灵不完备性来提高安全性;该语言被设计地更容易阅读、理解和正式验证。
然而,没有哪种编程语言能对所有的攻击载体免疫。因此开发者必须了解他们所使用的语言的独特功能,并且在部署前对所有项目进行彻底审计。
目前,CertiK的审计及端到端解决方案已覆盖目前市面上大部分生态系统,并支持几乎所有主流编程语言,就区块链平台、数字资产交易平台、智能合约的安全性等领域为各个生态链提供安全技术支持。
CertiK中文社区
企业专栏
阅读更多
金色财经
金色早8点
Odaily星球日报
Arcane Labs
澎湃新闻
深潮TechFlow
欧科云链
MarsBit
BTCStudy
链得得
文/ Tripoli,加密资产独立研究人;译/金色财经xiaozou虽然具体日期还没确定,但以太坊上海升级已近在眼前.
1900/1/1 0:00:00NFT 作为一个2017年才出现的概念,在2018年至2020年一直处于生态发展的酝酿期,在2021年初开始迎来真正的爆发,一系列如CryptoPunk,The Sandbox.
1900/1/1 0:00:00撰文:Asher Zhang来源:比推 BitpushNews2022 年,加密市场整体低迷,在缺乏技术创新的背景下,DeFi 市场更是表现疲弱.
1900/1/1 0:00:00文:苏子华“Web3和区块链不是等号。”Draper Dragon合伙人王岳华对36氪表示。Draper Dragon成立于2006年,是一家活跃于中美的风险投资基金,投资领域涵盖智能制造、生物.
1900/1/1 0:00:00原文作者:加密分析师 Miles Deutscher2023 年将成为空投的重要一年。近年来,用户从一些热门项目空投中获得了万元以上的美味糖果,如 OP、ENS、UNI、APT 等等.
1900/1/1 0:00:00伴随着以太坊上海升级的日益临近,与之相关的各项提案也随之涌现,希望能赶上在上海升级中一并部署。EIP-5988 也在近期被提交至 Eips.ethereum 官方网.
1900/1/1 0:00:00