乱数の脆弱性の背後にある技術原理を探ります: EOS.WIN クイズ ゲームはどのようにしてハッキングされたのでしょうか?

先月、ブロックチェーン セキュリティ会社 PeckShield は、EOSBet、EOSCast、FFgame、EOSDice、EOSWin、MyEosVegas、LuckyGo、EOS Lelego など 8 つ以上の EOS クイズ ゲームがハッキングされたことを発見し、明らかにしました。以前の市場平均価格 1 個あたり 35 元に基づくと、総利益は 170,503.5 EOS で、ハッカーはそのようなゲームから 5,967,662.5 元以上の利益を得ており、通常の EOS の生態秩序を深刻に脅かしています。
PeckShield のセキュリティ担当者はさまざまなゲームの攻撃特徴を抽出し、最初に以下のことを発見しました: 1. 組織的かつ標的型攻撃を実行する攻撃者の背後にはさまざまなハッカー グループが存在する; 2. 攻撃が成功する理由のほとんどは乱数の脆弱性に関連している; 2. 攻撃が成功する理由のほとんどは乱数の脆弱性に関連している。 3. 同様の攻撃がより頻繁に行われる可能性があり、その攻撃効率は徐々に向上する傾向にあります。
EOS クイズ ゲームの大部分はまだオープンソースではないため、乱数の脆弱性の背後にある技術原理を解明し、ハッカーが繰り返し攻撃に成功した理由を解明するために行われました。 PeckShield セキュリティ チームは、典型的な EOS.WIN ゲームをサンプルとして使用し、ハッカーの観点から復元し、乱数脆弱性攻撃の背後にある謎を全員に理解させました。
11 月 12 日、PeckShield 状況認識プラットフォームのデータによると、午前 8 時 59 分から 9 時までの 1 分以内に、ハッカーは EOS.WIN ゲーム コントラクト (eosluckydice) に対して合計 10 回の攻撃を開始しました。そして 9,180 EOS を超える利益を上げました。 PeckShieldのセキュリティ担当者は、ハッカーが昨夜22時46分に最初に小規模なテスト攻撃を実行し、165回の攻撃を行って攻撃方法を習得した後、複数の関連アカウントを使用して9時に迅速な攻撃を実行することを選択したことを追跡および分析しました。次の日。このゲームでは、より安全な 2 つの遅延トランザクション情報も乱数の構成要素として使用されていますが、ハッカーは依然としてこれらの制限を巧みに回避し、攻撃を実行することに成功しました。
ハッキングの原理と抽選プロセス:
EOS.WIN は主に数字当てゲームとブラックジャックの 2 つのゲームで構成されており、数字当てゲームではユーザーが任意に数字を選択でき、システムはユーザーが選択したサイズに応じて対応するオッズを与え、その後システムがランダムに数字を与え、その結果がユーザーの選択したサイズと一致する場合、賞品とみなされ、獲得金額は投資金額にオッズを乗じたものとなります。
画像の説明

(図1:DICEゲームの抽選処理)
PeckShield のセキュリティ担当者が分析した結果、コントラクトの乱数は get_random 関数を通じて取得され、乱数の生成に影響を与える要素は次のとおりであることがわかりました。txid はトランザクション ハッシュ ID、tapos_block_num トランザクション ブロックの高さ、tapos_block_prefix ブロック ID プレフィックス、 bet_id グローバル宝くじ番号など
さらに深く理解するには、まずポピュラーサイエンスに関する背景知識をいくつか取得します。
1. 遅延トランザクションとtapos_block_prefix: 一般的な乱数生成方法では、そのほとんどが重要なコンポーネントとしてtapos_block_numとtapos_block_prefixを使用し、予測不可能性を確保するためにトランザクション内の将来のブロックの情報を指定します。遅延トランザクションが契約で使用されている場合、つまり、トランザクション (宝くじなど) 中に遅延間隔が指定されている場合、将来の情報を使用しているように見えますが、実際にはトランザクションが発行された時点で、システムはすでに使用する最新の同期を指定し、ブロック (head_block) 情報、したがって、tapos_block_num および tabos_block_prefix も決定されます。
2. トランザクションステータス情報のロールバック: EOS トランザクションでは、トランザクション内のアクションが異常に実行された場合、トランザクションステータス全体がロールバックされます。たとえば、自分のアカウントにコントラクトをデプロイし、送金受領書を受け取るたびに例外をスローすると、送金プロセス全体が失敗し、残高を含むすべてのステータス情報が同じままになる可能性があります。
3. トランザクション ハッシュ ID の計算: トランザクション (トランザクション) には複数のアクションを含めることができますが、すべてのアクション パラメータ情報が確認できれば、前述の tabos_block_prefix (ref_block_prefix) 情報と組み合わせることで、トランザクション ハッシュ ID を自分で計算できます。
つまり、攻撃者は宝くじ番号 (bet_id) を利用して乱数生成に参加し、インライン呼び出しの失敗により状態情報のロールバックを引き起こし、複数の契約アカウントを同時に制御してトランザクション リクエストを送信します。同時に、最終リクエストを確実に行うために、アカウントは予想される宝くじのシリアル番号を取得して、報酬を獲得するための乱数の生成に参加することができます。 EOS.WIN を例に挙げると、攻撃者は最初に 5 つのアカウントを使用して少額の金額を賭け、より高い確率を習得した後、最大額の最後のアカウントを使用してメインの賭けを行い、賞金を獲得しました。確率が高くなります。
具体的な攻撃プロセスは次のとおりです (下図を参照)。
1. 攻撃者は 6 つの攻撃コントラクトを展開します。攻撃メソッドを呼び出すと、6 つのアカウントに攻撃コントラクト内のトランザクション リクエストが同時に送信され、これらのリクエストは同じブロックに描画されます。プロセスは一貫しているため、宝くじトランザクションのtapos_block_numとtapos_block_prefixは同じですが、bet_idのみが異なる場合があります。
2. 攻撃者の最初の 5 つの攻撃コントラクトは、宝くじ通知を受信したときに現在の bet_id を取得し、この ID が最終的なアカウントに賞金を獲得させることができるかどうかを判断できます。
1) 計算の結果、最後のアカウントが当選できないことが判明した場合、このアカウントの抽選通知は通常どおり実行され、後続のアカウントは新しい抽選番号を使用して乱数を計算します。
画像の説明

(図2:攻撃者のマルチアカウント攻撃プロセス)
勝つ確率:
上記の抽選と攻撃プロセスから、アカウントがフェイントとして追加されるたびに、最終的なメイン攻撃アカウントが勝つかどうかを事前に計算する追加の機会があることがわかります。推測の数に従って、オッズが 5 倍になるように計算するには 20 を選択し、6 つのアカウントで勝率は約 74% に増加します。ただし、すべての攻撃が勝つという保証はまだありませんが、攻撃者は 10 回中 6 回勝つことができます。ただでさえ超高確率の攻撃を繰り出し、通常ゲームの勝率の秩序を乱す。
安全上のアドバイス:
EOS.Win などのゲームでは、乱数が攻撃者が制御できる変数、つまりゲームの抽選番号 (bet_id) の影響を受けるため、PeckShield は開発者が攻撃者が制御できる変数を削除する必要があると推奨しています。 DAppの乱数生成、ゲームの抽選番号などの変数を利用することで、同一トランザクション内での抽選動作と通知動作(受信)を回避し、トランザクション状態のロールバックを回避し、ハッカーからの攻撃を防ぎます。


