导言:“尽管人民不能治愈人民,但尸体和朱布约被取代了。” -《庄子·逍遥游》
在远古时代,曾有一位杰出的领导人唐瑶。
他所控制地区的人们过着安居乐业的生活,但是当他得知隐居的徐友很有才华时,他就想放弃对徐友的领导。但是徐友拒绝了,说了些话“ W窝在深林里,什么也没有。”
迄今为止,后世还使用“越岭”一词来表示超越权威的含义。
岳燕黛
在执行智能合约时有访问权限。如果权限设置不合理,很容易导致智能合约受到攻击,并造成严重的经济损失。
成都链安全实验室拥有丰富的经验和智能合约安全的积累,但是随着区块链技术的日益重视,智能合约的数量也在增加,后续的智能合约受到攻击的事件越来越多,也使我们感到重要“使区块链更安全”的企业使命是实现,但我们很难应对所有威胁。
接下来,我们将我们的安全经验积累相结合与智能合同CTF射击场ETH ernaut,以及使用技术系列化推广智能合同开发者如何在开发过程中,实现更安全的代码。
现在,让我们来谈谈回退,在的第一个问题ETH ernaut射击场,对码功能“在一代”的事件。
1.权限漏洞简介
未经授权的漏洞意味着在智能合约中,由于不合理的功能可见性设置或缺乏有效的功能验证而无法成功调用功能的用户直接调用功能或绕过验证。
该漏洞可以单独使用,也可以与其他漏洞结合使用以执行组合攻击。开发方法很简单。漏洞的影响取决于漏洞存在的功能,并且可能对合同造成毁灭性的打击。
2.后备
漏洞原理详细分析
2.1合同中的“玲”和“宝”
如何理解合同中的“单”和“补”?首先查看合同代码,如下所示:
图1
此合约代码为后备的第一个问题ETH ernaut射击场。为了解决射击范围内的问题,解决方案是触发owner = msg.sender;通过调用回调函数function()payable public,使合同的所有者成为调用方。
只要该合同启动了交易,问题就非常简单,并且可以在满足要求时触发回退功能。
通常,在调用合同时,如果没有其他功能与给定的功能标识符匹配,或者没有提供其他数据,则将执行后备功能。通常,这是转移到以太坊的默认操作。因此,在开发智能合约时,通常不必将owner = msg.sender写入回退功能。
如下所示:
图2
但是,此处不应该调用用户调用的owner = msg.sender,导致权限控制不当和未授权访问,并且以下情况以“忎”和“庖”方式发生。
2.2相关安全事件
2.2.1 Bancor合同事件
据报道,2020年6月18日,Bancor网络(0x5f58058c0ec971492166166c8c22632b583f667f)易受攻击。
该漏洞的原因是合同中有一个公共的safeTransferFrom方法,因此攻击者可以直接调用此方法来授权将代币传输到Bancor网络合同中的任何帐户。
传输和授权的三个功能权限是公共的,允许任何用户调用它。该事件涉及超过50W的资金。
详细代码如下所示:
图片3
具有公共权力的safeTransferFrom方法的“转移”没有获得Bancor合同“国王”的许可,而是直接夺走了“国家”的“财政权力”
幸运的是,Bancor网络团队和White Hat首先发现了此问题,并转移了资金。该漏洞在后续操作中也已修复,以避免丢失。
有关详细分析,请参阅(https://mp.weixin.qq.com/s/N1bNLqdr8JEqq9QI0X1Q)
同一事件也在另一个合同中上演。接下来,我们将在6月底介绍V ETH合同漏洞事件。
2.2.2 V ETH项目事件
2020年6月30日,V ETH项目被违反。在这种情况下,“ Yuelidaiye”的主角是合同中changeExcluded函数的外部修饰符。
外部修饰符允许任何人调用changeExcluded函数以绕过transferFrom函数内部的授权转移限制检查并窃取合同的V ETH代币。
在此事件中,攻击者利用此漏洞窃取了919,299 V ETH并大量出售,导致V ETH币价值立即丢失。
有关详细信息,请参见(https://mp.weixin.qq.com/s/plbpMfIk_A457GoUaQA)所涉及的合同代码如下图所示:
图4
通过以上两种情况,我相信每个人都已经意识到合同中“月里一代”事件的严重影响,那么在编写合同代码的过程中如何有效地区分“里尔”和“里尔”?
2.3信息“”和“庖”的秘密
对于未经授权的事件,合同开发人员必须首先了解功能的可见性。
功能可见性有四种类:外部,公共,内部和私有:
-外部
作为合同接口一部分的外部功能意味着我们可以从其他合同和交易中调用它们。外部函数f不能在内部调用(即f不起作用,但this.f()可以)。当接收大量数据时,外部功能有时会更有效,因为数据不会从calldata**到内存。
-上市
公共功能是合同接口的一部分,可以在内部或通过消息进行调用。对于公共状态变量,将自动生成一个getter函数(请参见下文)。
-内部
这些函数和状态变量只能在内部访问(即,从当前合同内部或从其衍生的合同中),而无需使用此调用。
-私人的
专用函数和状态变量仅在当前定义它们的合同中使用,而派生合同则不能使用。
在构造功能时,开发人员应遵循这些可见性进行开发,以明确用户可以调用哪些功能,以及在合同中不能随意替换的功能,分配基于最小原则。
例如,函数safeTransfer被设计用于在设计时进行转移操作,并且用户可以通过调用此函数来转移此合同发行的代币。我们可以同时使用public和external来满足需求,但是从安全角度来看,我们应该使用external以避免在合同中调用此功能,从而导致意外风险。
如果有safeTransferFrom函数,则用户可以通过授权此合同中的其他代币将其他代币转移到指定地址。当_token等于合同本身时,sadTransfer函数将被称为合同本身,即将合同中的资金转移到另一个地址。
图5
但是,仅遵循功能可见性是不够的。功能可见性仅区分合同,继承合同和外部合同的三个边界,远不能满足我们的需求。
为了实现更完整的权限管理,我们应该引入“角色”的概念,例如:管理员,普通用户,特权用户等。将这些角色的地址存储在合同中,并通过判断地址或标记变量来控制权限。
如下所示:
图6
这些不同的“角色”通过装饰器进行管理,例如使用onOwner装饰器来限制此地址以调用此函数。对应于“角色”的权限管理。通过使用装饰器方法,您可以更清楚地确定是否存在错误。
3.安全摘要
就链上的现状而言,由智能合约许可管理错误引起的漏洞比比皆是,并且有许多“**的项目”,这些漏洞造成的损失也很大。
基于多年的合同审核和链上分析安全经验,成都联安安全团队提出以下建议:
1.遵循权限最小化开发原则,并在设计功能时计划可见性。
2.建立一个角色机制,并使用装饰器管理每个功能的权限,以避免失效。
3.在上线之前,您必须找到专业的组织来进行代码审核。这就是所谓的“一个人,一个大脑,不讨论工作;十个人十个大脑,一大套方法”
文章标题:智能合约安全实践(1)|一千万个功能,第一个安全机构
文章链接:https://www.btchangqing.cn/51810.html
更新时间:2020年07月08日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。