b14gで9,700万CORE流出、「0枚の引き出し」を悪用したハッキングの手口

ビットコインステーキング基盤のb14gが10月31日にハッキング被害を受け、約9,700万枚のCOREトークンが流出した。

攻撃者は「0枚を引き出したい」という申請を99回送り、91のステーキングポジションを1回の取引でまとめて空にした。この記事では、なぜ0枚の申請が全額流出につながったのか、盗まれた資金がどこへ動いたのか、預けたビットコインは無事なのかを順に整理する。

ビットコインを活用して利回りを得る「BTCFi」は拡大が続く分野だ。複数の仕組みを組み合わせるサービスの弱点がはっきり出た事例として、利用者にとっても他人事ではない。

b14gのハッキング、被害の全体像

b14gのハッキング、被害の全体像

91のポジションが1回の取引で空に

ブロックチェーン分析企業Bitqueryの調査によると、攻撃が起きたのは10月31日の9時29分(UTC、日本時間18時29分)だ。流出したCOREは約9,700万枚で、Bitqueryは被害額を約147万ドルと見積もっている。

標的になったのは、b14gが管理する91のステーキングポジションである。ステーキングとは、トークンを預けてネットワークの運営に協力し、見返りに報酬を受け取る仕組みのことだ。銀行に預金して利息をもらう感覚に近い。

攻撃者はこれらのポジションを1回の取引でまとめて引き出し、自分が管理するウォレットへ送った。b14gは不正な引き出しを認め、影響を受けたコントラクトを停止したと発表している。Coreの開発チームやセキュリティ企業、取引所と連携して資金の回収を進めているという。

ビットコイン本体は被害を免れた

b14gによると、被害はCOREの預け入れ分に限られる。同プロトコル経由でステーキングされたBTCは、ビットコインのブロックチェーン上でタイムロックされたままで、影響を受けていない。

タイムロックとは、指定した期間が過ぎるまでコインを動かせないようにする機能だ。定期預金に満期まで手を付けられないのと似ている。BTCはビットコインのチェーン上で鍵がかかった状態にあるため、b14g側のコントラクトが破られても持ち出せなかった。

Coreの運営組織であるCore DAOも、ブロックチェーン自体は侵害されていないと説明した。取引の正しさを参加者で合意するコンセンサスの仕組みは、事件の間も通常どおり動いていたという。

ブロックを検証・承認する参加者であるバリデーターや、Core本体のステーキングコントラクトにも異常はなかった。バリデーターに直接、または他のプロトコル経由でステーキングされたCOREにも影響はないとしている。

「0枚の引き出し」がなぜ全額流出になったのか

「0枚の引き出し」がなぜ全額流出になったのか

b14gとCoreの関係を整理する

まずは前提となる仕組みを押さえておこう。Coreはビットコインと連携するブロックチェーンだ。BTC保有者はビットコインを手放さずに、Coreのネットワーク運営に参加して報酬を得られる。

b14gは、このCoreの上で動くサービスである。BTC保有者は自分のBTCとCOREの預け入れを組み合わせることで、より高いステーキング報酬を狙える。b14gは集めたCOREをステーキングポジションとして管理し、バリデーターに委任する役割を担っていた。

要するに、利用者とCoreのステーキング契約の間に、b14gが仲介役として立っている構図だ。今回の穴は、この仲介役の部分にあった。

「0」を「全額」と読むCore側の仕様

スマートコントラクトとは、ブロックチェーン上で自動実行されるプログラムのことだ。自動販売機にお金を入れれば飲み物が出てくるように、条件を満たせば人の手を介さず処理が進む。命令の中身が確認されなければ、そのまま実行されてしまう。

Bitqueryによると、Coreのステーキングコントラクトには変わった決まりがある。引き出し額に0枚を指定すると、「預けている全額を引き出す」という指示として扱う仕様だ。

「0を全額の意味で使う」設計自体は、プログラミングの世界では珍しくない。全額を出したいときに残高をいちいち調べなくて済むため、使い勝手は良い。ただし、命令を出した人に本当に権限があるかを確かめないと、一気に危険な仕様へ変わる。

持ち主の確認をせずに命令を中継したb14g

攻撃者は、自分が資金を出していないステーキングポジションに対して、0枚の引き出し申請を99回送った。本来なら、b14gのコントラクトが「この人はポジションの持ち主か」を確かめて拒否すべき場面だ。

ところがb14gのコントラクトは申請を受け付け、Core側のステーキングの仕組みへそのまま渡した。Core側は「0枚なら全額」の決まりに従って処理し、約9,700万枚のCOREが解放された。つまり、b14gの権限チェックの甘さとCore側の特殊な仕様がかみ合って被害が生まれたということだ。

