Bybit 2025年 改ざんされた署名の画面

Bybit の鍵も設備も破られていない。署名者が開いた Safe{Wallet} の画面の JavaScript が、配信元のクラウドで書き換えられ、署名者は送金のつもりでウォレットの中身を差し替える取引に署名した。止める所は、署名する中身を、署名を求める画面と別の経路で確かめることにある。

2025年2月21日に Bybit の ETH のコールドウォレットから流出した件。FBI は約15億ドル相当とし、北朝鮮の TraderTraitor によるものと特定した[1]。最初の侵害は2025年2月4日の Safe{Wallet} の開発者の端末[4]。Safe は2025年2月28日に、基盤を作り直し全部の資格情報を回したうえで Ethereum での提供を段階的に戻したと公表した[3]。Bybit は2025年6月4日時点で、盗まれた資金の追跡は続いているとした[5]。2026年11月時点の公開資料で書いています。

要点

  • 入口は、マルチシグのウォレットの画面を提供する Safe{Wallet} の開発者の macOS の端末だった。ダウンロードのフォルダにあった Docker の案件が、最初の悪い通信を出した。
  • 攻撃者は端末から取った有効な AWS のセッションのトークンで Safe{Wallet} の AWS に入り、画面を配る S3 の JavaScript を書き換えた。多要素認証の装置の追加には失敗していた。
  • 書き換えた JavaScript は、Bybit の特定のコールドウォレットの取引のときだけ働き、取引を、事前に置いた契約への委任呼び出しに差し替えた。流出の約2分後に元へ戻された。
  • 3人の署名者が署名し、ウォレットの実装が差し替えられ、40万 ETH 余りが運び出された。
  • 根本の守りは、署名の前に、署名する中身を画面と別の経路で解読して確かめること。委任呼び出しと登録の無い宛先には署名しない。DMM Bitcoin 2024年と同じ型である。

何が起きたか

2月4日の端末の侵害、2月5日からのクラウドへの侵入、2月19日の画面の書き換え、2月21日の流出と書き戻しの4つの段 1 端末 2月4日 開発者の macOS Docker の案件 2 クラウド 2月5日から Safe{Wallet} の AWS で下調べ 3 画面 2月19日 S3 の JavaScript を書き換え 4 流出と発覚 2月21日 署名で流出 約2分後に書き戻し 侵入から流出まで17日。画面の書き換えから流出まで2日 Bybit が気付いたのは流出の後で、それまでの段は Safe{Wallet} の側にあった
図1 端末の侵害から流出までの段
日付出来事
2025年2月4日Safe{Wallet} の開発者の macOS の端末が侵害される。最初の悪い動きは、株の投資の模擬を名乗る Docker の案件が外の領域へ通信したもので、ファイルはダウンロードのフォルダにあった。Sygnia は、Safe{Wallet} が X に載せた Mandiant の暫定の報告の抜粋をもとに書いている[4]
2025年2月5日開発者の AWS の資格情報で、Safe{Wallet} の AWS のアカウントに入られる。接続は商用の VPN のアドレスからで、攻撃に使われる Linux の配布の名前を含む利用者の識別子だった[4]
2月5日から攻撃者は AWS の中で動き続けた。多要素認証の装置を足そうとして失敗し、端末の悪いプログラムが取ったとみられる有効なセッションのトークンを使った。開発者の作業の時間帯に合わせて動いた[4]
2025年2月19日Safe{Wallet} の画面を配る S3 のバケットの JavaScript が書き換えられる。署名者の端末の Chrome のキャッシュに残った応答の頭書きで、最終の更新がこの日だった[4]
2025年2月21日Bybit が、Safe{Wallet} の画面で、ETH のコールドウォレットから運用のウォレットへの移動を始める。取引が差し替えられ、資金が運び出される[4]。FBI はこの日ごろの約15億ドル相当の窃取とする[1]
2025年2月21日 14時15分 UTC悪い取引の約2分後に、JavaScript が書き換えの無いものに戻される。跡を消すためとみられる[4]
2025年2月24日Sygnia が、app.safe.global から配られる物に悪いコードが無いことを確かめる[4]
2025年2月26日FBI が、北朝鮮の TraderTraitor によるものと公表し、洗浄に使われるアドレスとの取引を止めるよう求める[1]。Bybit が、調査を頼んだ Verichains と Sygnia のどちらも Bybit の基盤に侵害の兆候を見つけなかったこと、Safe の開発者の資格情報が侵害されて Safe{Wallet} の基盤に入られ、署名者が欺かれたことを公表する[2]
2025年2月28日Safe の財団が、侵害された Safe{Wallet} の開発者の端末を通じて、偽装した悪い取引が提案されたと公表する。Safe の契約に弱点は無かったとし、基盤を作り直し、全部の資格情報を回したとする[3]
2025年6月4日Bybit が、事故の後1か月で9件の監査と50を超える対策を済ませ、コールドウォレットの仕組みを改め MPC を採ったと公表する。盗まれた資金の追跡は続いているとした[5]
数字と言い方の食い違い

