愚かなハッカーたれ、利口なエンジニアよりも

自我と距離をおきたいプログラマの日記

なぜ取引所に預けたままは危険で、不正送金などで預けたお金がなくなるのか

2018年1月26日に起きたコインチェックからのXEM不正送金問題。以前から取引所に仮装通貨を預けたままにしておくのは危険だと言われていますが、取引所から通貨がなくなるケースとしてどのようなものがあるか、自分なりに考えてみました。今回、コインチェックはXEMで被害にあったので、NEM/XEMを例に書いてみますが、他の通貨でもほぼ当てはまると思います。

基本知識

  • NEMアカウントを作ると秘密鍵が発行される
  • 秘密鍵を知っている者は、そのNEMアカウントからXEMを出金できる

マルチシグ対応しているNEMアカウントの場合、そのアカウントの秘密鍵を知るだけでは出金できませんが、今回はマルチシグ対応なしで考えます。(コインチェックも対応していなかったようなので)

取引所の仮想通貨の管理方法

  • 取引所も一般ユーザーと同じくNEMのアカウントを取得し、それをXEM入出金の窓口アカウントとして使います。
  • 窓口アカウントは取引所によっては1つかもしれないし、複数かもしれません
  • ユーザーの数だけ窓口アカウントを用意するわけではありません。
  • 1つの窓口アカウントで複数のユーザーの入出金を受け付けます
  • 例えるなら1つの銀行口座に複数のユーザーのお金がまぜこぜに入っている状態です
  • 取引所はNEMとは別に自前で、各ユーザーのXEMの残高管理をします。これを仮に取引所システムと呼びます
  • 取引所システムは窓口NEMアカウントの入出金をリアルタイムで監視し、各ユーザーのXEM残高を正確に記録することを試みます
  • ユーザーが取引所にログインして見られる自分のXEM残高は、取引所システムのデータベースに記録されている数字です
  • つまり実質的にNEMとは切り離された数字で、NEMのノードやブロックとは関係がありません
  • また取引所に登録したユーザー情報も取引所システムで管理されているもので、NEMとは切り離されています

次にユーザーおよび取引所のお金がなくなる可能性について述べます

NEMの窓口アカウントの秘密鍵が盗まれる

窓口アカウントの秘密鍵が第三者に知られてしまうと不正に出金できてしまいます。この場合、取引所システムにユーザーのXEM残高は記録されたままです。しかし、取引所は肝心のXEMを失っているので、引き出そうとしたユーザーに渡すXEMがありません。つまり取引所は入出金を停止せざるを得ません。

取引所が窓口アカウントとは別の非公開NEMアカウントを持ち、定期的に窓口アカウントから非公開アカウントへXEMを送金し、かつ秘密鍵を厳重管理していればXEMは残るでしょう。

今回、コインチェックは保有していたXEMのほぼ全額を出金されてしまったようです。おそらく窓口アカウントのみで運用しており、それらの秘密鍵が第三者に知られ、ほぼ全額出金されてしまったと思われます。

取引所システムのユーザーのパスワードが盗まれる

ユーザーの落ち度により取引所にログインするパスワードが第三者に盗まれた場合、不正出金されてしまいます。この場合、第三者はそのユーザーの残高分のXEMしか引き出せません。被害は取引所単位で見れば軽微でしょう。(ユーザーにとっては甚大ですが)

取引所システムがクラッキング(ハッキング)に合い、複数のユーザーのパスワードが第三者に知られた場合、それらのユーザーの残高合計分のXEMまで引き出せてしまいます。もし全ユーザーのパスワードが漏洩した場合、全ユーザーの残高合計分のXEMまで引き出せてしまいます。

しかし、ユーザー単位での出金を繰り返さないといけないので、すべて引き出すには相当な時間がかかると思われます。その間にユーザーおよび取引所が不正出金に気づくでしょう。今回のコインチェックのようにほぼ全額出金されるような自体にはならないと考えられます。

秘密鍵が盗まれるケース

秘密鍵を盗むことができるのは、高度なクラッキング能力をもったクラッカー(ハッカー)だけとは限りません。プログラムを一行も書いたことがない人でも秘密鍵を知ることはできます。

  • 取引所の元社員、もしくは現役社員で、社内ネットワークにアクセスでき秘密鍵を知るチャンスがあった
  • 取引所を設立する際に、設立者がその段階ではセキュリティに気を使っておらず、知人など第三者に知られてしまっていた(そして立派に育った時点でその鍵を使って出金した)

これらのケースは、NEMアカウントをマルチシグ対応し、署名人を定期的に増やす・変えるなどすれば、不正出金を防げる可能性があります。マルチシグ対応している場合、出金したいNEMアカウントの秘密鍵だけでなく、署名人となったNEMアカウントの秘密鍵も必要になるからです。

インチェックの場合、マルチシグ対応していなかったことから、出金したいNEMアカウントの鍵さえ知っていれば、いつでも送金できたわけで、誰かが何かのタイミングで秘密鍵を知ったのでしょう。これは高度なクラッカーの手口とは限りません。

取引所を利用するユーザーからすると、取引所が秘密鍵をどのように管理しているかはわかりません。それがユーザーが取引所を利用する際に背負うリスクです。取引所から自分のアカウントに送金した通貨に関しては、そのリスクから解放されます。しかし、今度は自分でそのリスクを背負うことになります。

原則、秘密鍵を盗まれたら終わりなので、貯金用アカウントの秘密鍵は生成してすぐに絶対に誰にも見られること無く書き写して、銀行の貸金庫に入れるなどするのが無難でしょう。入金用のアドレスだけあれば、貸金庫の中でコールドウォレットと化したアカウントへ送金できます。

取引所システムのセキュリティホール

クラッカーが秘密鍵を知らなくても出金できるケースもあると思います。例えば取引所システムでAPIのようなものを用意し、それをキックすると出金できるようにしている場合。もちろん、これは社内向けのものですが、クラッカーがサーバーに侵入しキックできてしまえば出金できてしまいます。これはクラッカーとしてのスキルが必要になりますが、キックする権限があった元社員の犯行もありえるでしょう。

 

(間違いがありましたら、twitterでご指摘ください)