4

SharkTeam:十大智能合约安全威胁之权限漏洞

 2 years ago
source link: https://www.tuoniaox.com/news/p-546582.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SharkTeam:十大智能合约安全威胁之权限漏洞

SharkTeam 2022-09-14 15:36
article_qmarks.svg 摘要:

智能合约中的权限漏洞和关键逻辑有关

问:我们常提到的智能合约漏洞真的是实际中威胁最大、发生最频繁的安全漏洞吗?

答:完全不是那样。例如“溢出”、“外部调用”等常提到的智能合约安全漏洞并不是最常发生,威胁最大的。

到底哪些安全威胁从发生频率和危害性上能称为Top10的呢?SharkTeam合约安全系列课程之【十大智能合约安全威胁】和您一起讨论和深入。第四课【详解权限漏洞】。

image.jpeg
 

一、什么是权限漏洞

权限漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。

智能合约中的权限漏洞和关键逻辑有关,例如铸造代币、提取资金、更改所有权等。权限漏洞主要有以下类型:

(1)函数默认可见性

函数的可见性可以声明为external,public,internal或private。默认情况下,未指定可见性的函数其可见性默认是public。如果开发人员忘记设置可见性,攻击者能够进行未经授权或意外的状态更改,则可能导致漏洞。

(2)缺少modifier验证以及不正确名称

在modifier内部缺少验证或条件声明很可能会导致资金损失。由于拼写错误,可能会发生modifier或函数的名称与预期不符的情况。攻击者也可能利用它在没有modifier的情况下调用关键函数,这可能会导致资金损失或所有权变更,具体取决于函数的逻辑。

(3)tx.origin身份验证

合约使用全局变量tx.origin作为身份验证凭据,容易被攻击者诱骗绕过身份验证。

(4)初始化函数问题

初始化函数未标记内部或者执行多次,容易被攻击者利用初始化函数进行自定义。

(5)调用自毁

selfdestruct(address payable address) 函数可以销毁当前合约,并且把当前合约的余额发送给指定地址。因此,selfdestruct调用时若没有权限限制,则任意账户都可以调用该函数销毁合约,造成合约剩余的Token的巨大损失,进一步则会引发合约拒绝服务攻击,从而引起及其严重的后果。

(6)过度使用的角色

用户拥有过度使用的角色可能会导致漏洞。

二、攻击事件分析

2.1 DODO

2021年3月9日,DODO的wCRES/USDT资金池遭受攻击,攻击者转走了价值约90万美元的wCRES和价值约113万美元的USDT。攻击者利用资金池合约的初始化函数漏洞,从资金池盗取了133,548.93858472505wCRES和1,139,456.204397USDT。攻击流程如下:

(1)攻击者将FDO和FUSDT两种空气币转入wCRES/USDT资金池

(2)通过DODO闪电贷借出133548.93858472505个wCRES和1139456.204397个USDT

本次攻击的执行trace如下图所示,上面红框表示攻击者向资金池转入FDO和FUSDT的过程,下面的红框表示攻击者向资金池借贷的过程。

image.jpeg

可以看到攻击者在调用flashLoan函数的过程中执行了init初始化函数,并且输入的baseTokenAddress参数为FDO, quoteTokenAddress参数为FUSDT。通过分析源码中的init函数可知,攻击者利用该函数将资金池重新进行了初始化,此时资金池被重新初始化成了FDO/FUSDT池。因此,攻击者可以规避闪电贷的贷款归还机制。

image.jpeg

问题原因分析:DODO资金池的初始化函数init没有对调用者的权限进行严格的校验,也没有做一些防止重复调用的措施,这才导致攻击者可以轻易的重新初始化资金池。

2.2 DAO Maker

2021年8月12日,DAO Maker 遭到黑客攻击,大量用户充值的 USDC 被转出并换成约 2261 个以太坊,损失超过 700 万美元。通过查看攻击者交易情况发现攻击者共发动了18次攻击对5252名用户攻击。

image.jpeg

这次事件存在多次相同的攻击方式,所以我们选取其中一次攻击进行分析。

DAOMaker Exploiter 1(0xd842)使用攻击合约XXX(0x1c93)的h()函数发起交易,将350名用户的USDC通过钱包地址(0x41B8)转给攻击合约XXX后转给DAOMaker Exploiter 1(0xd842),这350名受害者地址以数组的形式传入交易的inputdata。

image.jpeg
 

对受害者合约(0x4188)的0x50b158e4(withdrawFromUser)函数进行反编译后,我们发现攻击合约XXX(0x1c93)拥有权限方可转账成功。查看历史交易可以发现:122天前合约部署人(0x054e)给现任管理员(0x0eba)授权。

通过查询,一天前现任管理员(0x0eba)创建并且授权攻击合约XXX(0x1c93)。

image.jpeg

随后DAOMaker Exploiter 1(0xd842)调用攻击合约XXX(0x1c93)发起攻击获得大量USDC,将其转换为ETH后转账给DAOMaker Exploiter 2(0xef94)。

