风险提示:理性看待区块链,提高风险意识!
慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法
首页 > 币界资讯 > 竞争币新闻 2019-02-01 14:00:10

2018 年 12 月 19 日,众多游戏类 DApp 遭遇交易回滚攻击,其中包括 BetDice,EOSMax,ToBet 等。按当时 18 元人民币的价格计算,损失超过 500 万人民币。期间 BetDice 通过链金术平台发出多次公告 , 一度造成恐慌。

与此同时,慢雾安全团队对交易所和中心化钱包给出了暂时性的方案。此刻,攻击手法依旧是一个谜团。那么,攻击手段究竟是怎样的呢?在进行攻击回顾之前,需要先了解一点技术背景。

技术背景

1、我们知道 EOS 采用的共识算法是 DPOS 算法,采用的是 21 个超级节点轮流出块的方式。除了 21 个超级节点外的其他全节点,并没有出块的权限。起到的作用是将收到的交易广播出去,然后超级节点将其进行打包。

说到这里,很容易看出,如果一笔交易是发给除了超级节点外的其他全节点,这笔交易会经历两个过程。首先,这笔交易先被全节点接收,然后交易再被节点广播出去进行打包。而一笔交易是需要超级节点中超过 2/3+1 的节点进行确认之后才是不可回滚的,也就是不可逆的。

