复现回滚攻击
0x01 涉及攻击事件
1
- 被攻击平台:FairDice
- 攻击者账号:iloveloveeos
- 攻击时间:2018年9月12日
- 损失EOS:4,000 EOS(价值154,000 RMB)
2
- 被攻击平台:LuckyGo
- 攻击者账号:iloveloveeos
- 攻击时间:2018年11月15日
- 损失EOS:被攻击到下线
0x02 攻击原理
被攻击合约采用了同步开奖,回滚攻击的思路是恶意合约在dapp的action之后插入一个盈利检测action, 该action在reveal action之后执行,自然可以通过检测合约的余额来判断是否盈利。如果不盈利则触发assert从而导致整个交易回滚,最开始的转账action也作废即筹码回滚,攻击者不损失任何EOS,从而达到稳赢的结果
0x03 攻击复现
攻击合约
1 |
|
攻击过程
为eosattacker2部署攻击合约
1 | d1nn3r@ubuntu:~/Desktop/eos/build/programs/cleos$ ./cleos set contract eosattacker2 ~/Desktop/rollback/ |
添加eosio.code权限
1 | d1nn3r@ubuntu:~/Desktop/eos/build/programs/cleos$ ./cleos set account permission eosattacker2 active '{"threshold": 1,"keys": [{"key": "EOS4xgXALW7B3LtMWgYvVwb28UhSjmCzuy6uMgVjBUFUCHXQ8eoxU","weight": 1}], "accounts": [{"permission":{"actor":"eosattacker2","permission":"eosio.code"},"weight":1}]}' -p eosattacker2@owner |
当进行回滚攻击的时候,将所有lose的结果全部拒绝,只接受win的结果
1 | d1nn3r@ubuntu:~/Desktop/eos/build/programs/cleos$ ./cleos get currency balance eosio.token eosattacker2 |
0x04 防御方法
reveal采用延迟开奖,这样就会绕过攻击者对余额的判断
1 | template <typename... Args> |
而且实验发现即便攻击者知道延时时间也加上延时检测也无法攻击成功,因为delay_send的不是原子性的,即便失败也不会把之前的操作回滚
1 | d1nn3r@ubuntu:~/Desktop/eos/build/programs/cleos$ ./cleos get currency balance eosio.token eosattacker2 |
可以在nodeos终端看到信息
1 | info 2018-12-12T03:51:30.506 thread-0 producer_plugin.cpp:337 on_incoming_block ] Received block 3285a249e503f3dd... #607853 @ 2018-12-12T03:51:30.500 signed by accountnum11 [trxs: 0, lib: 591456, conf: 0, latency: 6 ms] |