委托给不受信任的调用者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个区块后发生的哈希删除。但是到那时,他们中的许多人根本就没有下注。这将使某人可以对许多这些功能相似的智能合约下注,并以一定的结果作为所有人的赢家,在主持人仍未决的情况下检查主持人的提交,并且如果不利,只需阻塞区块链,直到进行修剪即可,得到他们的注。不遵守标准在智能合约开发方面,遵循标准很重要。设置标准是为了防止漏洞,而忽略这些漏洞可能会导致意想不到的后果。
公链项目Shardeum完成1820万美元融资,Jane Street等参投:10月18日消息,公链项目 Shardeum 宣布完成 1820 万美元融资,Spartan Group、Big Brain Holdings、Jane Street 和 Foresight Ventures 等机构参投。Shardeum 由知名印度交易平台 WazirX 的创始人 Nischal Shetty 创立,采用 PoS 和动态分片技术提升 Layer1 的效率。(the block)[2022/10/18 17:31:14]
本文编译自Medium
The Encyclopedia of Smart Contract Attacks and Vulnerabilities
https://medium.com/better-programming/the-encyclopedia-of-smart-contract-attacks-vulnerabilities-dfc1129fdaac
Socios.com将帮助橄榄球联盟俱乐部Stade Fran?ais和The Sharks推出粉丝代币:8月4日消息,粉丝代币平台Socios.com宣布法国橄榄球联盟俱乐部Stade Fran?ais和南非职业橄榄球联合队 The Sharks 建立合作伙伴关系,将帮助推出粉丝代币和连接球迷。[2022/8/4 12:02:10]
动态 | 数字资产管理公司CoinShares等3家公司合作推出黄金代币:据美通社消息,由数字资产管理公司CoinShares、加密货币产品提供商Blockchain和MKS (Switzerland) SA组成的财团今天宣布已经推出了价值逾2000万美元的数字化黄金DGLD网络。DGLD是一种数字资产(代币),表示存储在瑞士保险库里的已分配的实物黄金,并通过建立在比特币网络上的侧链进行标记。[2019/10/15]
声音 | Ryan X Charles:比特币若成世界货币价格或达100万美元:最近,Money Button的首席执行官Ryan X Charles上传了一段视频,分享了他对比特币(BTC)现状的看法,他表示,如果比特币成为世界货币价格可能达到100万美元。[2018/10/22]
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。