Signal
📡 Signal|Liquid から 3,996 BTC が出ていったが、破られた鍵は一つもない
Liquid の連合ウォレットから約 3,996 BTC が払い出され、準備金は 197 BTC になった。SideSwap のペグアウト認可鍵も他の鍵も侵害されておらず、11-of-15 の多署名は手続きどおりに働いた。破られたのは鍵ではなく、L-BTC が本物かを確かめる側だった。
9月6日23時1分から23時28分までの27分のあいだに(日本時間、以下同じ)、ビットコインのサイドチェーンであるLiquidの連合ウォレットから、約3,996 BTC(約3億2,000万ドル)がビットコインのメインチェーンへ払い出された。準備金は約4,200 BTCあり、残ったのは197 BTCである。
ブロックストリームは、この払い出しに使われたSideSwapのPAK(ペグアウト認可鍵)について、侵害されていない、他のどの鍵も侵害されていない、と述べている。11-of-15の多署名はそのとおりに働き、連合は手続きどおりに署名した。破られたのは、鍵ではなかった。
何が起きたのかは、ブロックストリームの発表よりも、ElementsProjectのコミット履歴とビットコインのブロック本体のほうが具体的に語っている。順に見ていく。
■ 27分で払い出され、連合の残高は197 BTCになった
最初に動いたのは2.5 BTCだった。ビットコインのブロック965,780、23時1分57秒。その27分後のブロック965,783、23時28分56秒に、約3,996 BTCが同じ受取先へ払い出された。連合ウォレットに残ったのは197 BTCである。
払い出しの経路は、外形上はまったく通常のものだった。利用者がSideSwapのペグアウトサービスへL-BTC(Liquid上でビットコインを表すトークン)を送り、連合が対応するビットコインをメインチェーンで支払う。この日、その手続きは止まらなかった。
受取アドレスからは、OP_RETURN(ビットコインの取引に短い文字列を埋め込む領域)を使ったメッセージが書き込まれた。原文は「we are whitehats. contact us on chain」である。
ブロックストリームはステータスページで、ブリッジノードを一時的に無効化したこと、そのためネットワークへ新しい取引を送れないこと、取引所にはL-BTCの入出金停止を通知済みであることを公表した。Liquid上の他の資産は影響を受けていない。ステータスは日本時間9月7日の朝から、Public Bridge Nodesの障害として調査中のまま置かれている。
■ 修正コードは8月3日に書かれ、どのリリース版にも入っていない
ElementsProject/elementsのmasterブランチには、コミットc26d719「fix: range proof cache bind to asset and scriptpubkey」が入っている。著者の日付は8月3日、masterへ取り込まれたのは9月1日。変更されたのはsrc/script/sigcache.cppとsigcache.hの2ファイルだけで、差分は合わせて4行である。
レンジプルーフは、金額を秘匿したまま、その金額が妥当な範囲にあることを証明する仕組みを指す。検証には計算量がかかるので、一度検証した証明の結果はキャッシュされる。このコミットは、そのキャッシュのキーに資産の情報とスクリプトを結び付ける、という内容になっている。裏返せば、それまでは結び付いていなかった。
一方、配布版のタグはelements-23.3.3が最新で、公開日は4月13日である。8月3日にも9月1日にも、新しいタグは付いていない。修正がmasterに存在することと、その修正が動いているノードに届いていることは、別のことだ。
ここで一つ、線を引いておく。独立した技術分析はこのキャッシュの扱いを原因として指しているが、ブロックストリームは原因となったバグを公式には特定していない。SideSwapは、問題のL-BTCはElementsのバグから来たものであり、SideSwapのシステムから来たものではない、と述べている。コミットの日付と、リリースタグの不在は、誰でも確認できる事実である。それが今回の払い出しの原因だったかどうかは、まだブロックストリームの言葉になっていない。
■ 「盗まれた」という語が、この件では収まりが悪い
鍵は破られていない。連合の署名者は、規定どおりの多署名で正しく署名した。SideSwapは、支払いを求めてきたL-BTCを通常のL-BTCと見分けられなかったと説明している。どの層でも、担当者は自分の手順を守っている。
にもかかわらず、裏付けのないL-BTCが本物として受け付けられ、本物のビットコインがそれと引き換えに出ていった。防御線は、署名を何枚集めるかではなく、署名する対象が実在するかを各ノードが独立に確かめられるかどうかにあった。11人の独立した確認は、確認そのものが使い回されていれば、1回の確認と変わらない。
自称については、留保も出ている。LedgerのCTOであるシャルル・ギユメは、研究者であれば準備金を動かす前に脆弱性を開示するのが通例だと指摘した。実際、チェーン上のやり取りはこの数時間、返金交渉の体裁を取っている。受取側は、まずバグを直し、すべてのノードにパッチが当たったことを確認してから安全に返す、という趣旨のメッセージを書いた。ブロックストリームはPGP署名を付けたメッセージで、ブリッジノードにはパッチを当てた、返金して差し支えない、と返した。署名はブロックストリームが自社サイトで公開しているセキュリティ鍵で検証できる。
資金は9月7日12時30分、ブロック965,875で3,998.49849036 BTCの単一の未使用出力にまとめられた。9月7日20時20分の時点で、その出力は動いていない。返るかどうかはまだ決まっておらず、そのあいだL-BTCの裏付けは197 BTCのままである。
■ この設計はLiquidだけのものではない
Elementsは、Liquid専用に書かれたコードではない。機密資産を有効にしたElements派生のサイドチェーンは、同じ合意形成コードを共有する。今回問題になったのが検証キャッシュの扱いだとすれば、それはLiquidの設定ではなく、共有部分にある。
連合型のサイドチェーンは、単一の管理者を置かないために署名者を分散させる。だがその分散が効くのは、署名者それぞれが独立に中身を検証している場合に限られる。検証を高速化する仕組みが、検証の独立性を静かに削っていくことがある。今回の4行の差分は、その削られた部分を縫い直す作業だった。
外から追える確認点は三つある。ElementsProject/elementsのリリースページに新しいタグが付くか。ブロックストリームのステータスページで、Public Bridge Nodesの状態が調査中から変わるか。受取アドレスの単一出力が動くか。いずれも公開情報で、発表を待たずに読める。
準備金の97%が27分で出ていく事故は、鍵の管理の失敗としては説明できなかった。説明できるのは、何を検証するか、そしてその検証を誰が省略できるかという設計の側である。
🔗 一次ソース
- ブロックストリーム公式ステータスページ(Liquid Security Incident・約4,000 BTCの払い出し、SideSwap PAKは侵害されていない、ブリッジノード無効化、取引所へのL-BTC入出金停止通知)
- Elementsのコミット c26d719「fix: range proof cache bind to asset and scriptpubkey」(著者日付2026-08-03・masterへの取り込み2026-09-01・変更はsrc/script/sigcache.cppとsigcache.hの2ファイル)
- Elementsのリリース一覧(最新タグはelements-23.3.3・公開日2026-04-13。以後、新しいタグは付いていない)
- 受取アドレスの残高(ブロック965,875で3,998.49849036 BTCの単一未使用出力に集約・2026-09-07 20時20分時点で未使用)
- ビットコインのブロック965,783(連合の払い出しが確定したブロック・ブロック時刻2026-09-06 14時28分56秒UTC)
- 払い出しの内訳と11-of-15の多署名構成、OP_RETURNメッセージ原文、残高197.47 BTC(The Defiant)
- 時系列の詳細とSideSwapの説明、レンジプルーフ検証キャッシュを指す技術分析(defiprime・2026-09-06)
- チェーン上の返金交渉とブロックストリームのPGP署名メッセージ、ブロック965,875(The Block・2026-09-07)
- ホワイトハットという自称への留保(Ledger CTOシャルル・ギユメの指摘)と、L-BTCの裏付け状況(The Crypto Times・2026-09-07)