解説:仮想通貨のハッキング、4つの手口

最近発生した仮想通貨のハッキング事件4件、その背後にどんな要因があったのでしょうか。

暗号資産(仮想通貨)の流通が始まって、すでに10年以上が経ちました。この間、仮想通貨取引所や仮想通貨関連サービスを狙った大規模なハッキング事例を、私たちは100件以上目撃してきました。

このようなハッキングの詳細が明らかにされないことは珍しくありません。いつ、誰がハッキングされたか、被害額はどのくらいだったかくらいは簡単に分かりますが、「どのように」はあいまいなままです。ジャーナリストは被害額の方に興味がありますし、被害にあった組織は不名誉な事件の詳細をなかなか公表しようとはしません。

そこで、情報の隙間を埋めるために、このようなハッキングの仕組みについて少しお話ししましょう。お説教ではなく、似たような事件の再発防止を願いつつ。

フィッシングとマルウェア:仮想通貨取引所ハッキングの標準的な手口

仮想通貨取引所は、利用者の仮想通貨と通常のお金を、従来の銀行口座に保管しています。サイバー犯罪者からすると、通常のお金を狙うのは危険です。盗んだお金を持って逃げるには、口座が凍結される前に現金を引き出す必要がありますから。そのため、彼らは一般的に仮想通貨を狙います。

典型的な仮想通貨取引所のハッキングの場合、外から見て分かるのは(1)ハッキングが起きた、(2)顧客のお金が消えた、という事実しかありません。実際のところ、何が起きたのか?おそらく次のような流れでしょう。

攻撃者はまず、従業員のリストを入手し、従業員たちが何に興味を持っているかを調べ(SNSの投稿もチェックしたでしょう)、だまされやすそうな従業員宛てに悪意あるペイロードを添付したフィッシングメールを送信して、取引ネットワーク内への侵入を果たしました。

彼らは次に、その企業の社内状況を調査しました。経理担当者はどのくらいの頻度で幹部とコミュニケーションを取っているか、どのような情報をやりとりしているか、社内ネットワークの構造はどうなっているか、暗号ウォレットの保管場所はどこで、どのような保護手段が講じられているか。調査フェーズには時間がかかるかもしれませんが、サイバー犯罪者たちは最終的に、重要システムへのアクセス権を持つ従業員のPCへたどり着きます。

取引所の自動システムが仮想通貨を送金するように設定されている場合、オペレーターの権限を入手すれば、攻撃者は自分自身に仮想通貨を送金可能となります。今年発生したBinanceに対する攻撃は、このような筋書きで進行したと考えられます。

標的型攻撃:どうすれば防げたか

仮想通貨取引業務に携わる人がするべきことは、攻撃にかかるコストが、見込み収益×成功確率の額を上回らないようにすることです。したがって、次の対策が求められます。

  • 従業員に対し、サイバーセキュリティに関するリテラシー(たとえば、doc形式の履歴書を不用意に開かないなど)を高めるための教育を実施する。
  • セキュリティソリューションを使用して、標的型攻撃に備える。ノードを個別に脅威から保護するだけではなく、組織全体での異常を検知できるソリューションが望ましいところです。
  • 侵入テストを委託する(セキュリティの専門家がシステム内への侵入を試し、システム内部を見て回り、どこに弱点があるかを報告するテスト)。

二重支払い:Bitcoin ATMから奪う手口

ATMもまた、Bitcoin窃取の経路です。一般的にATM は自分の銀行口座からお金を引き出す(または預金する)ためのものですが、Bitcoin ATMの場合は仮想通貨を売買することもできます。

さて、ATMを使ったBitcoin詐欺の手口とは、ATMを使ってBitcoinを売り、代金を現金で受け取ったらトランザクションをキャンセルするという、実にあからさまな手口です。さすがにうまくいかないだろうという気がしますが、カナダに設置された45台の仮想通貨対応ATMから短時間のうちに20万ドルを奪い去った窃盗団がいました。

なぜ、そのようなことが可能だったのか?ブロックチェーンの情報は、その名が示すとおりブロックに格納されます。しかし、「1 BTCをジョンに送金」のようなトランザクションは、すぐにブロックへ書き込まれるのではなく、まずは待ち行列に入ります。新しいブロックは、およそ10分に1つ作成されるのです。確定されていないトランザクションは、ブロック作成者によって待ち行列から削除されます。ここで注意したいのは、ブロックにはすべてのトランザクションを格納するのに十分な容量がなく、少しでも手数料(ブロック作成者の取り分)の高いトランザクションが優先される点です。