報道では14億ドルと15億ドルが混在するが、FBI は約15億ドルとする[1]。Bybit がハッキングされた、という言い方も広まったが、Bybit の依頼した調査は Bybit の基盤に侵害の兆候は無いとした[2]。署名者の装置の画面に何が出ていたかは、公表資料に無い。

通った道筋

開発者の端末からセッションのトークンで Safe{Wallet} の AWS に入り、S3 の JavaScript を書き換え、署名者の画面がそれを読み込み、差し替えた取引に署名し、コールドウォレットの実装が差し替えられる Safe{Wallet} の側 開発者の端末 悪いプログラム トークン AWS と S3 JS を書き換え 多要素認証は通った後のトークンで越えた Bybit の側 署名者3人のブラウザ app.safe.global を開く Bybit の対象のウォレットの時だけ 取引の中身と確かめを差し替える 署名された取引 事前に置いた契約へ委任呼び出し コールドウォレットの契約 実装が攻撃者の物に替わる 承認なしに資金を運び出す 40万 ETH 余り。約2分後に JS を戻す
図2 開発者の端末から流出までの道筋。Sygnia の調査と、そこに引かれた Mandiant の暫定の報告による
段公表されたこと
端末Mandiant は、この侵害が、過去の窃取の調査や、北朝鮮の集団が開発者の端末を狙う社会工学の手口と、流れ、コンテナの名前、領域の名前、中のファイルの作りで強く似ているとした[4]。この型の接触の手口は、2022年4月に CISA、FBI、米財務省が TraderTraitor の名で注意を呼びかけていた[6]。
クラウドSafe{Wallet} の設定は、STS のセッションに12時間ごとの多要素認証の取り直しを求めていた。攻撃者は装置の追加に失敗し、すでに認証を済ませた有効なトークンを使った[4]。AWS の中での動きの詳細は、Sygnia の記事の時点で公表されていない[4]。
画面書き換えは、S3 のバケットの上の JavaScript を直接変えるものだった。Bybit の CEO が共有した Sygnia と Verichains の暫定の報告は、どちらもこの経路を示した。改変された JavaScript は公開のウェブの保存庫にも残っていた[4]。
差し替え挿入されたコードは、取引の出どころが2つの契約のアドレスのどちらかと一致する時だけ働く条件を持ち、1つは Bybit の契約だった。決め打ちの値で取引の中身を書き換え、取引と署名を確かめる関数も細工していた[4]。
実行差し替えた取引は、operation を1、つまり委任呼び出しにして、事前に置いた悪い契約の処理をウォレットの文脈で走らせ、ウォレットの実装を置き換えた。その契約が足した関数で、マルチシグの承認なしに40万 ETH 余りを運び出した[4]。

Sygnia は、2024年の WazirX と Radiant Capital の窃取でも、画面に正しい取引の中身を出しつつ裏で悪い取引に署名させる手口が報告されていたと書く。ただし、この2件が Safe{Wallet} の基盤から来た兆しは無いとする[4]。手口は前からあり、届け方が配信元の書き換えに変わった。

署名者が見た物と、署名した物

