tài xỉu kiếm tiền(www.vng.app):联博api接口(www.326681.com)_以Kadena智能合约为例 简析若何规避重入攻击和跨函数攻击
,tài xỉu kiếm tiền(www.vng.app):tài xỉu kiếm tiền(www.vng.app) cổng Chơi tài xỉu uy tín nhất việt nam。tài xỉu kiếm tiền(www.vng.app)game tài Xỉu đánh bạc online công bằng nhất,tài xỉu kiếm tiền(www.vng.app)cổng game không thể dự đoán can thiệp,mở thưởng bằng blockchain ,đảm bảo kết quả công bằng.
在这篇文章中,我们将简要地注释重入和跨函数重入之间的区别,以及图灵不完整性若何能够防止一些这样的攻击。
其中我们将提供一个跨函数重入行使的案例,该案例中Kadena区块链使用的是编程语言Pact,但图灵不完整性并未防止该恶意行使的发生。
事宜简介
Kadena区块链旨在实现比其他L1链更高的可扩展性、平安性和可用性。其开发了一种新的语言用以编写智能合约:Pact。
这种语言是人类可读的,且易于形式化验证,并具备可提高平安性的图灵不完整性。
这里提到的图灵不完整性意味着Pact无法做到图灵完整编程语言(如Solidity或Haskell)所能做到的那些事——看起来似乎是个劣势,但着实智能合约编程,哪怕是最庞大的DeFi协议也很少会需要用到图灵完整性。
图灵不完整性最主要的一点是没有无界递归。虽然这确实大大削减了攻击面,但一些「经典」攻击是无法被100%制止的,接下来我们就会讲述跨函数重入的问题。
经典重入攻击
重入攻击是非经常见的平安问题。这个问题不仅很难被开发者发现,也很难被审计师审查出其会导致的所有潜在结果。
重入攻击取决于函数在举行外部挪用之前和之后执行的特定义务的顺序。
若是一个合约挪用了一个不受信托的外部合约,攻击者可以让它一次又一次地重复这个函数挪用,形成一个递归挪用。而若是重新输入的函数执行主要的义务(如更新账户的余额),那这可能就会导致灾难性的结果。
下方是一个简化的例子。
我们把易受攻击的合约称为unsafe合约,把恶意的合约称为Attack合约。
1. 攻击者挪用unsafe合约,以将资金转移到Attack合约中。
2. 收到挪用之后,unsafe合约首先检查攻击者是否有资金,然后将资金转移到Attack合约。
3. 收到资金后,Attack合约执行回退函数,在它能够更新余额之前回调到不平安的合约,从而重新启动该历程。
由于这种攻击是通过无界递归挪用举行的,以是若是语言不是图灵完整的,攻击就不能能举行。
跨函数重入
跨函数重入类似于经典的重入攻击,除了重入的函数与举行外部挪用的函数功效差异。这种重入攻击通常更难被发现——由于在庞大的协议中,组合的可能性太多,无法手动测试每个可能的效果。
这就引出了我们的观点证实:使用Pact语言举行简朴的跨函数重入攻击。
正如我们在下方代码片断中看到的,合约中的函数对另一个实现特定接口的合约举行外部挪用。这允许重入一个设计好的攻击合约。Pact中的功效是内置函数,可授予用户权限来执行敏感义务。以下代码仅供说明之用,并非取自真实案例合约。
我们将使用的代码例子包罗三个部门:
1. 合约接口
用以使主合约与一个恶意的外部模块举行交互
2. 主要模块
被攻击的模拟示例合约
,,www.u-healer.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。
首先,数据库被界说为一个表,其中字符串存储在具有关联十进制数的行中。
然后界说了一个能力: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的审计及端到端解决方案已笼罩现在市面上大部学生态系统,并支持险些所有主流编程语言,就区块链平台、数字资产生意平台、智能合约的平安性等领域为各个生态链提供平安手艺支持。
查看更多
网友评论