信じがたいことですが、これらATMのロジックを開発した人たちは、トランザクションがブロックチェーンに書き込まれるまで現金の支払いを待て、という指示をしていませんでした。利用者の利便性がセキュリティに勝ったのです。

もう1つ、細かい話ですが、Bitcoinは当初、待ち行列に入れられたトランザクションのキャンセルを許可していませんでした。そのため、手数料の少ないトランザクションが、削除されるまでシステム内に数日間残っていることがよくありました。この問題を解決するために追加されたのがRBF(Replace By Fee)のメカニズムで、待ち行列に入っているトランザクションを別のトランザクションで置き換えられるようになりました(リンク先は英語)。本来の目的は手数料を引き上げて送金を進めることでしたが、このメカニズムによって受取人の変更も可能になり、Bitcoinを送信者に戻すことができるようになったのです。

これは脆弱性と言うより、ただただ無謀な対応でした。その結果がこちらです。

二重支払いのハッキング:どうすれば防げたか

この盗難事件の後、ATMの運営会社はATMを変更し、待ち時間を導入しました。現在では、Bitcoinが送金された後にATMへ戻ってきて現金を受け取らなければなりません。あまり利用者に優しい仕様ではありませんが、ブロックチェーンの仕組みを考えるとこうするしかありません。

今になって考えれば、このような形での損失を防ぐため、開発者たちはアプリケーションのセキュリティレビューを実施するべきでした。要は、サービスのアーキテクチャの検査、コードのチェック、脆弱性の有無の確認などを外部の専門家に委託するべきだったのです。

51%攻撃:ブロックチェーンを使いこなした手口

「ブロックチェーンのデータは変更できない」 ― この不変の原理を、どこかで耳にしたことがあるのではないでしょうか。しかし、場合によっては、これが当てはまらないこともあります。ブロックチェーンとマイニング(採掘)の仕組みについては、過去記事の『ブロックチェーン入門』と『Bitcoinのマイニング』で詳しく解説しているので、ご覧ください。

すべての利用者が参照するブロックチェーンの同一性を保証しているのは、2つの原則です。1つめは、次のブロックの作成者が誰になるかを全員で合意する必要があること。マイニングの報酬を得る確率は、投資したリソースに左右されます。マイニングのパワーが強力であるほど、確率が高まります。

2つめは、「一番長いチェーンが正のチェーンである」という法則です。チェーンが分岐したとき、最も長いチェーンが有効なチェーンと見なされます。誰かが自分で作ったバージョンのブロックチェーンをブロードキャストしても、作成者以外の利用者は全員、拒否するでしょう。このようなブロックチェーンに費やされたリソースは少なく、チェーンが短いためです。

しかし、ある1人が全体の50%を超えるマイニングパワーを使ったとしたら、状況は一変します。たとえば、他のマイナー(採掘者)全員で9ブロックを作っている間に、この人は10ブロック作ってしまうかもしれません。こうやって作られたブロックチェーンが一番長いチェーンになり、他の皆がこれを受け入れたなら、履歴が置き換えられてしまいます。古いバージョンのパブリックブロックチェーンでBitcoinを使った人は、新しいブロックチェーンの中では自分の消費したBitcoinが自分のアカウントに戻っているのに気付くでしょう。

2019年初めに仮想通貨取引所のGate.ioで起きた事件が、まさにこれでした。攻撃者は仮想通貨を取引所に送り(さらに、この事実をパブリックブロックチェーンに書き込み)、その一方で、独自のブロックチェーン作成に着手しました。取引所が送金を受け取り、攻撃者の口座にその額を入金すると、攻撃者は自分のプライベートブロックチェーン(これには前述のトランザクションが含まれなかったため、仮想通貨の二重取りが可能となった)をブロードキャストし、取引所に残高の払い戻しを請求しました。こうして取引所はお金を失ったのです。

では、こうしたことが日常的に起きないのはなぜか、攻撃者が費やした演算能力はどれほどだったかを見てみましょう。

Bitcoinを例に考えます。マイナーたちは1時間あたり6ブロック作成します。1ブロックあたりの報酬は12.5 BTCです(2019年10月6日現在、75 BTCは60万ドルに相当します)。これは、1時間分のBitcoinマイニングパワーを借りるためのコストとほぼ同じです。Crypto51(英語サイト)では、次のように計算されています。

主要仮想通貨における51%攻撃の1時間あたりの推定費用

右端の列は、今現在レンタルできる容量を表しています。Gate.io を攻撃した人たちがしたようにEthereum Classicブロックチェーンの所有権を得るには、この表にあるとおり1時間あたり約1万ドルかかります。例の攻撃者たちが20万ドル稼ぐためにかけた時間は4時間でした。

51%攻撃が成功したのは、この件が初めてではありません。ほかの仮想通貨でも、51%攻撃は成功しています。

51%攻撃:どうすれば防げたか

一般に、51%攻撃でブロックチェーンを書き直して利益を得る能力は、そもそもブロックチェーンテクノロジーに備わっています。攻撃にかかるコストをできるだけ高くするために、仮想通貨取引所では、トランザクション後の残高更新をぎりぎりまで待とうとします。これは、トランザクションがブロックチェーンに入力された後で作成されるブロックの数が多いほど、このブロックチェーンが再編成されてロールバックされる可能性が低くなるという理由からです。しかし、このために送金完了まで何時間もかかるようになり、利便性が大きく損なわれます。

何にせよ、このような攻撃が再び起こるのは間違いないでしょう。

秘密鍵の盗難:パスフレーズのスペルチェック

仮想通貨の管理には、秘密鍵が必要です。この鍵は、暗号ウォレットに保存されます。一方、利用者の残高はブロックチェーンに格納されます。

暗号ウォレットを切り替える場合、切り替え前のウォレットから切り替え後のウォレットに鍵をコピーしなければなりません。便宜上、この鍵には12個のシンプルな単語で構成されたシードフレーズが使われます(たとえば「witch collapse practice feed shame open despair creek road again ice least」)。

あるとき暗号ウォレットの開発元が誤って、このフレーズをスペルチェックのためにオンラインへ送ってしまいました。ある仮想通貨投資家がこのミスを発見したときには、すでに7万ドルが盗まれていました。これが盗難の原因かどうかは分かりませんが、いずれにしろ示唆に富んだ話ではあります。

このような事件が起きたのも、近ごろはアプリケーションを1から記述せず、コンポーネントを寄せ集めて作ることが当たり前になっているからです。このようなコンポーネントには、サードパーティの開発元が作ったものも含まれます。暗号ウォレットCoinomiの開発元もこの方法で開発を進め、パスフレーズの入力フォームの表示にjxBrowserを採用しました。しかし、開発元は気付いていませんでしたが、このコンポーネントはフォームに入力されたテキストをすべてスペルチェックするようにデフォルト設定されていました。世界中のあらゆる言語を網羅した辞書を搭載するわけにはいかないので、このコンポーネントはgoogleapis.comを利用してクラウドでのチェックを行います。

一般的な入力フォームの場合ならば便利な機能ですが、パスワードや非常に機密性の高いフレーズを入力するためのフィールドの場合、とんでもなくリスキーです。

開発元は、シードフレーズが送られた先はGoogleのみであって、それも暗号化された形での送信であった、さらにはエラーが返ってきたので処理されていない、と主張しています(英語)。それでもなお、この脆弱性が盗難の原因となったと被害者は信じています。

秘密鍵の盗難:どうすれば防げたか

ある意味、よくありがちな不注意が引き起こした問題であると見ることができます。このコンポーネントのスペルチェック機能については文書化されていますし、無効化する方法も説明されています。従来のテストでは特定されなかったかもしれませんが、アプリケーションのセキュリティレビューでなら間違いなく見つかったことでしょう。

一方で、根の深さを持った問題でもあります。サードパーティのライブラリを使用すると、問題を抱えることになる可能性があります。それは今すぐ影響が出る問題かもしれませんし、将来的(アップデートによってライブラリが脆弱になった場合)なものかもしれませんし、もしかするとサプライチェーン攻撃のリスクかもしれません。サプライチェーン攻撃の場合、サイバー犯罪者は対象とするソフトウェアの開発元自体をハッキングする必要はなく、開発元から業務を請負っている業者の1つに侵入するだけでよいのです。請負業者のセキュリティはそれほど厳格ではないことも多く、自分たちのコードがどの重大プロジェクトで使われるのか知らない場合もあります。

こうした責任を負うべき人々の無謀さにいらだたせられることもあれば、そうした人々が自分でどうすることもできない様子に同情を覚えたりもするものです。

ヒント