次は架空の作りで、マルチシグの取引の中身を2つ並べたものである。値はすべて架空で、アドレスは短く書いている。

意図した取引は運用のウォレットへの通常の送金で、署名した取引は未知の契約への委任呼び出し。画面の表示はどちらも同じにできる 意図した取引 to 0xWARM...01 value 30000 ETH data 0x operation 0 0 は通常の呼び出し 署名した取引 to 0xEVIL...9f value 0 data 0x1234abcd... operation 1 1 は委任呼び出し 画面を作る JavaScript が書き換えられていれば、どちらを署名させても同じ表示を出せる 見比べるべきは、署名の装置に届いた生の中身と、それを別の所で解読した結果
図3 架空の取引で示す、意図と署名の食い違い
  • 委任呼び出しは、呼んだ先のコードを、ウォレットの契約自身の記憶域と権限で走らせる。ウォレットの実装を差し替えることも、その中でできる[4]。送金に委任呼び出しは要らない。
  • マルチシグは、何人が同意したかを数える仕組みで、何に同意したかは各署名者が確かめる前提にある。全員が同じ画面を信じれば、人数は守りにならない。

どこで止められたか

開発の端末、本番の権限、配る物、署名の前、ウォレットの5つの段に、それぞれ止める所を置く 開発の端末 本番の権限 配る物 署名の前 ウォレット 1 知らない案件を業務の端末で動かさない 動かすなら使い捨ての仮想マシンで 2 端末に本番を書き換える鍵を置かない 配る物の更新は、承認の要る仕組みだけに 3 配っている物と作った物を突き合わせる 2日間の書き換えに気付く機会 4 署名する中身を別の経路で解読する 根本の段。どこで書き換えられても止まる 5 1回の署名で動く額を限る 通っても失う額に上限を置く
図4 段ごとの止める所
止める所この件で限り
知らない案件を業務の端末で動かさないダウンロードのフォルダの Docker の案件から始まった[4]開発者は人からコードを受け取るのが仕事で、全部は止められない。端末1台が入られても本番に届かない作りを先に置く
端末に本番を書き換える鍵を置かない開発者の AWS のトークンで、画面を配るバケットの中身を直接変えられた[4]多要素認証は、通った後のセッションを盗まれると効かない。トークンの寿命を短くしても、寿命の中で使われる
配っている物と作った物を突き合わせる書き換えは2月19日で、流出は2月21日[4]攻撃者は流出の約2分後に戻した。確かめる間隔が長ければ、跡は残らない
署名する中身を別の経路で解読するJavaScript は取引の中身と、取引と署名の確かめの関数の両方を細工した[4]。同じ画面の中での確かめは役に立たなかった解読する道具と、宛先の一覧を、署名を求める画面と別の所から入れなければ、同じく書き換えられる
1回の署名で動く額を限る1つのコールドウォレットから40万 ETH 余りが出た[4]額を限っても、何度も署名させられれば足し算になる。署名の前の確かめの代わりにはならない

DMM Bitcoin 2024年と比べる

FBI は、DMM Bitcoin の件も TraderTraitor によるものとしている[7]。2件は同じ形をしている。詳しくは DMM Bitcoin 2024年 書き換えられた送金の指図 にある。

項目DMM Bitcoin 2024年Bybit 2025年
入口委託先の先のウォレットのソフトの会社の社員。偽の採用試験の Python[7]ウォレットの画面を出す会社の開発者。Docker の案件[4]
書き換えた所指図を運ぶ通信の仕組み[7]署名者が開く画面の JavaScript[4]
交換所の鍵盗まれた話は公表資料に無い盗まれていない。Bybit の基盤に侵害の兆候は無い[2]
止まらなかった所署名の前に、署名する中身を確かめなかった同じ。確かめが同じ画面の中にあった

どちらも、交換所が自分では動かしていない会社の社員の端末が、送金の経路の一部になっていた。鍵をネットから離しても、何に署名するかを決めるのが外の会社の画面なら、その会社の端末1台まで守りの範囲に入る。

守り方

