2026年1月8日、Truebit Protocolがハッキングされ、8,535.36 ETH(約2,644万米ドル)の損失を生じました。Truebit Protocolの公式チームは翌日の早朝にこれを確認する声明を発表しました。ExVulセキュリティチームは今回の攻撃事件について詳細な脆弱性分析を行い、その分析結果は以下の通りです。
攻撃フロー
攻撃者アドレス:
0x6c8ec8f14be7c01672d31cfa5f2cefeab2562b50
攻撃トランザクションハッシュ:
0xcd4755645595094a8ab984d0db7e3b4aabde72a5c87c4f176a030629c47fb014
攻撃者は、getPurchasePrice→0xa0296215→0xc471b10b のトランザクションを4ラウンド繰り返し呼び出すことで攻撃を完了させます。ここでは、最初のループを例にとって分析します。
1. 攻撃者はまず getPurchasePrice(240442509453545333947284131) 関数を呼び出し、0 が返されることになります。

2. 攻撃者は msg.value を 0 に設定したまま 0xa0296215(c6e3ae8e2cbab1298abaa3) 関数を呼び出しました。最終的に 240,442,509,453,545,333,947,284131 枚の TRU が正常にマウントされました。

3. 攻撃者は0xc471b10b(c6e3ae8e2cbab1298abaa3)関数を呼び出しました。最終的に240442509453545333947284131枚のTRUを破壊し、5105.06枚のETHを獲得しました。
攻撃ロジック分析
上記の攻撃フローを理解することで、getPurchasePrice 関数と 0xa0296215 関数の論理に問題があることが明確になります。以下では詳細な分析に入ります(契約がオープンソースになっていないため、以下に示すコードはすべてデコンパイルしたコードです)。


2つの関数の共通点を比較することによって、0x1446 関数は指定された数量のTRUを購入するために必要なETHを取得するために使用されていることがわかります。明らかに、0x1446 関数の論理に問題があり、ETHの計算が誤っている原因となっています。以下に、0x1446 関数内の論理を詳しく分析します。

0x1446 関数内のロジックを観察すると、最終的な計算結果が v13 == 0 となるため、上記の計算ロジックに間違いがある可能性が高いです。0x18ef 関数は _SafeMul と同じ機能を持つため、問題はネイティブの加算 v12 + v9 にあります(このコントラクトのバージョンは ^0.6.10 なので、オーバーフローのチェックがありません)。
v12 と v9 はそれぞれ次を表します:

上記の分析を通じて、攻撃者の攻撃の思路は、非常に大きな _amountIn を入力し、v12 + v9 がオーバーフローして非常に小さな値になるようにし、最終的に (v12 + v9) / v6 == 0 となるようにすることです。
要約
Truebit Protocol が今回の攻撃を受けた根本的な原因は、トークン購入価格の計算ロジックに深刻な整数オーバーフローの脆弱性が存在していたことです。スマートコントラクトが使用していた Solidity ^0.6.10 は、重要な算術演算に対してセキュリティチェックを行っておらず、結果として 8,535.36 ETH の大きな損失を生じてしまいました。現在、新しいバージョンの Solidity ではオーバーフローの問題自体が緩和されています。今回の攻撃は、おそらくハッカーがAIを活用して、すでに稼働中の古いDeFiプロトコルを自動的にスキャンし、脆弱性を発見したものです(最近の Balancer や yETH 攻撃も同様の手法です)。我々は、今後こうしたAIを活用した古いDeFiプロトコルへの攻撃がますます増加すると考えています。そのため、プロジェクト側にはスマートコントラクトのコードに対して新たなセキュリティーアウディットを実施し、脆弱性が見つかった場合は速やかにコントラクトのアップグレードまたは資産の移動を行うとともに、チェーン上の監視を徹底し、異常を早期に発見し、損失を最小限に抑えるよう強くお勧めします。