这个过程大概需要 3 分钟左右,也就是说,交易发到除了超级节点外的全节点的时候,由于全节点没有打包的权利,此时此刻交易仍然处于可逆状态(这里假定节点数据库的读取模式为默认的 speculative,有关阅读模式的参考:https://developers.eos.io/eosio-nodeos/docs/read-modes)。这是一个核心关键点。

2、每一个 bp (超级节点),都可以在自己的节点的 config.ini 文件内进行黑名单的配置,在黑名单中的帐号是不能进行交易的,也就是说无论怎样,黑名单的交易都会被回滚。

黑名单配置路径:

Mac OS:

~/Library/Application Support/eosio/nodeos/config/config.ini

Linux:

~/.local/share/eosio/nodeos/config/config.ini

配置方法: 将 config.ini 文件内的 actor-blacklist 填入黑名单帐号,如下图中,将 attacker 这个帐号作为黑名单帐号。

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

了解了以上的知识点之后,我们就可以进行整个攻击事件的回顾了。

攻击回顾

跟踪攻击者的其中一个攻击帐号,发现帐号合约内只有一个 transfer 函数

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

同时,我们可以通过复盘这个帐号的所有交易记录发现,这个帐号只有开奖记录,而没有下注记录,看起来就好像项目方故意给这个帐号进行开奖一样。然而事实上并非如此。那为什么会出现这样的情况呢?这就需要上面的技术背景的知识了。以下是详细的攻击手法:

1、首先:攻击者调用非黑名单合约的 transfer 函数,函数内部有一个 inline action 进行下注,from 填写的是攻击者控制的非黑名单合约帐号,to 填写的是游戏合约帐号。这时,攻击者发送交易是发向游戏合约自己的全节点服务器。使用的是黑名单帐号进行。

2、游戏节点读取到了这笔交易,立刻进行开奖,如果中奖,将对攻击者控制的非黑名单帐号发送 EOS。

3、在经历了一个 1,2 两个操作之后。理论上攻击者控制的非黑名单帐号是进行了余额扣除。然后进行正常的开奖逻辑。到这里之前,一切都是正常的。也许有读者会问,为什么配置了黑名单,交易还能正常发起?原因是这个黑名单生效范围是在 bp 内,普通的全节点的 config.ini 内是没有黑名单的配置的。所以攻击者依然可以发起交易。

4、到此为止,攻击正式开始,也到了最关键的地方,由于项目方节点在收到下注交易的时候已经立马完成了开奖逻辑,而且采用的是线下开奖的模式,即下注交易和开奖交易是两笔不同的交易。但是,这两笔交易仅仅是在项目方的节点内完成,仍然是可逆的。当项目方节点向 bp 广播这两笔交易的时候,由于第一笔下注交易的发起者在 bp 节点的黑名单内,这一笔交易将被回滚,也就是打包失败,而开奖交易的发起者是项目方,不在黑名单之内,会被正常打包。因此两笔交易中的第一笔下注交易一定会被回滚,而开奖交易依旧会被打包,这也就解释了为什么只有开奖记录,而没有下注记录。因为下注记录都被回滚了。

整个过程可以参考下面的图:

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

攻击复现

本次攻击复现参考 EOS LIVE 钱包团队的文章:https://eos.live/detail/19255

1、环境准备

(1)本地准备两个节点,一个出块节点,一个同步节点,出块节点用于模拟真实 bp,而同步节点则用于模拟项目方,其中出块节点需要开启 history 插件,方便后续的 debug,并且把 attacker 加入节点黑名单。方便后续的 debug。打包节点则需要开启自动开奖插件 , 自动开奖插件配置详见:

https://github.com/superoneio/security

本次复现用到的代码:

https://github.com/superoneio/security

本地多节点配置方法官方参考:

https://developers.eos.io/eosio-nodeos/docs/local-multi-node-testnet

(2)三个测试帐号,分别是 tobetioadmin,tobetiologs1,attackproxy1,分别为项目方帐号,项目方 log 帐号,和攻击代理帐号,其中 tobetioadmin 部署 tobet 游戏合约,tobetiologs1 部署 logs 合约,attackproxy1 部署 attack 合约。注意除了攻击代理帐号外的其他两个帐号不要改为其他帐号,如果改为其他帐号需要对自动开奖插件进行修改,自动开奖插件是拦截 tobetioadmin 这个帐号的。

(3)附上我的双节点的配置:

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

其中 nodeos_main 为出块节点,nodeos_second 为同步节点。

2、启动节点

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

看到以上信息则代表 dice_plugin 配置成功

3、首先对正常的逻辑进行测试。

使用 attackproxy1 对 tobetioadmin 帐号进行正常的转账交易

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

可以看到,攻击代理合约进行了正常的转账。

4、开始攻击,使用黑名单帐号调用攻击代理合约,向项目方合约发起攻击。
(1)查询初始余额

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

(2)为保证攻击成功,连续向项目方发起 4 起攻击

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

(3)再次查询余额

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

(4)查询 attacker 帐号记录

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

可见,并没有 attacker 对 attackproxy1 的调用记录,最后两条记录是我测试直接使用黑名单向 tobetadmin 发起攻击的时候留下的记录。与本次测试无关。但是通过查询发现,本地记录和链上记录是相吻合的,即无下注记录。

(5)查询 attackproxy1 的帐号记录

慢雾:破解造成 BetDice 项目恐慌的交易回滚攻击手法

可以看到的是,这个也与链上记录吻合,只有开奖记录,就像 tobetadmio 故意给 attackproxy1 开奖一般。

通过以上的复现及和链上记录的对比,我们可以证明上文说的攻击手法,就是黑客本次进行攻击的手法,采用的就是使用黑名单进行回滚的操作。

防御建议

1、针对 DApp 的防御建议

(1)节点开启 read only 模式,防止节点服务器上出现未确认的块
(2)建立开奖依赖,如订单依赖,开奖的时候判断订单是否存在,就算在节点服务器上开奖成功,由于在 bp 上下注订单被回滚,所以相应的开奖记录也会被回滚。

2、针对交易所和中心化钱包的防御建议

慢雾安全团队建议 EOS 交易所及中心化钱包在通过 RPC 接口 get_actions 查询热钱包充值记录时,应检查充值 transaction 所在的 block_num 是否小于 last_irreversible_block (最新不可逆区块),如果 block_num 大于 last_irreversible_block 则表示该区块仍然是可逆的,存在「假充值」风险。

上一篇: 竞猜类游戏 Fastwin 遭黑客攻击背后:Block.one 官方悄然做了重大更新
下一篇: 继超级节点竞选之后,EOS 社区又迎来了新一轮的「全民运动」
推荐专栏
web3首席知识博主
一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
爱Web 3,爱生活,爱科技,爱炒币的老韭菜
热门币种
更多
币种
价格
24H涨跌幅
BTC比特币
¥267,916.95
37,538.63 USDT
+5.68%
ETH以太坊
¥14,653.39
2,053.13 USDT
+4.22%
USDT泰达币
¥7.24
1.01 USDT
+0.2%
BNB币安币
¥1,805.75
253.01 USDT
+3.56%
XRP瑞波币
¥4.61
0.64620 USDT
+3.1%
SOLSolana
¥473.69
66.37 USDT
+16.8%
USDC
¥7.14
0.99980 USDT
-0.02%
OKBOK币
¥425.96
59.68 USDT
+2.6%
ADA艾达币
¥2.72
0.38160 USDT
+7.74%
DOGE狗狗币
¥0.54850
0.07686 USDT
+5.81%
热搜币种
更多
币种
价格
24H涨跌幅
dYdX
¥30.23
4.1719 USDT
+10.27%
Filecoin
¥38.66
5.3346 USDT
+10.62%
FTX Token
¥26.76
3.6921 USDT
+2.5%
PancakeSwap
¥19.44
2.6829 USDT
+5.84%
Solana
¥480.98
66.371 USDT
+16.8%
奇亚
¥197.66
27.2758 USDT
+3.32%
Yield Guild Games
¥3.08
0.4246 USDT
+4.43%
Conflux
¥1.24
0.1711 USDT
+7.47%
火必积分
¥21.87
3.0173 USDT
+5.06%
Terra Classic
¥0.00
8.293E-5 USDT
+3.33%
阿童木
¥71.74
9.8992 USDT
+9.92%
比特币
¥272,034.94
37538.63 USDT
+5.68%
最新快讯
更多
金色午报|11月16日午间重要动态一览
2023-11-16 12:00:55
SoraVentures联创:台湾对任何交易所都没有任何限制
2023-11-16 11:57:40
SoraVentures联创:如果在香港或新加坡运营加密货币基金,投资或言论会受到限制
2023-11-16 11:57:40
SoraVentures联创:如果在香港或新加坡运营加密货币基金,那么的投资或言论会受到限制
2023-11-16 11:57:40
SoraVentures联创:如果在香港或新加坡获得法律许可,那么的投资或言论就会受到很多限制
2023-11-16 11:57:40
比特币网络常规交易手续费升至186sats/字节
2023-11-16 11:56:15
Web3社交协议beoble完成200万美元Pre-Seed轮融资,DCG等参投
2023-11-16 11:54:45
下载币界网APP