管理者の秘密鍵が盗まれた形跡や、悪意あるコントラクトが新たに仕込まれた形跡は見つかっていない。問題のロジックは約17カ月前から存在していたとされる。

一方でBitqueryは、b14gのソースコードそのものは確認していないと断っている。どのコードの誤りが不正な引き出しを許したのか、具体的な箇所までは特定できていない。

攻撃から停止までの66分と資金の行方

攻撃から停止までの66分と資金の行方

停止までの間に2,300万COREが移動

ブロックチェーンの記録を見ると、b14gが該当コントラクトを止めたのは10時35分(UTC)だった。最初の攻撃から約66分が経過していた計算になる。

この間に攻撃者は、元のウォレットから2,300万COREを、新しく作った複数のアドレスへ移している。資金を細かく分けて動かすのは、追跡を難しくするための典型的なやり方だ。

もっとも、この時系列だけではb14gがいつ攻撃に気付いたかまではわからない。b14gは、事態を把握した直後にコントラクトを停止したと説明している。

取引所を経由した流れと凍結の動き

さらに追跡すると、盗まれた資金の一部はBybit、Gate.io、MEXCといった取引所の関連インフラにつながる中継アドレスを通っていた。

Bitqueryは、攻撃者に最初の取引手数料を供給したサービスも特定している。このサービスは盗まれた資金から約1,100万COREを受け取り、MEXCの入金アドレスへ転送していた。

ただし中継ウォレットの中には、他の顧客の資産も扱うものが含まれる。そのため、すべての送金を攻撃者に直接結び付けるのは難しいとBitqueryは注意を促している。

10月31日夜の時点で、盗まれたトークンの70%にあたる約6,800万COREは、3つのウォレットに置かれたまま動いていない。これとは別に、取引所のパートナーが攻撃者に関連する約900万COREを凍結したとb14gは報告した。

資金の大半が動かずにいる理由はまだわからない。一度に大量のCOREを売ろうとすれば取引所で目立ち、凍結されるリスクも高まる。攻撃者が身動きを取りにくい状況にあるとの見方もある。

今回の事件が示すBTCFiの課題

今回の事件が示すBTCFiの課題

単体では正常でも、組み合わせると穴になる

今回の事件で目を引くのは、Core側もb14g側も、それぞれ単体では「壊れていない」ように見える点だ。Core DAOが強調するとおり、Coreのチェーンとステーキングコントラクトは仕様どおりに動いていた。問題は、その仕様を上に乗るb14gが正しく扱えていなかったことにある。

DeFi(分散型金融)では、複数のプロトコルを積み木のように重ねる「コンポーザビリティ(組み合わせ可能性)」が強みとされる。一方で、土台側の細かな仕様を上のサービスが見落とすと、今回のような穴が生まれやすい。0に特別な意味を持たせる仕様は、その典型例との見方がある。

17カ月も問題が表面化しなかった点も重い。監査やテストが通常の引き出しを中心に行われ、0枚というエッジケース(想定の端にある例外的な入力)の検証が不十分だった可能性が指摘されている。

「BTCは安全」の意味を正しく読む

b14gの説明どおり、ビットコイン本体は守られた。ただ、BTCとCOREを組み合わせて高い利回りを狙う仕組みでは、COREの部分が攻撃対象になる。「BTCは無事」が「預けた資産がすべて無事」を意味するわけではない点は押さえておきたい。

もう1つ気になるのが、停止までにかかった66分という時間だ。異常な出金を自動で検知して止める仕組みがあれば、移動した2,300万COREの一部は防げた可能性がある。監視と緊急停止の体制は、BTCFiサービスを比べる際の重要な材料になりそうだ。

利用者が今後確認したいこと

b14gは、ポストモーテム(事後報告書)を公開すると約束している。技術的な原因、利用者の損失規模、預け入れたユーザーへの今後の対応をまとめる予定だ。ただし補償計画はまだ示されていない。

利用者にとって大事なのは、報告書で損失がどこまで補われるかだ。凍結済みの900万COREと、動いていない6,800万COREが回収できるかどうかも補償の規模を左右する。報告書が出るまでは、b14gの公式発表を直接確認し、SNS上の「補償受付」をうたう怪しい誘導には近づかないのが安全だ。

この記事のポイント

  • b14gで10月31日、約9,700万CORE(約147万ドル相当)が91のステーキングポジションから流出した
  • Core側の「0枚の引き出しは全額出金」という仕様を、b14gが持ち主の確認なしに中継したことが原因とみられる
  • タイムロックされたBTCは無事で、Coreのチェーン自体も侵害されていない
  • 盗まれたCOREの70%は3つのウォレットに残り、約900万COREは取引所が凍結した
  • b14gは事後報告書の公開を約束しているが、補償計画は未発表である
共有:

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)