根本の直し方
  • 署名する所が、署名の直前に、生の取引を自分で解読し、宛先、額、呼び出しの種類、値を確かめる。解読の道具と宛先の一覧は、署名を求める画面と別の経路で入れる。考え方は A08 ソフトウェアまたはデータの完全性の不備 の、使う直前に確かめる節にある。
  • 委任呼び出しと、登録の無い宛先と、契約の実装を替える呼び出しには、運用の送金では署名しない決まりにし、署名の道具の側で拒む。
  • 取引のハッシュを、署名する装置と、別の人が別の端末で計算した値とで見比べる。全員が同じ画面を見て同意する形にしない。
  • 配る物の更新は、ビルドと承認の仕組みからだけできるようにし、開発者の資格情報で本番の置き場所を直接書けないようにする。権限の絞り方は 秘密の鍵の扱い の権限を最小にする節にある。

署名の前の確かめ 架空の署名の道具

// verify-before-sign.js  架空の例。画面から受け取った生の中身を、画面を信じずに読む
const tx = decodeMultisigTx(rawPayload);
if (tx.operation !== 0) return reject("委任呼び出しは署名しない");
if (!registeredDestinations.has(tx.to)) return reject("登録の無い宛先");
if (tx.data !== "0x" && !allowedCalls.has(selectorOf(tx.data))) return reject("許していない呼び出し");
if (tx.value > LIMIT_PER_TX) return reject("1回の上限を超える");
const hash = computeTxHash(tx, WALLET_ADDRESS, CHAIN_ID, tx.nonce);
showOnSigningDevice(hash);  // 別の端末で計算した値と声に出して照らし合わせる
  • registeredDestinations と allowedCalls は、画面の配信元と別の経路で、送金を指図する人とは別の人が登録する。画面から受け取れば、書き換えた画面が一覧も書き換える。
  • この確かめを画面の JavaScript の中に置いても効かない。この件では、確かめの関数ごと細工された[4]。
緩和の策
  • 配っている JavaScript を外から定期に取り、ビルドの成果物のハッシュと比べる。変わったら配信を止めて調べる。A09 セキュリティログとアラートの不備 の警告と保全の節のとおり、置き場所の変更の記録は別の権限の所へ送る。
  • 本番に触れる資格情報は、短い寿命で、使う場所の網から出た時だけ使えるようにする。いつもと違う接続元からの利用を警告にする。この件では、商用の VPN からの接続だった[4]。
  • コールドウォレットは分け、1回の署名で動かせる額を限る。考え方は A06 安全性を欠いた設計 の回数と量の上限の節にある。
  • 採用、共同の開発、投資の案件を名目に、コードを動かすよう求める接触を、社員全員の教育に入れる。TraderTraitor の手口として2022年から公表されている[6]。
  • 署名の画面を外の会社から借りるなら、その会社の開発の端末と本番の権限の管理を、取引の前に確かめる項目に入れる。

型としての整理は A03 ソフトウェアサプライチェーンの不備 の型3、ビルドと配布の仕組みを乗っ取られる型に当たる。

参照

  1. North Korea Responsible for $1.5 Billion Bybit Hack FBI、IC3 公共サービス告知、2025年2月26日
  2. Bybit Confirms Security Integrity Amid Safe{Wallet} Incident – No Compromise in Infrastructure Bybit、2025年2月26日
  3. Statement by the Safe Ecosystem Foundation Safe Ecosystem Foundation、2025年2月28日
  4. Bybit – What We Know So Far Sygnia、2025年3月16日。Bybit の署名者の端末を調べた調査会社のまとめで、Safe{Wallet} の側の記述は Safe が共有した Mandiant の暫定の報告による
  5. The Billion-Dollar Heist and What It Means for Crypto Security: Bybit's Security Overhaul After Hack Bybit、PR Newswire、2025年6月4日
  6. TraderTraitor: North Korean State-Sponsored APT Targets Blockchain Companies AA22-108A CISA、FBI、米財務省、2022年4月18日
  7. FBI, DC3, and NPA Identification of North Korean Cyber Actors, Tracked as TraderTraitor, Responsible for Theft of $308 Million USD from Bitcoin.DMM.com FBI、DC3、警察庁、2024年12月23日