2018年3月8日、コインチェックがNEMの流出の原因について、調査結果を発表しました。
発表では、従業員の端末がマルウェアに感染したとのこと。これにより、遠隔操作ツールを使い、NEMのサーバー上で通信を傍受されたそうです。犯人はNEMの秘密鍵を窃取し、これを用いて外部の通信先に不正送金したという話でした。
この発表について、Japan Digital DesignのCTOである楠正憲氏は、犯人の行動やコインチェック社の対策内容について不可解な点を挙げています。
またこれらの疑問から、マルウェア感染による秘密鍵搾取ではなく、APIによるアクセス偽装の可能性についてまとめています。
まずはじめに、本番システムへの不正侵入を防ぐために十分な対策が取られていたか、という点です。
コインチェックのシステムで利用されているAmazon Web Serviceは、管理者アカウントに多要素認証の設定を推奨しています。これを設定していれば、たとえ遠隔操作ツールに感染しても、端末利用者が操作を行わずシステムに侵入することは困難です。
また金融系のシステムは、従来、業務端末や基幹システムをインターネットから分離した環境に設置するのが一般的です。仮想通貨を扱う特性ゆえ分離できなかったとしても、外部の通信先などを最小限に絞り込むなどの対策をとるべきでしょう。
次に、NEMの秘密鍵を抜き取られないように十分な対策が取られていたか、という点です。
仮にNEMウォレット・サーバーにAWSのEC2インスタンスを利用していたのであれば、耐タンパー性のあるHSM(Hardware Security Module)上で保管することもできます。やむなくサーバー上に置く場合は、ディスク上の鍵は別の鍵で暗号化するか、秘密分散方式を採用することもできるでしょう。
いずれにしろ、秘密鍵を簡単には抜けないような対策は講じるべきです。
一方で、犯人の行動についても疑問を呈しています。
犯人が秘密鍵を抜き取っていたのであれば、ウォレット上の仮想通貨を一気に全額引き出すことが技術的に可能です。しかし、実際には数回に分けて出金が行われました。
決済に係る情報システムは、一般的に、異常な出金パターンに対してはリクエストを遮断するよう、リスク検知エンジンを実装しています。犯人は、まず少額の出金指示を行なって侵入成功を確認した後、リスク検知エンジンが金額やAPIリクエスト頻度を監視していないか確認するために、数回にわけて出金を行ったのではないでしょうか。
ウォレット・サーバーへAPIを通じて出金指示を出すのは、利用者からのリクエストを直接受け付ける事になります。また、APIを利用する場合にはノード数が非常に多く、プログラムが複雑です。そのため、通信傍受によって秘密鍵を抜き取られるよりは防御が難しく、攻撃者にとっての難易度は低いと推測されます。
犯人は、乗っ取ったノードでの通信傍受やコードの解析によって、APIリクエストを偽装する方法を見つけ、犯人は不正な出金指示の作成ができたのではないでしょうか。
このことから、犯人は秘密鍵を抜いたのではなく、APIによるアクセスの偽装によるものではないか、と楠氏は仮説立てています。
このように、APIによるアクセスの偽装によって不正出金が行われたのであれば、コインチェック社は再発防止策として次の点に留意すべきだ、と楠氏は話します。
- 1. システム内部のAPIの認証認可方式を見直し、通信傍受によるAPIキーの推定や、不正なAPIアクセスから保護する
- 2. リスク検知エンジンを挟み、異常な出金パターンのAPIリクエストを遮断する
- 3. リスクの高い金額の出金指示の処理については、人間によるチェックを介在させる
業界全体のセキュリティー水準を底上げするためにも、コインチェック社には、外部から検証できる程度の事件の詳細と再発防止策を明らかにされることが望まれます。