在这篇文章中,我们将简要地解释重入和跨函数重入之间的区别,以及图灵不完备性如何能够防止一些这样的攻击。
其中我们将提供一个跨函数重入利用的案例,该案例中Kadena区块链使用的是编程语言Pact,但图灵不完备性并未防止该恶意利用的发生。
Kadena区块链旨在实现比其他L1链更高的可扩展性、安全性和可用性。其开发了一种新的语言用以编写智能合约:Pact。
这种语言是人类可读的,且易于形式化验证,并具备可提高安全性的图灵不完备性。
这里提到的图灵不完备性意味着Pact无法做到图灵完备编程语言(如Solidity或Haskell)所能做到的那些事——看起来好像是个劣势,但其实智能合约编程,哪怕是最复杂的DeFi协议也很少会需要用到图灵完备性。
图灵不完备性最重要的一点是没有无界递归。虽然这确实大大减少了攻击面,但一些「经典」攻击是无法被100%避免的,接下来我们就会讲述跨函数重入的问题。
Paxful联创Ray Youssef承诺用个人股份创建公共信托基金,以保障用户利益:4月22日消息,已于4月18日卸任Paxful CEO一职的Ray Youssef发文称,由于他和联合创始人在公司的发展方向上陷入僵局,双方已经同意由律所Richards, Layton & Finger的Srinivas Raju(由法院命令任命)在整个过程中担任Paxful的托管人。作为托管人,Srini对公司及其运营和管理拥有完全的权力和控制权。在接下来的一个月里,Srini将试图帮助稳定Paxful,同时准备向法院提出有关该业务如何进行的建议。Srini正在考虑对Paxful的未来提出所有可能的建议。
Ray Youssef表示,虽然已辞去首席执行官的职务,但自己的首要任务仍将是解决用户资金被冻结的问题以及Paxful钱包的可靠性。在自己的努力下,88%的被冻结账户已被解冻。Paxful仍有略低于450美元的被冻结资金,约占所有不能提现的客户资金的3.3%。
Youssef此前曾向另一位联合创始人提出一项协议,要求他以1 satoshi购买Youssef在Paxful的所有股份,条件是他进行必要的合规工作以解冻剩余账户,但后者拒绝了这一提议。
现在Ray Youssef提出一个新的计划来解决问题,不需要另一位联合创始人的批准。Ray Youssef将把99.9%的Paxful个人股份(占公司45%以上的股份)放入一个公共信托基金。Ray Youssef的股份产生的资金将用于使每个Paxful用户资金完好无损。剩余的任何资金将直接提供给Built With Bitcoin Foundation以建设学校。
此外,Ray Youssef的目标是Paxful Wallet至少保持运行两年,这样Paxful可以将所有被冻结的资金从平台上拿出来,并给用户时间来取回它们。“通过我的公共信托,我仍将保留我的董事会投票权,并将继续让Paxful对用户的最佳利益负责。”[2023/4/23 14:20:52]
重入攻击是非常常见的安全问题。这个问题不仅很难被开发者发现,也很难被审计师审查出其会导致的所有潜在后果。
金融科技游说者:英格兰银行在开发数字英镑时必须考虑到加密行业:金色财经报道,金融科技游说者Adam Jackson周三在英国立法者委员会会议上表示,英格兰银行在决定如何发行中央银行数字货币时必须考虑到加密行业的竞争力。该委员会正在考虑一项监管稳定币的措施。
Innovate Finance政策主管Jackson对委员会的立法者说,当我们考虑央行数字货币(CBDC)以及如何实施时,有一个问题是我们是否可以将竞争目标应用于英格兰银行。
他补充说,CBDC“可能会排挤创新和稳定币,除非它的设计能够促进竞争”。(CoinDesk)[2022/10/20 16:31:17]
重入攻击取决于函数在进行外部调用之前和之后执行的特定任务的顺序。
如果一个合约调用了一个不受信任的外部合约,攻击者可以让它一次又一次地重复这个函数调用,形成一个递归调用。而如果重新输入的函数执行重要的任务(如更新账户的余额),那这可能就会导致灾难性的后果。
数据:BitMEX上BTC 24小时永续合约交易量达5年来低点:金色财经报道,Glassnode数据显示,BitMEX上BTC 24小时永续合约交易量跌至260,782,573.74美元,创5年来新低。[2022/8/8 12:09:10]
下方是一个简化的例子。
我们把易受攻击的合约称为unsafe合约,把恶意的合约称为Attack合约。
1. 攻击者调用unsafe合约,以将资金转移到Attack合约中。
2. 收到调用之后,unsafe合约首先检查攻击者是否有资金,然后将资金转移到Attack合约。
3. 收到资金后,Attack合约执行回退函数,在它能够更新余额之前回调到不安全的合约,从而重新启动该过程。
因为这种攻击是通过无界递归调用进行的,所以如果语言不是图灵完备的,攻击就不可能进行。
持有32枚以上ETH的地址数量达到17个月高点:金色财经报道,Glassnode数据显示,持有32个以上ETH代币的地址数量刚刚达到117,257的17个月高点,之前的17个月高点为117,244。[2022/8/1 2:51:21]
跨函数重入类似于经典的重入攻击,除了重入的函数与进行外部调用的函数功能不同。这种重入攻击通常更难被发现——因为在复杂的协议中,组合的可能性太多,无法手动测试每个可能的结果。
这就引出了我们的概念证明:使用Pact语言进行简单的跨函数重入攻击。
Pact模块中的简单跨函数重入
正如我们在下方代码片段中看到的,合约中的函数对另一个实现特定接口的合约进行外部调用。这允许重入一个设计好的攻击合约。Pact中的功能是内置函数,可授予用户权限来执行敏感任务。以下代码仅供说明之用,并非取自真实案例合约。
我们将使用的代码例子包含三个部分:
1. 合约接口
中国物流与采购联合会:2021年产业区块链市场规模实现持续增长:7月8日消息,在今天举行的2022中国产业区块链大会上,中国物流与采购联合会发布《中国产业区块链发展报告(2022)》。根据报告,2021年,在我国疫情持续、多点散发的状态之下,产业区块链的市场规模仍实现持续增长,区块链和各产业进一步相互融合发展,在防伪溯源、数据共享、供应链管理、存证取证、城市治理、智慧城市、政务服务等领域持续发展。企业数量规模方面,区块链企业已近10万家,2021年成立企业实现新突破。(央视新闻)[2022/7/8 2:00:15]
用以使主合约与一个恶意的外部模块进行交互
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
链得得
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。