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

UUPSUpgradeable 漏洞分析

作者:

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

本文作者:bixia1994

参考链接:UUPSUpgradeableVulnerabilityPost-mortem-General/Announcements-OpenZeppelinCommunity

EIP-1967

在UUPS中,其实现了EIP-1967

Tuur Demeester:比特币价格超过5万美元“一点也不疯狂”:比特币投资者和研究分析师Tuur Demeester推测奖励减半后,比特币比不会跌破6,000美元,甚至未来可能达到至少50,000美元的价格。

在5月18日发布给加密货币研究公司Messari的YouTube频道的视频中,Demeester表示,比特币(BTC)减半后已“重返牛市”,过去的3,000-4,000美元触底反弹,指的是3月加密市场崩盘。(Cointelegraph)[2020/5/19]

作为一个实现EIP-897的代理合约,其在代理合约中会实现这两个函数。

UUPSEIP-1822

EIP-1822讨论的合约升级模式与Openzeppelin的透明合约升级模式的不同点在于:EIP-1822的代理合约只读取实现合约的地址,并将所有的方法都代理给实现合约,包括修改实现合约地址的逻辑部分也在实现合约里。而透明合约升级模式中,proxy合约管理着实现合约的地址,要实现合约升级,只需要在proxy合约中更改实现合约的地址即可。其他的逻辑代理给实现合约。

也就是说EIP-1822的实现合约既包含了普通的业务逻辑处理,更包含了自身的升级逻辑处理。简单来讲就是EIP-1822的实现合约部分,都需要继承自一个公共的可升级实现合约:proxiable

functionupgradeToAndCall(addressnewImplementation,bytesmemorydata)externalpayablevirtual{}function_authorizeUpgrade(addressnewImplementation)internalonlyOwner(){}

声音 | Tuur Demeester:熊市中想买进的人很吵 被迫出售的人很安静:数字货币经济学家Tuur Demeester在推特上表示,熊市中想要 (别人) 买进的人很吵,被迫出售的人是很安静的。[2018/10/16]

其中,openzeppelin通过回滚检测,来检查是否升级成功,避免了EIP-1822中遇到的问题:

function_upgradeToAndCallSecure(addressnewImplementation,bytesmemorydata,boolforceCall)internal{//第一步:设置newImpl地址到实现合约地址addressoldImplementation=_getImplementation();_setImplementation(newImplementation);//第二步:针对新的实现合约地址进行初始化if(data

//第三步:执行回滚检查//PerformrollbacktestifnotalreadyinprogressStorageSlot

}

声音 | 经济学家Tuur Demeester:区块链是具有里程碑意义的发明:今日,经济学家Tuur Demeester转发赵长鹏推文消息称:“在我的理解中,区块链是一个高冗余数据库,它可以永久存储所有内容,并通过工作证明机制进行保护。我相信这是一项具有里程碑意义的发明,只是目前它的第一层应用有限。”赵长鹏此前所发推文内容为,“我还没有遇到过理解区块链技术但不相信它的人,你是区块链的信徒吗?”[2018/9/10]

Openzepplin的实现漏洞分析

在上述的Openzeppelin的实现中,其通过回滚检测避免了EIP-1822中遇到的问题:即升级到一个不满足EIP-1822规范的合约时,此时代理合约和实现合约就完全被锁死,无法继续升级。但是其又引入了一个新的问题,即:回滚操作中事实上模拟了一遍新的实现合约地址中的upgradeTo操作,并且是通过delegatecall方式来进行调用。

通过delegatecall调用新合约地址的upgradeTo方法有什么问题呢?

查看黄皮书中关于delegatecall的定义为:

Message-callintothisaccountwithanalternativeaccounts'code,butpersistingthecurrentvaluesforsenderandvalue

thismeansthatthereceipientisinfactthesameaccountasatpersent,simplythatthecodeisoverwrittenandthecontextisalmostentirelyidentical

从黄皮书的定义来看,delegatecall事实上保存了当前账户的余额和msg

functionmint(addressto,uint256amount)publiconlyOwner{_mint(to,amount);}function_authorizeUpgrade(addressnewImplementation)internalonlyOwneroverride{}}