(1)攻击者获得现任管理员(0x0eba)的控制权

(2) 管理员(0x0eba)创建了攻击合约XXX(0x1c93)并对其授权

(3)DAOMaker Exploiter 1(0xd842)调用攻击合约XXX(0x1c93)获利

问题原因分析:因此,本次攻击原因很可能是现任管理员(0x0eba)密钥被盗取。类似授权的关键函数应该更多的使用多签技术,避免单点攻击风险。

2.3 Crosswise

2022年1月18日,BSC上Crosswise 遭遇黑客攻击,此次攻击导致协议损失 87.9 万美元。攻击者仅用 1 个 CRSS token 便获取 Crosswise MasterChef 池中价值 87.9 万美元的 692K 个 CRSS。本次事件攻击流程如下:

(1)修改owner:首先设置trustedFowarder,然后通过transferOwnership函数修改owner。该过程中,自定义的msgSender()函数存在漏洞(代码如下)。trustedForwarder的修改缺少权限限制,导致msgSender函数的判断可以通过修改trustedForwarder变量来影响其结果,最终使得owner可以被其他用户修改

image.jpeg

(2)由于上一步攻击者修改了owner,即获取了owner权限,因此,攻击者调用了set函数设置了MasterChef合约中的0号矿池的策略

(3)通过MasterChef合约中的withdraw函数提取了692184.64 CRSS,然后将CRSS兑换为BNB

(4)通过Tornado实现混币,将盗取的BNB转移到其他账户地址

问题原因分析:本次攻击的根本原因是项目方自定义的_msgSender函数存在漏洞,导致合约的 Owner 权限可以被黑客更改从而获取MasterChef合约的Owner权限,最后通过Owner权限窃取了项目中的资金。另外,攻击者账户发起攻击的资金来源于Tornado混币平台。

2.4 QBridge 

2022 年 01 月 28 日,Qubit 项目的 QBridge 遭受攻击,损失约 8000 万美金。本次事件攻击流程如下:

(1)攻击者账户在Ethereum上面通过Tornado获取1 Ether的Token,作为发送交易以及发起攻击的最初资产

(2)攻击者在Ethereum上面先后连续发起2次deposit ETH交易(调用depositETH函数)到QBridge合约,每次存入0.1 Ether,用于跨链交易

(3)攻击者在Ethereum上面再次先后连续发起多次deposit交易(调用deposit函数)到QBridge合约,用于跨链交易

(4)账户0xeb645b4c35cf160e47f0a49c03db087c421ab545在攻击者发起deposit交易后,在BSC网络中先后连续发起了多次Vote Proposal交易(调用voteProposal函数),铸造了大量的xETH Token

(5)攻击者在BSC网络中以凭空铸造的大量的xETH作为抵押物,从Qubit合约中借出了其中的140 Ether

问题原因分析:本次攻击的根本原因在于,分开实现deposit主币(如ETH)和ERC20标准普通代币时,在对白名单内的代币进行转账操作时未对其是否为0地址进行检查,导致本来应该通过native充值函数进行deposit的操作也能通过普通ERC20代币的deposit走通。在业务开发中,建议对deposit代币进行白名单检查后仍需对deposit的是否为native代币进行再次检查。

三、预防措施

回顾相关攻击事件后,我们作为开发人员应该如何采用适当的措施来有效避免相应的权限漏洞?

(1)显示地声明所有函数的可见性(external,public,internal或private),这可以大大减少合约系统的攻击面

(2)使用openzeppelin的Ownable合约,在自己的合约中实现所有权

(3)验证最小权限原则,我们应当使用openzeppelin的AccessControl合约来实现控制访问更细粒度的权限,因为该实践限制每个系统组件遵循最小权限原则

(4)验证合约是否依赖于正确消息发送者提供的数据,并且合约不依赖于tx.origin值,如果需要判定消息来源,建议使用msg.sender

(5)验证初始化函数是否标记为内部并且不能执行多次,应当在初始化函数中进行权限限制

(6)增加对调用selfdestruct自毁函数的权限管理

(7)项目上线前,需联系专业的第三方专业审计团队进行审计

关于我们:SharkTeam的愿景是全面保护Web3世界的安全。团队成员分布在北京、南京、苏州、硅谷,由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如OKC、polygon、Huobi Global、Polkadot、imToken、ChainIDE等建立长期合作关系。

image.jpeg

Telegram:https://t.me/sharkteamorg

Twitter:https://twitter.com/sharkteamorg

更多区块链安全咨询与分析,点击下方链接查看

D查查|链上风险核查 https://m.chainaegis.com

声明: 鸵鸟区块链所有发布内容均为原创或授权发布,如需转载,请务必注明文章作者以及来源:鸵鸟区块链(微信公众号:MyTuoniao),任何不尊重原创的行为鸵鸟区块链都将进行责任追究!鸵鸟区块链报道和发布内容,不构成任何投资建议。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK