事件内容
12月18日の夜から19日の早朝まで、複数の EOS トップ DApp が攻撃されました。
EOSMax、ToBet、BigGame、および BetDice がトランザクションロールバック攻撃を受け、それぞれ 55,000 EOS、22000 EOS、14903.18 EOS、および 200000 EOS を失いました。
さらに、ハッカーはリプレイ攻撃の脆弱性を悪用してクイズゲーム TRUSTBET を攻撃し、11501 EOS を得ています。
現在 EOS の価格は 18 中国元で計算すると、合計約 546 万中国元の 303404.18 EOS 失いました。
ハッカーは攻撃で得た EOS を 2000 程度のアカウントを作って送金しようとしているので、追跡対応が難航しています。
参考リンク
- 500万程度のハッキング事件の始末は?(席卷EOS游戏超500万元黑客攻击,究竟是怎么回事?)
- EOS DApp ハッキング解析 トランザクション拒否によるなりすまし攻撃(原创| EOS DApp 攻击解析之利用交易未上链进行欺骗攻击)
- EOS DApp ハッキング解析 ブラックリストによるなりまし攻撃(原创| EOS DApp 攻击重现之利用黑名单账号进行欺骗攻击
)
事件分析
事件が起きたあと、いくつの分析が出ていましたが、 Jerry@EOS LIVE
さんが ToBet
のコントラクトを使って実際の動きを再現できたので、事実と一番近いじゃないかと思われます。再現手順は EOS DApp ハッキング解析 ブラックリストによるなりまし攻撃(原创| EOS DApp 攻击重现之利用黑名单账号进行欺骗攻击
) でまとめられています。
攻撃が成り立つのは、下記の前提があります
- API ノードには、ブラックリスト機能が動いていない、かつ、デフォルトの
SPECULATIVE
モードで実行している- ゲームコントラクトの実装は
- トランザクションがロールバックする時、次のトランザクションはロールバックされたトランザクション同じ結果になる
- ゲーム結果に従って賞金を送金する処理が非同期アクションで行っている、かつ、元のトランザクションと関連していない
攻撃流れ
EOS DApp ハッキング解析 ブラックリストによるなりまし攻撃(原创| EOS DApp 攻击重现之利用黑名单账号进行欺骗攻击
) の再現手順を参考し、アカウント名は下記としています。
アカウント名 | 説明 |
---|---|
attack | 攻撃処理が仕込んでいるコントラクト |
blacklist | ブラックリストに入っているアカウント |
tobetioadmin | 攻撃ターゲットのゲームコントラクト |
攻撃の流れは下記になっています
- 攻撃者は API ノードに対して
attack
コントラクトで、blacklist
アカウントの権限でtobetioadmin
にEOS
を送金トランザクションを送信する - ゲームコントラクトが送金を受けるとゲームをプレイする
- プレイヤーが勝つと、非同期アクションで
EOS
をattack
アカウントに返金する - BP ノードが送金トランザクションを受けた時、
blacklist
アカウントがブラックリストに入っているのでトランザクションを拒否したため、トランザクションがロールバックされる
結果的に、attack
アカウントからの送金がロールバックされたにも関わらず賞金がもらってしまいました
シーケンス図
対策
- API ノード側
- 実行のモードをちゃんと意識して、dapp 側に明示的に提示しておくほうが良い
- dapp 側
- 非同期アクションで処理を実行するときに、必要がある場合は、元のトランザクションと関連させて、元のトランザクションのステータスをちゃんと確認する
まとめ
BP 以外のノードでは、dapp 側のリクエストに対するレスポンスを早くするため、デフォルトのモードでは、トランザクションのリクエストを受けたら、ステートデータを更新するようにしています。
EOS は、このように、パフォーマンスのためいろいろ工夫していますが、気をつけないと膨大な被害が受けてしまいました。
この辺の実装の詳細と影響範囲は、もっと公式なドキュメントなどで dapp 開発者に告知してほしいですね。