火币自主数字资产交易所(Huobi HADAX)将于3月8日14:30上线UUU:火币自主数字资产交易所(Huobi HADAX)定于新加坡时间3月8日14:30开放U Network (UUU)充值业务。3月9日14:00在HADAX开放UUU/BTC和UUU/ETH交易。3月11日14:30开放UUU提现业务。[2018/3/8]

注意这里的TestToken是UUPS升级合约的实现合约部分,而不是代理合约部分。那么应该如何去做这个TestToken的POC呢?

POC

这里不能直接在malicious合约中的upgradeTo方法中写selfdestruct,而是应该利用ForceCall部分的delegatecall,并通过写入rollbackTesting

function_authorizeUpgrade(addressnewImplementation)internal{}}

讨论

那么在openzeppelin的UUPS实现中,使用delegatecall来进行回滚测试有什么问题呢?

问题就是:

Address

}

上述openzeppelin实现的代码中,最为核心的一条是理解:当delegatecall到一个selfdestruct方法后,程序所有的代码都会被直接清空,不会继续往下执行,也就不会去执行后面的require判断条件。

然而在remix中执行时,发现delegatecall之后的require语句还是执行了:

这是不对的,需要进一步理解黄皮书中关于selfdestruct这个opcode的定义:

selfdestruct:Haltexecutionandregisteraccountforlaterdeletion

function_functionDelegateCall(addresstarget,bytesmemorydata)privatereturns(bytesmemory){require(AddressUpgradeable

当delegatecall到一个selfdestruct的方法时,其返回值为0,然后代码继续运行。如果此笔交易在后续的执行过程中成功,则上下文地址上的代码将会被清空。如果该笔交易在后续的执行过程中失败,则整体状态会回滚。

参考资料

bixia1994-互联网小工:https://learnblockchain.cn/people/3295

UUPSUpgradeableVulnerabilityPost-mortem-General/Announcements-OpenZeppelinCommunity:https://forum.openzeppelin.com/t/uupsupgradeable-vulnerability-post-mortem/15680

ContractsWizard-OpenZeppelinDocs:https://docs.openzeppelin.com/contracts/4.x/wizard

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/10378667.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

每周编辑精选WeeklyEditors'Picks

标签:IONTERESTENTCLION币KSM StarterTEST TokenShopayment

USDC热门资讯
Hyperledger 网络安全问题的解决之道:DigiCert和Thales

注:原文来自hyperledger。2019年,全球约有79亿条数据记录遭到破坏,然而,39%的公司没有使用强大的数据安全措施,因为部署复杂性是一大障碍.

1900/1/1 0:00:00
币安流动性挖矿支持ICP,并开放2个新流动性池

亲爱的用户:币安流动性挖矿现已支持ICP资产,并开放2个新流动性池:ICP/BNBICP/USDT注意:币安流动性挖矿是一种非保本收益产品,因此为币对池提供资金具有一定的风险;在对资金进行添加/移除操作时.

1900/1/1 0:00:00
中币关于上线Perpetual Protocol(PERP)的公告

尊敬的中币用户: ????中币将于香港时间2021年9月27日上线PerpetualProtocol.

1900/1/1 0:00:00
XT关于资金划转功能维护完成的公告

尊敬的XT用户: XT现已完成资金划转功能维护,划转已全部恢复正常使用。维护期间给您带来的不便,敬请谅解!感谢您对XT.COM的支持与信任!XT.COM团队2021年9月26日金色热搜榜:XTZ居于榜首:根据金色财经排行榜数据显示,过.

1900/1/1 0:00:00
关于ETF专区部分币对调整的公告(0927)

尊敬的用户:?经过综合评估之后,平台将于9月30日16:00关闭BTC3L/3S、BTC5L/5S、ETH3L/3S、ETH5L/5S、LTC3L/3S、LTC5L/5S、BCH3L/3S、BCH5L/5S、BSV3L/3S、BSV5.

1900/1/1 0:00:00
得州参议员Ted Cruz反对拜登提名Saule Omarova为OCC负责人

据Cointelegraph消息,9月28日,得克萨斯州共和党参议员TedCruz发推反对拜登提名SauleOmarova为OCC负责人.

1900/1/1 0:00:00