【緊急速報続報】専門家が語る、DMM流出事件の要因考察

アイキャッチ画像引用元:https://x.com/DMM_Bitcoin/status/955328518165970945

昨日の記事(こちら)に引き続き、表題の事件の要因を掘り下げて解説しようと思います。

※さらに続報記事は、こちら → DMM不正流出、要因分析の考察修正

こんにちは、二代目デフィー捌号 (杉井 靖典) です。

昨日の記事は非常に反響があり、Xをはじめ、オフラインでも個別に問合せや議論がたくさんありました。
1つ1つ個別に応えていると、時間がいくらあっても足りないので、時短のために現時点で調査ができたところを詳しく書いてみようかなと思って筆を取った次第です。

それでは、行ってみましょう。

最重要点

今回の件で、一番目立つウォレットは、犯行に直接使われた 1B6rJRfjTX…kdZw7P のスプリッタウォレットですが、原因を追及するためにまず初めに着目すべきは、3で始まる「マルチシグウォレット」です。

このアドレス(3P8MfdM4p‥‥zAjmnUYD)を調べると、P2SH の 2 of 3 で運用されていることが分かります。

つまり、予め設定されている、3人の署名権者のうち、2人以上の署名を集めることができれば、トランザクションを発行できることになっています。

この時、署名されるトランザクションは、全員が同じ内容のものに署名しないと、最終的に有効なトランザクションにならないので、そう考えると、署名が為されるより前に、送信先が欺瞞されたトランザクションに差し替えられていないと、このような現象が起こり得ません。

まずは、これが、内部犯行説を疑うもっとも重要な根拠です。

業務用のウォレットシステムの仕組みを理解する

さて、ここから先は、業務用ウォレットの仕組みをしらないと、少し理解しにくいかもしれません。

交換事業者で使われる業務用ウォレットは、何か標準的なものがあるわけではなく、交換事業者によって採用しているものはマチマチで、自社で開発しているケースもあれば、外部の事業者に委託されているケースもありますが、言えることは、個人が利用するようなウォレットとは構造も仕組みも全く違うものという事です。

具体的には、利用者の出金依頼は、1日に何百件以上に登ることがありますから、これらの出金を効率的にこなすために、1日に1度ないし数度に分けて、定期的に行うように業務フローが組まれています。

その際、いわゆる「コールドウォレット」と呼ばれる、常時オフラインに置かれているウォレットから、上記の利用者の出金のために利用される、いわゆる「ホットウォレット」宛に、出金依頼を全て実行するために必要な出金用の元金と手数料を合計した数量の暗号資産を送信されます。


<図:一般的な業務用ウォレットのトポロジー>

そして、そのホットウォレット内では、出金依頼された全アドレス宛てに送信を行うためのトランザクションを作成し、署名が施されるわけですが、ここで、ビットコインの場合に話を移すと、トランザクションにはプロトコル上、容量制限が設けられているため、1度に送信できる送信先の数には限りがあるため、1回に送信できる宛て先は、せいぜい100件前後ですが、これが「スプリッタ」の役割を果たしています。

今回の場合、このスプリッタの役割を果たすホットウォレット部分がマルチシグウォレットとなっていたものと考えられます。

オペレーション体制に対する疑問

ここで、DMM が開示している説明によると、交換所内の「お客様用ウォレット口座」⇒「お客様出金先指定ウォレット口座」宛ての “承認” は2人体制で行ているとあります。



引用元:https://bitcoin.dmm.com/about/security

しかし、これだけを見ても、手続きのどこか2人体制で行われているのか、はっきりしません。
さらに「署名」でなく “承認” という言葉が使われているのも気になります。

おそらく、この “承認” とは、内部の業務フローとしての「承認」フローであって「署名」ではないのではないか?とも読めるのです。

すると、意味合いはだいぶ違ってきます。

交換所内の出金時の業務フローがどうなっているのかは知る由もありませんが、文字通り “承認” が上長の業務上の出金承認(つまり、ハンコを2つついている)だけなのであるとすれば、実際の「署名作業」は、現場の担当者が行っているのではないか?考えることもできるため、もし、そうなのであれば、その「2人体制の承認」は、暗号資産のハンドリングには、本質的に作用するものにはなっていません。

それから、前述のような、コールドウォレット ⇒ ホットウォレット(マルチシグ)という流れを考えると、少なくとも、3者以上(業務の安全性を考慮すると4者以上)の署名者が居ないと出金が成立しないことになるはずです。

ここで、確認したい点は以下の通りです

① コールドウォレット ⇒ ホットウォレット(マルチシグ)に移動させるトランザクションに署名を担当している者は誰なのか?

② そのコールドウォレットは、マルチシグが使われていないのか?シングルシグで動かせてしまう状態だったのか?

③ ホットウォレットはマルチシグであるのだから、ここは担当者や署名拠点が複数あるはずだが、そうすると、②の業務と③の業務は同じ人がやっていることになるのか?

④ ③の点を考慮すると結託しない署名者でないとならないはずなので、外部に業務委託しているはず。
すると、業務責任は外部の業務委託(おそらく、業務用ウォレットの提供事業者)にも及ぶのではないか?

このように、確認点を1つづつ精査していくと、2名体制 では足りないのです。
ましてや、その2名が「署名者」を差しているのではなく「承認者」を差しているならば、実際の実行者は誰?という話になるのです。

コールドウォレット

それから、業務に潜む脅威分析を行うに当たっては、業務用のコールドウォレットについての、一般認識との違いも知っておく必要があります。

業務用のコールドウォレットは、一般的に1つのウォレットにまとめて大量な額の暗号資産を入れておくにはリスクが高すぎるため、ある程度の数量に分割して、複数管理されていることが通常です。

