宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > Pol币 > 正文

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

作者:

时间:1900/1/1 0:00:00

委托给不受信任的调用者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个区块后发生的哈希删除。但是到那时,他们中的许多人根本就没有下注。这将使某人可以对许多这些功能相似的智能合约下注,并以一定的结果作为所有人的赢家,在主持人仍未决的情况下检查主持人的提交,并且如果不利,只需阻塞区块链,直到进行修剪即可,得到他们的注。不遵守标准在智能合约开发方面,遵循标准很重要。设置标准是为了防止漏洞,而忽略这些漏洞可能会导致意想不到的后果。

印度电信巨头Bharti Airtel收购区块链技术初创公司Aqilliz战略股份:2月24日,印度电信巨头Bharti Airtel宣布已经收购了区块链初创公司Aqilliz的战略股份,具体财务细节未透露。Airtel的目标是在其快速增长的广告技术(Airtel Ads)、数字娱乐(Wynk Music和Airtel Xstream)和数字市场(Airtel Thanks App)产品中大规模地部署Aqilliz的区块链技术。(NDTV)[2022/2/24 10:13:22]

本文编译自Medium

The Encyclopedia of Smart Contract Attacks and Vulnerabilities

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

Harvest Finance提交新提案欲推出新协议AP Wine Finance:2月26日消息,DeFi协议Harvest Finance官方发推宣布,第69号战略投资提案已提交快照投票。该提案计划推出AP Wine Finance。目前该策略仍是处于Beta测试中的协议,其允许储户利用其带有收益率的代币(iFARM、aDAI、yUSD)来获取未来收益代币(FYT)。当存入收益率较高的资产时,用户选择要锁定代币的时间段和数量,并且在锁定开始时,将按锁定代币数量1:1生成FYT代币。[2021/2/26 17:54:26]

Harvest Finance开启CRV:HBTC和CRV:HUSD存款业务:12月8日,Harvest Finance官方宣布已开启CRV:HBTC和CRV:HUSD两大资金池的存款业务。[2020/12/9 14:41:42]

Sonoco ThermoSafe开发药品供应链区块链平台PharmaPortal:Sonoco子公司Sonoco ThermoSafe正在开发一个独立于供应商的区块链平台,以提高药品供应链的透明度和可追溯性。PharmaPortal平台基于IBM区块链透明供应链(IBM Blockchain Transparent Supply)构建。

该平台的建立是为了满足不断增长的需求,即追踪不同供应链参与者的资产,并记录整个过程中发生的所有事件的真相。PharmaPortal最初将关注包括疫苗在内的温控药物的端到端可追溯性,并提供环境条件监测的审计跟踪。(Packaging)[2020/7/31]

标签:RACTRACONTRACBridge OracleDecentralized Eternal Virtual TravellerShibFalconTrace Network Labs

Pol币热门资讯
以太坊2.0规范0.1版本最终版发布 距离2.0年中上线迈出关键一步

以太坊2.0协调员Danny Ryan刚刚正式宣布发布以太坊2.0规范版本0.1的最终版本。 Ryan说: 其余的更改是一些小的优化和清理。这些中的大多数通常是向后兼容的,所有集成都应该非常简单.

1900/1/1 0:00:00
SEC表示将在2020年进一步加强区块链项目审查

今年,美国证券交易委员会(Securities and Exchange Commission,简称SEC)将深入调查加密货币交易所、托管机构、项目内部驱动和审核、交易商和经纪商。监管机构考虑将某些加密货币添加到证券注册的列表中.

1900/1/1 0:00:00
能源+区块链行业研究报告

能源作为一个体量巨大的传统行业,其与区块链的结合有着巨大的想象空间。目前,能源+区块链的行业应用主要集中在电力领域。其他例如煤炭、石油等传统能源,与区块链结合的应用则处于早期,主要利用区块链去帮助传统能源进行销售、溯源等.

1900/1/1 0:00:00
西甲联赛(LaLiga)代币今日16点正式上线(GMT+8)

亲爱的GCOX用户: 期待已久!GCOX备受关注的西甲联赛(LaLiga)代币项目今日在GCOX交易所隆重上线啦!! 而在昨日15:00至16:00 (GMT+8),作为独家专享活动.

1900/1/1 0:00:00
大盘整体站稳 看多趋势浓厚

华尔街分析师:比特币的波动性与苹果或亚马逊等大盘股没什么不同:华尔街金融分析师、比特币支持者Max Keizer发推文表示,比特币的波动性与苹果(AAPL)或亚马逊(AMZN)或任何其他大盘股没什么不同.

1900/1/1 0:00:00
大盘调整行情 主力并没有下车

瑞杰金融:将硅谷银行金融集团评级从跑赢大盘下调至与大盘一致:金色财经报道,瑞杰金融表示,将硅谷银行金融集团评级从跑赢大盘下调至与大盘一致.

1900/1/1 0:00:00