NBS:Hardcore | 以太坊中智能合约攻击和漏洞百科全书

委托给不受信任的调用者Delegatecall是消息调用的一种特殊变体。它几乎与常规消息调用相同,只是目标地址在调用协定的上下文中执行,msg.sender和msg.value保持不变。实际上,delegatecall委托其他智能合约修改调用智能合约的存储。由于delegatecall提供了对智能合约的如此多的控制权,因此只将其用于可信的智能合约(比如您自己的智能合约)是非常重要的。如果目标地址来自用户输入,请确保它是受信任的协定。签名延展性人们通常会假设在智能合约中使用加密签名系统会验证签名是否唯一; 但是事实并非如此。在以太坊中的签名可以在没有私钥的情况下进行更改并保持有效。 例如椭圆密钥密码术由三个变量v,r和s组成,如果以正确的方式修改了这些值,则可以获得带有无效私钥的有效签名。为避免签名可延展性的问题,切勿在签名消息哈希中使用签名来检查智能合约是否已处理了先前签名的消息,因为恶意用户可以找到并重新创建您的签名。构造函数名称不正确在Solidity 0.4.22之前,定义构造函数的唯一方法是使用智能合约名称创建函数。在某些情况下,这是有问题的。 例如如果智能合约以不同的名称重复使用,但构造函数也未更改,则它将变成常规的可调用函数。现在,使用Solidity的现代版本,您可以使用Constructor关键字定义构造函数,从而有效弃用此漏洞。 因此,解决此问题的方法只是使用现代的Solidity编译器版本。隐藏状态变量在Solidity中可以两次使用相同的变量,但可能会导致意外的副作用。 对于使用多个智能合约,这尤其困难。 请看以下示例:contract SuperContract {  uint a = 1;contract SubContract is SuperContract {  uint a = 2;在这里,我们可以看到SubContract继承了SuperContract,并且变量a被两次定义为不同的值。 现在,假设我们使用a在SubContract中执行某些功能。 由于已修改a的值,因此从SuperContract继承的功能将不再起作用。为避免此漏洞,重要的是我们检查整个智能合约系统是否存在歧义。检查编译器警告也很重要,因为只要它们在智能合约中,它们就可以标记这些歧义。区块链属性的随机性来源较弱在以太坊中,某些应用程序依赖于随机数的生成来保持公平。但是在以太坊中,随机数的生成非常困难,并且有一些陷阱值得考虑。使用诸如block.timestamp,blockhash和block.difficulty之类的链属性似乎是个好主意,因为它们通常会产生伪随机值。然而,问题在于矿工修改这些值的能力。 例如在具有数百万美元大奖的应用中,矿工有足够的动力去生成许多替代区块,只选择会导致矿工中奖的区块。当然,要像这样控制区块链会付出巨大的代价,但是如果注足够高,那肯定可以做到。为了避免在随机数生成中操纵矿工,有一些解决方案:1. 承诺方案,例如RANDAO,DAO,其中随机数由DAO中的所有参与者生成。2. 通过oracle的外部来源-例如Oraclize。3. 使用比特币区块哈希,因为网络更加分散,区块的开采成本更高。缺少针对签名重放攻击的保护有时在智能合约中,有必要执行签名验证以提高可用性和气体的成本。但是在实施签名验证时需要考虑。为了防止签名重放攻击,智能合约应仅允许处理新的哈希。这样可以防止恶意用户多次重播另一个用户的签名。为了更加安全地进行签名验证,请遵循以下建议:· 存储智能合约处理的每个消息哈希,然后在执行功能之前对照现有哈希检查消息哈希。· 在哈希中包括合同的地址,以确保消息仅在单个合同中使用。· 切勿生成包含签名的消息哈希。违反条例equire()方法用于验证条件,例如输入或智能合约状态变量,或验证来自外部智能合约调用的返回值。 为了验证外部调用,可以由调用者提供输入,也可以由被调用返回输入。如果被调用方的返回值发生输入冲突,则可能是以下两种情况之一出了问题:· 提供输入的合同中有一个bug。· 要求条件太强。要解决此问题,首先要考虑需求条件是否太强。如有必要,请减弱它以允许任何有效的外部输入。如果问题不是必需条件,则智能合约中必须有提供外部输入的错误。确保此智能合约未提供无效输入。写入任意存储位置只有授权地址才能访问敏感存储位置。如果整个智能合约中没有适当的授权检查,则恶意用户可能会覆盖敏感数据。但是即使存在用于写入敏感数据的授权检查,攻击者仍可能能够通过不敏感数据覆盖敏感数据。 这可能使攻击者可以覆盖重要的变量,例如智能合约所有者。为了防止这种情况的发生,我们不仅要保护具有授权要求的敏感数据存储,而且还要确保对一个数据结构的写入不会无意间覆盖另一数据结构的条目。继承顺序不正确在Solidity中,可以从多个来源继承,如果不能正确理解,则可能会引起歧义。这种歧义被称为钻石问题:如果两个基本智能合约具有相同的函数,那么哪个优先? 幸运的是,只要开发人员了解解决方案,Solidity就可以很好地处理此问题。Solidity为钻石问题提供的解决方案是使用反向C3线性化。这意味着它将使继承从右到左线性化,因此继承的顺序很重要。建议从更一般的智能合约开始,再到更具体的智能合约结束,以避免出现问题。具有函数类型变量的任意跳转Solidity支持函数类型。这意味着可以将类型为function的变量分配给具有匹配签名的函数。然后可以像其他任何函数一样从变量中调用该函数。用户不应更改函数变量,但是在某些情况下,这是可能的。如果智能合约使用某些汇编指令(例如mstore),则攻击者可能能够将函数变量指向任何其他函数。这可能使攻击者能够破坏智能合约的函数,甚至可能耗尽智能合约资金。由于内联汇编是从底层访问EVM的一种方式,因此它绕过了许多重要的安全功能。 因此,只有在必要且正确理解的情况下,才使用汇编程序。存在未使用的变量尽管允许,但最好的做法是避免使用未使用的变量。 未使用的变量会导致一些不同的问题:· 计算量增加(不必要的气体消耗)· 错误或数据结构错误的指示· 代码可读性降低强烈建议从代码库中删除所有未使用的变量。意外的以太坊余额由于始终可以将以太坊发送到智能合约中(请参阅“强行将以太币发送到智能合约”)-如果智能合约具有特定的余额,则很容易受到攻击。假设我们有一个智能合约,如果智能合约中存储了任何以太坊,则该智能合约将阻止所有函数执行。如果恶意用户决定通过强行发送Ether来利用此漏洞,则将引发DoS,使智能合约无法使用。 因此请勿对智能合约中的以太坊余额使用严格的平等检查,这一点很重要。以太坊智能合约代码始终可以被读取。即使您的代码未在Etherscan上进行验证,攻击者仍然可以反编译甚至检查与它之间的事务以进行分析。这里的一个问题示例是猜谜游戏,用户必须猜测所存储的私有变量才能赢得合同中的以太坊。当然这是极其琐碎的利用(要点是您不应该尝试,因为它几乎可以肯定是蜜罐合约,要复杂得多)。这里的另一个常见问题是在Oracle调用中使用未加密的链下机密(例如API密钥)。如果可以确定您的API密钥,恶意行为者可以简单地自己使用它或利用其他媒介,例如用尽您允许的API调用并强迫Oracle返回错误页面,这可能会或可能不会导致问题,具体取决于智能合约的结构。检测智能合约中错误有些智能合约不希望其他智能合约与之交互。防止这种情况的常见方法是检查主叫帐户中是否存储了任何代码。但是智能合约帐户在构建过程中发起调用仍不会显示它们存储代码,从而有效地绕过了智能合约检测。非封闭区块链依赖许多智能合约依赖于在一定时间内发生的调用,但以太坊可以在相当长的时间内以相对便宜的价格通过非常高的Gwei交易进行垃圾邮件发送。如Fomo3D(倒数游戏,最后一位投资者赢得了头奖,但每项投资都增加了倒计时的时间)是由一个用户赢得的,该用户在短时间内完全阻塞了区块链,不允许其他人在定时器运行之前进行投资出局,他赢了得了比赛。如今有许多经纪人合同依靠过去的哈希来提供RNG。在大多数情况下,这不是可怕的RNG来源,甚至可以解释256个区块后发生的哈希删除。但是到那时,他们中的许多人根本就没有下注。这将使某人可以对许多这些功能相似的智能合约下注,并以一定的结果作为所有人的赢家,在主持人仍未决的情况下检查主持人的提交,并且如果不利,只需阻塞区块链,直到进行修剪即可,得到他们的注。不遵守标准在智能合约开发方面,遵循标准很重要。设置标准是为了防止漏洞,而忽略这些漏洞可能会导致意想不到的后果。

Charles Maniace:数字资产和区块链将迫使销售税演变:金色财经报道,美国税务合规公司Sovos的监管分析和设计副总裁Charles Maniace表示,随着NFT的日益普及和对区块链交易征收销售税的可能实施,立法者应该迎接挑战,提供有助于合规的清晰和全面的指导。州立法者和监管机构在将销售税应用于区块链上交易的数字资产方面面临的销售税挑战是新的,但绝不是前所未有的。有很多场合要求销售税监管机构应对不断发展的技术的挑战。公平地说,最近的销售税规则已经落后于技术一步。

随着NFT的日益普及以及越来越多的州考虑对区块链交易征收销售税,立法者应该迎接挑战,提供反映现实的清晰和全面的指导,并为公司提供合理的合规途径。[2022/8/25 12:48:46]

本文编译自Medium

The Encyclopedia of Smart Contract Attacks and Vulnerabilities

https://medium.com/better-programming/the-encyclopedia-of-smart-contract-attacks-vulnerabilities-dfc1129fdaac

以太坊开发环境工具Hardhat发布v2.7.0版:11月25日消息,以太坊开发环境工具Hardhat发布v2.7.0版,自动挖矿被禁用时,它支持按FIFO顺序挖矿交易。此外,该版本还允许用户通过配置和运行时自定义coinbase地址。[2021/11/25 7:09:38]

CoinShares将为Pyth Network提供实时加密资产定价数据:欧洲数字资产投资平台CoinShares International Limited宣布,将为Solana生态预言机解决方案Pyth Network直接提供实时加密资产定价数据。(PRNewswire)[2021/8/5 1:36:16]

加密ETP产品提供商21Shares资产管理规模超过1亿美元:位于瑞士的加密交易所交易产品(ETP)产品提供商21Shares今日宣布,它首次突破了1亿美元的管理资产规模。该公司称,欧洲散户和机构投资者对其产品的需求正在增加。(TheBlock)[2020/8/17]

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

ICP区块链:区块链在过去的10年里为何大起大落?

专家简介刘盟先生负责领导Forrester中国地区金融领域数字化策略研究。他精通区块链、金融机构数字化转型战略、新兴科技赋能传统金融行业的发展趋势以及最新案例,主要研究方向为:金融科技对金融行业.

[0:15ms0-1:36ms