その分割の仕方は、事業者によってマチマチであり、コールドウォレットは、利用されるまでネットワークに接続されないのが前提ですから、どのウォレットアドレスがその事業者のものであるかは、情報の開示がない限り、ホットウォレットに送られるトランザクションが発行されるまで、外部の人間が知ることは困難です。

ここで、注意したいことは、一般の方々には、コールドウォレット=ハードウェアウォレットと誤解されているのではないか?ということです。

もちろん、ハードウェアウォレットで管理している事業者もあるでしょうが、交換所の規模が大きくなればなるほど、それは現実的なソリューションではないため、実際にはソフトウェアで作られていることが多いです。

ただし「コールドウォレット」というからには、そのソフトウェアがインストールされたコンピュータは、インターネットはもちろん、社内のイントラネットからも切り離されていなければなりません。

交換事業者の中には、HSM(ハードウェア・セキュリティ・モジュール)の利用を謳っている事業者もありますが、クラウドタイプのものですと、オフライン要件を満たせませんので、オンプレミスで構築するとなると、イントラネット化しなければ効率的な要件を満たせないため、ネットワーク分離性の課題に対応するためには、相当巨額な設備投資になるはずです。

参考に、私の過去のコンサルティング事案から、業務用コールドウォレットの実例を紹介します。

【PDF】PCを用いてマルチシグネチャ対応のコールドウォレットを作成する方法 コールドウォレットハンドリンク

未署名トランザクションを改ざんしうる隙間

上記のような構成をとる業務用ウォレットシステムの環境下では、必然的に以下のような構成を取ることになります。

<出庫依頼を受けてトランザクションを作成する業務システム>
<トランザクションに署名を施す工程(コールドウォレット)>
<トランザクションを送信する工程>

この工程のうち、紫色の点線の部分は、ネットワークと分離されているため、手動工程が残ります。

これらの出入り口部分では、後継のシステムが検証可能な形で、前工程が出力したトランザクションの原本と相違ないことを確認する仕組みが求められなければなりませんが、手動工程が必要な部分で前工程の正当性検証が不十分であると、そこに付け入る隙が生まれます。
今回の例では、アドレスポイズニング攻撃が行われたことから、トランザクションの改ざんを仕掛けられるポイントは、<出庫依頼を受けてトランザクションを作成する業務システム>と<トランザクションに署名を施す工程(コールドウォレット)>の間だけです。

つまり、その作業には誰が従事したのか?が今回の最大の争点になるはずです。

それは、システムでは防げないものなのか?

いいえ、それは、十分防げたはずです。

途中に手動の工程が入ったとしても、その前工程で、後工程で検証するのに必要な情報を記録しておき、これを、後工程でキチンと検証すればいいのです。

例えば、業務システムが生トランザクションを作ったとすれば、その生トランザクションに記載された送付先アドレス、送金額、RedeemScript、生トランザクションのハッシュ値などを書面にして、電子証明書と共に、署名を施した上で、その署名値をその書面のQRに記載して伝票とし、原本の生トランザクションに添付する。

つぎに、後継のシステム(この場合はコールドウォレットシステム)は、原本の生トランザクションのハッシュ値を取り、その中に記載されている、送付先アドレス、送金額、RedeemScriptを確認し、それらが全て一致していることを条件に初めて、コールドウォレットでの署名が可能なように、コールドウォレットが作られていれば、手動工程を挟んでも、一貫した検証環境の下で署名システムを稼働させることはできたはずです。

ところが、今回は、そのような丁寧な確認措置が不十分だったのではないか?と考えられます。

他に攻撃可能なポイントはないのか?

ここまでの書きぶりをみると、内部犯で確定のように読めるかもしれないが、それだけとは断定できない部分がまだ残っていると思います。

それは、犯行に利用されたと目される スプリッタウォレットの存在です。

①スプリッタウォレットの手際の良さ
②アドレスポイズニング攻撃と目されるウォレット

この2点において、
①は、一般に使われる通常のウォレットでは難しい振舞いを手早く処理していることから、これが専用に準備/開発されたものである可能性が高い事。

②アドレスポイズニング攻撃に利用される先頭と末尾が似ているウォレットを故意に作り出すには、一種のマイニングのような計算をしなければならないため、1人でこれを作ろうとすると相応の時間を必要とする事。

これらの事から、入念に準備された計画的犯行であることが窺えるのです。

もしかしたら、スプリッタウォレットは、本来の業務用ウォレットのものが使われた可能性も拭いきれない。となると、DMM内の業務フローだけの問題ではないようにも思えてきます。

もしかしたら、アドレスポイズニング攻撃に利用したアドレスの導出は、ダークウェブを通じてアンダーグラウンドで協力者を募ったのかもしれない。となると、容疑者が複数いる可能性もあります。

いずれにせよ、内部業務のはずの「生トランザクションの改ざん」というトリガーが引かれないと、この犯行は成立しないので、内部に加えて外部にも結託者がいる可能性も否めないという事になります。

最後にあれっ?と思ったところ

業務ウォレットを設計する時、

コールドウォレット ⇒ ホットウォレット(マルチシグ兼スプリッタ) という流れの方が自然で一般的な設計なような気がするのだけど、

コールドウォレット ⇒ ホットウォレット(マルチシグ) ⇒ ホットウォレット(スプリッタ)という風に余計な中継点を入れているのはなぜだろう?

こうすると、安全に運用するためには、少なくとも 6人くらい必要になると思うんですが。。。
なんらかの社内の事情なんですかね?

体制は、少なすぎても要件を満たさなくなるから駄目ですけど、大きくなっても、それだけリスクファクタ―も増えるので、適正に構成を見直した方がいいんじゃないかな?と思いました。

関連記事