LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资讯 > 权限问题再掀波澜-PAIDNetwork安全事件分析

权限问题再掀波澜-PAIDNetwork安全事件分析

2021-09-27 SharkTeam 来源:区块链网络

3月6日消息,PAID?Network 遭受攻击。PAID Network是DuckDAO孵化的DeFi项目,旨在重新定义区块链法律体系。项目计划使用生物识别技术构建世界上第一个去中心化的SMART Agreement DApp,以验证用户的身份并启用信誉评分系统来创建安全的生态系统。当前在Rinkeby测试网上运行,可以永久创建并签署保存在IPFS/以太坊网络分类帐中的合同,并通过连接其以太坊钱包进行访问。

攻击者通过合约漏洞铸造了近 1.6?亿美元的 PAID 代币,并获利2000 ETH(约?300 万美元)。PAID Network 随后发推称,团队正在积极调查,移除了所有的流动性,将在第一次转账发生前进行快照,并将用户余额恢复黑客转账前的数量。

SharkTeam第一时间对此事件进行了攻击分析和技术分析,并总结了安全防范手段,希望后续的区块链项目可以引以为戒,共筑区块链行业的安全防线。

一、攻击分析

造成损失的整个攻击过程非常简单:攻击者(0x18738290af1aaf96f0acfa945c9c31ab21cd65be)通过调用代理合约中函数签名为0x40c10f19的函数实现了攻击,该函数对应的是mint函数,攻击者通过调用mint函数实现恶意铸币攻击,攻击交易如下。

mint函数是极其重要的铸币函数,通常都会进行严格的权限管理,不太可能会出现任意调用的问题,通过对铸币函数的分析,PAID中的mint函数(合约代码未开源,反编译查看)确实也进行了权限管控。而授权的地址恰巧就是此事件的攻击者(0x18738290af1aaf96f0acfa945c9c31ab21cd65be)。现象表明,此地址应该本身就是PAID的官方地址,从业务逻辑上并未发现明显的问题。因此,造成此次事件的原因可能是此地址对应的私钥泄露或项目方误操作。

二、权限管理安全问题分析

其他案例分析1:Furucombo无限授权漏洞

上周,著名的著名DeFi项目Furucombo被黑,损失超1500万美元。攻击者构造了一个攻击合约,并将其运行于易受到攻击的Furucombo代理中;Furucombo?调用白名单中的 AaveLendingPoolv2 函数,并在函数中附带攻击合约地址,调用初始化函数initialize,该函数可进一步调用提供的攻击合约。导致,在用户未撤销授权的情况下,攻击者可通过攻击Furucombo代理,盗取用户钱包里的资产。

其他案例分析2:ICX Token交易控制Bug

2018年6月16日,ICX项目官方github仓库中被报告存在一个智能合约代码的Bug,该Bug使得transfer功能失效,并且任何人都能随意开启和关停合约的主要功能(包括转账,授权和烧币)。ICX的 Token 合约中有一个变量tokenTransfer,只有该变量为true时,所有解锁的账户才可能执行转账,授权他人转账和烧币的操作(这几个操作的函数均使用了isTokenTransfer修饰器)。其中,unlockaddress数组保存着所有的解锁账户的状态,由owner来设置。

而在ICX 的 Token 合约中,有两个函数enableTokenTransfer() 和disableTokenTransfer(),用来修改tokenTransfer的值。这两个函数均使用了一个修饰器,名称为onlyFromWallet,在onlyFromWallet的实现中,开发者因为将判断条件错误地写反了,造成除walletAddress以外,所有账户都可以通过修改tokenTransfer来控制合约功能的开启和关停。

如上两个案例,包括此次的PAID事件都只是智能合约权限管理不当造成安全风险和资金损失的冰山一角,一系列的权限安全问题造成的安全事件大体可以划分为三类。

(1)函数可以向任意账户发送资金

漏洞原因:开发者对可以发送资金的函数没有限制其调用权限,造成任何用户都可以向任意地址发送资金,从而利用该漏洞盗取资金。

示例代码:

如上代码,任意用户都可以调用withdraw方法向自己的账户地址发送资金。

修复建议:对可以发送资金的函数进行权限的限制,只有通过了验证的账户才可以发送资金,确保任意用户都不能提取未经授权的资金。

(2)合约中使用了tx.origin

漏洞原因:如果合法用户与恶意合约进行交互,则恶意合约则可能绕过tx.origin的保护机制。

示例代码:

如上代码,加入Bob是tx.origin的所有者,Bob调用了Eve的合约,Eve则可能绕过tx.origin的保护机制调用Bob的tx.origin,从而盗取Bob的资金。

修复建议:授权时避免使用tx.origin

(3)任意账户可以修改状态变量

漏洞原因:合约需要确保只有授权的用户或合约帐户才能写入状态变量。如果攻击者能够写入合约的任意状态变量,则可以很容易地规避授权检查。这可能使攻击者破坏状态变量,例如,通过覆盖存储合约所有者地址的字段。

示例代码:

如上代码中的UpdateBonusCodeAt函数可以修改状态变量,任意账户地址调用该函数都可以修改同一个状态变量,从而造成状态变量的覆盖。

修复建议:鉴于所有数据结构共享相同的存储空间,应确保对一个数据结构的写入不会无意间覆盖另一个数据结构,建议对修改状态变量的函数增加鉴权机制,保证只有被允许的账户才能修改状态变量。

三、SharkTeam安全建议

SharkTeam建议您在智能合约开发和部署过程中,请确保特殊账户地址私钥的机密性,防止出现私钥泄露或被盗的情况;关键逻辑应当充分考虑鉴权时的风险,可以考虑使用多重签名或分散权限等方式降低风险;在项目上线前应进行严格的智能合约审计,确保安全。

以下,对多重签名过程做个简单介绍,希望更多的开发者能快速掌握并应用,减少因权限问题产生的安全问题。多签又叫多重签名,它的优势是可以多方对一笔交易达成共识,才能交易成功。比如,3个人合伙开公司,他们的对外付款是比特币,为了防止管理财务的人作恶,于是他们可以创建2/3多签的地址,每个人持有一个私钥,对于每一笔付款,必须任意2个人都签名了才能支付出去。在以太坊上实现多签,过程如下:

(1)首先需要在钱包中创建多签合约并发布到以太坊。

(2)然后我们需要在合约中先添加多个账号,每个人都可以向自己钱包中的账户里存钱以及把账户的钱转到其他账户。

(3)当有人想通过多签合约转账时,我们先通过钱包中的多签合约构建一笔交易,放入pending队列中。

(4)其他账户可以通过函数接口观察pending队列里的所有交易,如果认为可行就对认可的交易进行签名。

(5)当一笔处于pending状态的交易被指定数量的人认可之后,即该交易包含了指定数量的签名后,这笔交易就可以发布到以太坊上面了。

查看更多

—-

编译者/作者:SharkTeam

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...