仮想通貨取引所に代表される、ブロックチェーン関連ビジネスが盛り上がりを見せている一方で、セキュリティに問題があり、被害を受けるケースも増えています。ブロックチェーンのセキュリティでは「秘密鍵[1]をいかに守るか」が重要なため、複数の署名を分散管理する「マルチシグ」や秘密鍵をオフラインで管理する「コールドウォレット」を採用すべきと言われますが、単に採用すれば安心という論調は間違いです。また、ブロックチェーンのセキュリティはこれらがすべてではありません。
ブロックチェーンを活用したシステムを開発する場合は、攻撃者視点に立ち、多層防御を取り入れたうえで、アーキテクチャや運用設計のリスクベースによる評価が必要です。
マルチシグを採用する際の注意点
まずは、仮想通貨で送金する流れを説明します。仮想通貨の所有権は「秘密鍵」の所有で証明されます。自身の仮想通貨を送金する場合は、秘密鍵で送金トランザクションに署名を付与することで可能になります。ウォレットとは秘密鍵を格納する箱のようなもので、オンライン環境にあるものを「ホットウォレット」、オフライン環境にあるものを「コールドウォレット」と呼びます。
例えば、ボブからアリスにビットコインを送金する場合のイメージは図1のとおりです。
図1 送金時のウォレットの利用イメージ
- ①分散台帳上で、ボブに所有権があるビットコインに錠がかけられている。所有権をアリスへ移す場合は、ボブの秘密鍵で解除する
- ②所有権を移動する際に、アリスの秘密鍵のみが解除できる錠をかける
マルチシグとは上記のように所有権の移動に複数の秘密鍵を必要とする方式で、一般的にセキュリティレベルが高いです。マルチシグでは、N個の秘密鍵のうち、M個の秘密鍵が必要な場合は「M-of-N」と表現され、1つの秘密鍵が盗まれても「M-of-N」のM個の秘密鍵が盗まれなければ安全です。
しかし、同一サーバ上にM個の秘密鍵が保管されていると、サーバが乗っ取られるとすべての秘密鍵が盗まれてしまいます。また、分散して保管させているのが同一ネットワークセグメント上のサーバである場合、1つのサーバが乗っ取られてしまえば、そこを起点に他のサーバも攻撃され、結局はM個の秘密鍵が窃取されてしまう可能性も高くなります。サーバは攻撃される危険性があるという前提に立ち、秘密鍵はネットワークセグメントレベルで分散しておくなどの対策が望ましいです。
さらに内部犯行にも留意しなければなりません。適切に分散しても、担当者がM個の秘密鍵すべてにアクセス可能では問題です。そのため運用設計も重要になります。ブロックチェーンは一定の匿名性が保たれていることから、内部犯行であっても足のつく可能性はそれほど高くなく、内部犯行の敷居も低いと考えたほうがよいのです。
コールドウォレット採用時の注意点
コールドウォレットには秘密鍵を紙に印刷した「ペーパーウォレット」や、秘密鍵を専用のハードウェアに格納する「ハードウェアウォレット」と呼ばれるものがあります。
コールドウォレットを利用する場合は外部犯行の難易度は高くなりますが、内部の犯行はそれほど難しくありません。なぜなら、コールドウォレットにアクセスできる担当者は不正送金が可能だからです。そのため、コールドウォレットを採用する場合においても、マルチシグを組み合わせて分散して保管したり、運用レベルで不正送金対策を行うなどの対策が望まれます。
また、鍵管理で気にすべきことは他にもあります。例えば、ウォレットには「決定性ウォレット」と呼ばれる、1つのシードから複数の秘密鍵を生成できる方式があります。ハードウェアウォレットの場合は一般的に紛失時や故障時に備えて当該シードのインプットとなる「ニモニックコード」と呼ばれるバックアップを控えておくことで秘密鍵が復元可能となります。そのため、ニモニックコードに関してもコールドウォレットと同様のセキュリティが求められるのです。
なお、ハードウェアウォレットは、秘密鍵が専用のハードウェアに格納されているため安全という論調が世間ではありますが、ハードウェアウォレットを接続するPC端末がオンライン環境にある場合は注意が必要です。例えば、図2は、ハードウェアウォレットであるTrezorのPC上での送金用の操作画面ですが、コピーした送金先アドレスを画面にペーストする際に、マルウェアによってクリップボード内のアドレスを攻撃者のアドレスに書き換えられれば、秘密鍵は盗まれずとも不正送金されるリスクはあるためです。
図2 送金用の操作画面
実際にそのようなマルウェアは観測されています。また、ハードウェアウォレットが生成して、画面に表示されるアドレスを攻撃者のアドレスに変更するようなマルウェアの場合も不正送金に繋がります。例えば、仮想通貨取引所に保管している仮想通貨を、自身のTrezor上のアドレス(図3)をコピーして、取引所のサイトにペーストして送金した場合、攻撃者に送金してしまうことになります。
図3 自身のTrezor上のアドレス
重要なのは鍵管理だけではない
世間では、「いかにして鍵を守るか?」という点にフォーカスされることが多いです。たしかにブロックチェーンにおいて、もっとも気にすべきは鍵管理であると筆者も考えます。しかし、鍵管理の観点で堅牢だから大丈夫というのは間違いです。
ホットウォレットの場合は、提供するサービスを実現するためのWebアプリケーション、サーバ、ネットワークなどを含め、全体を俯瞰したうえで堅牢性を担保しなければなりません。秘密鍵が盗まれずとも、ここまで説明したとおり不正送金などに繋がる可能性はあるためです。
ブロックチェーンにはプラットフォームごとに公式クライアントソフトがあります。ビットコインでは「Bitcoin Core」と呼ばれる公式クライアントソフトがあります。これらは一般的に、サーバ上で可動し、コマンドを叩くことで利用しますが、JSON-RPCと呼ばれるHTTPベースのサービスが提供されているものもあり、HTTPで命令を送ることも可能です。しかし、JSON-RPCは一般的に、外部に公開する用途ではなく、ローカルホストや想定されたIPからのアクセスのみに制限すべきなのです。それにも関わらず、JSON-RPCをユーザ向けWebサービスから直接呼び出すアーキテクチャであったり、意図せず公開している場合は、JSON-RPC 経由の命令で不正送金を許してしまう可能性があります。
すでに、ブロックチェーンのJSON-RPCポートを探索する動きは見られていて、公開した場合は攻撃されると思ったほうがよいでしょう。ほかにも、サーバに侵入して、すべての送金先を攻撃者のアドレスに変更するように公式クライアントを改ざんすれば、秘密鍵を窃取できなくても不正送金は成立してしまいます。
「マルチシグを採用している」「コールドウォレットを採用している」といった単一の側面だけ見て、セキュリティを評価するのは極めて危険なのです。鍵管理周りはプラクティスも整備されてきていて、そのプラクティスに乗るべきだと考えますが、それが意図する背景や本質を理解しなければセキュリティレベルは上がりません。また、提供するサービスのシステムやビジネス要件に応じてアーキテクチャや運用は変わりますが、全体を俯瞰したうえで、攻撃者視点に立ち、リスクベースで評価する必要がある点を強調しておきます。鍵管理に加え、従来のアプリケーション同様にリスク分析やセキュリティ対策は必要なのです。