【徹底解説】あの時モナコインの身に何が起こったか?~Bloch Withholding Attack~

Pocket
LINEで送る

こんにちは、丸の内OLの玲奈(@reinabb3)です!(•̤̀ᵕ•̤́๑)

今日はモナコインのブロックチェーンに起きたBlock Withholding Attackという攻撃方法についてまとめていきます。

「Block Withholding AttackというSelfish Miningの一つの手法によって、意図的に引き起こされたreorgによる仮想通貨史上最初の二重送金」について誰でもわかるように解説していきます。

Livecoin事件の概要は?

2018年5月15日に米国Livecoin取引所から不正に1,000万円相当の仮想通貨が不正引き出されました。

Livecoin事件の概要
  • 被害者:米国取引所 Livecoin
  • 犯人:不明
  • 被害額:23,832MONA(約1,000万円相当)
  • 犯行時間:2018年5月13日〜2018年5月15日

5月13日〜5月15日位まで頻繁にreorg(Reorganization)と呼ばれるブロックチェーンの巻き戻しが最高20block単位で発生していたそうです。

発覚の経緯はBitcoin.comの掲示板にLivecoin取引所によって2018年5月15日に書き込まれた以下の書き込みです(。✖д✖。)

ざっくり翻訳するとこんな感じ。

Livecoin取引所です。早急に話をしなければいけない問題があるのでモナコインの開発者を探しています。我々の間違いだと良いのですが、どうも数時間ほど前にモナコインのブロックチェーンが破られたようです。

Livecoin事件の流れ

今回の犯行の手口を整理して見ました٩(๑´0`๑)۶

Livecoin事件の流れ
  1. 犯人はLivecoin取引所宛に23,832MONA(約1,000万円相当)を送金してブロックAに記録(取引ア)
  2. 犯人は自分のウォレット宛に23,832MONA(約1,000万円相当)を送金してブロックA’に記録(取引イ)
  3. Livecoin取引所は3〜5confirmation後に取引アを残高として受け入れ
  4. 犯人は残高確認の反映を確認し即座に売却し、自分のウォレットへ引き出し
  5. 犯人はBloch Withholding Attackによってチェーンの巻き戻しを実行
  6. 取引アの取引記録が格納されたブロックAはチェーンごと無効になる。
  7. 巻き戻しにより取引イを格納したブロックA’が先に承認されているので取引アは残高不足
  8. Livecoin取引所には一円も送金されない。

Livecoinへの送金データはなぜ消えたの?

「ハッカーからLivecoin取引所へ23,832MONAを送金」という取引イの取引記録はなぜ消えてしまったのでしょうか。

まず、前提をおさらいしましょう!(。-ω-)ノ

ブロックチェーンが分岐した時にどのように正しいチェーンを決めるか知る必要があります。

チェーンの巻き戻し(reorg/Re-organization)って?

仮想通貨のブロックはマイナーが同時にブロックを採掘した場合、一時的にチェーンが分岐することになります。

その際には長いチェーンを正当なブロックチェーンとみなすというルールが決められています。

後に続くマイナーは長いチェーンに続くブロックをマイニングしない限りマイニング報酬を受け取ることができないので、自然と短いチェーンのブロックは死んでいきます。

どのチェーンとも繋がっていないブロックは孤立ブロック(オーファンブロック)と呼ばれます

孤立ブロックはやがて破棄されます。

孤立ブロックに含まれていた取引記録は、別のブロックの中で処理されるよう、再度マイニングの対象となります。

Bloch Withholding Attackってなに?

チェーンの巻き戻し(reorg)を可能にした、

Bloch Withholding Attackとはどのような攻撃なのでしょうか? (。ŏ_ŏ。)

Bloch Withholding Attackは直訳すると、ブロックを保留する攻撃です。

本来マイナーは、ブロックを承認するための鍵を誰よりも、早く見つけて報酬としてビットコインやモナコインなどの通貨を受け取る権利があります。
それにも関わらず、見つけたことをあえてブロードキャスト(ネットワークに公開)せずに保留した上で、一挙にブロードキャストすることで意図的にチェーンの巻き戻し(reorg)を発生させ他のマイナーの取り分を自分のものにしようとする攻撃のことです。

この攻撃手法にそって、簡単に犯行手口をおさらいしますと…∇

  • 本物のブロックチェーンとは別に、こっそりと偽物ブロックチェーンを自分で作る
  • 自分で作った偽物チェーンは本物のチェーンよりも長くブロックを繋げる
  • 自分で作った偽チェーンが全体にばれないように宛先も変えかつ、他に公開(ブロードキャスト)もしない
  • 偽物チェーンが公開された時点で、偽物チェーンが有効になり、本物チェーンをチェーンが無効になる
  • 無効になったことで取引所はモナコインを受け取ることができないが犯人はモナコイン残高をゲット

なぜこの手法が可能なのでしょうか?

実は長いチェーンを正当なブロックチェーンとみなすというルールを悪用して、秘密裏に長いチェーンを作っておいて一度にブロードキャストすることで、全てのマイニング報酬を自分のものにする自分勝手なマイニング(Selfish Mining)をする事が出来るからです..(´⌒`。)

あたかも同じトランザクションデータを、本物チェーンと偽物チェーンで繰り返し流しているので、巻き戻し(reorg)されているように見えていますが、実際には犯人は秘密裏にはブロックを生成し、偽物チェーンを作っておき、きたるべきタイミングで公開(ブロードキャスト)としたと想定されます Σ(・ω・;|||

ブロードキャストして初めて通貨をもらえる権利があるのに、それをしないことは電気代の無駄になってしまいメリットが無いので、過去からこのような攻撃があることは可能性としては指摘されていましが、これまで行われたことはありませんでしたが、今回初めてモナコインに対して行われました。

Bloch Withholding Attackはモナコインだけでなく、ビットコインやモネロなどProof of Workの承認アルゴリズムを採用しているコインには同様に起こり得る問題です。

Bloch Withholding Attackが起きるとどうなる?

ブロックA’をマイニングした犯人がそれをブロードキャストせずにブロックC’までマイニングをしたとします。

一方で、ブロックA’がブロードキャストされていないので他のマイナーがブロックAとブロックBを採掘したとします。

ブロックBがブロードキャストされたタイミングで「ブロックA’、ブロックB’、ブロックC’」をまとめてブロードキャストした場合にチェーンは「ブロック→ブロックA→ブロックB」と続くチェーン①と「ブロック→ブロックA’→ブロックB’→ブロックC’」と続くチェーン②とに分岐していることになります。

ブロックチェーンではこのような時に長いチェーンを優先するのでチェーン②の犯人が承認したチェーンが正しいチェーンということになります。

今回犯人は「Livecoin取引所宛に23,832MONA(約1,000万円相当)を送金してブロックAに記録(取引ア)」をチェーン①のブロックAに記録し、「自分のウォレット宛に23,832MONA(約1,000万円相当)を送金してブロックA’に記録(取引イ)」をチェーン②に記録した上で、取引アの記録を取引所が確認し残高反映したことを確認します。

そしてモナコインを売却し、別な通貨に変換した上で自分のウォレットに引き出したのです  (。・Д・)ゞ

チェーン①はどうなるの?

つまりLivecoin取引所宛の23,832MONAの送金記録は孤立ブロック(オーファンブロック)に格納されてしました。

しかし、孤立ブロックはやがて破棄されますが、孤立ブロックに含まれていた取引記録は、別のブロックの中で処理されるよう、再度マイニングの対象となるはずです。

よって待っているとLivecoin取引所に23,832MONAが届くように思います  (´・ω・`)

しかし、実際は届きません。

自分のウォレットへの送金をしたトランザクションが格納されたチェーン②が先に行われているため、犯人のアドレスにはモナコインの残高が存在せず送金は行われません。

(チェーン②の処理で先に犯人のUTXOが使われているのでエラーになる。)

またチェーン①に置ける「ブロックA→ブロックB」をマイニングしたマイナーの報酬も0になってしまい結果的に犯人が全てマイニング報酬を得ることに成功しています。

このようにBloch Withholding Attackによりハッシュパワーをもつ強大なマイナーが他のマイナーの取り分を総取りすることで競争から無理やり引きづり下ろすことができます。

自分勝手なマイニングをSelfish Miningと呼びBloch Withholding Attackはその一つのやり方ということが理解できたでしょうか。

取引所は顧客の資産を一つのウォレットに管理し、顧客の残高はだだの数値としてブロックチェーンに記録しない形で管理しているので取引所宛の取引記録がブロックAに格納されたとき(取引ア)犯人に残高情報を付与してしまったのです。

もし相手が取引所でなく、個人だった場合犯人になんの残高も付与されないのでこのようなことは起こりえません。

ビットコインやモナコインのマイニングで使われるProof of Workって

Bloch Withholding Attackを理解するため次にProof of Workによってどのようにブロックが作成されマイナーが報酬を得ているのか理解しましょう。

ブロックチェーンはブロックを次から次に繋げることで情報が改ざんできない仕組みになっていることはご存知だと思います。

そしてこの時ビットコインやモナコインに採用されている承認アルゴリズムである Proof of work(PoW)は最初に前のブロックと掘ろうとしているブロックを繋ぐnonce(ナンス)と呼ばれる鍵を最初に見つけた人が報酬をもらえることもご存知だと思います。

ブロックチェーンのブロックは以下の3つの要素で構成されています ∇

ブロックの構成要素
  1. 前のブロックのハッシュ値
  2. 取引記録(トランザクションデータ)
  3. nonce(ナンス)

nonceは「1.前のブロックのハッシュ値」と「2.取引記録」に32bitの数値を添加して先頭の数が0指定された数続く値のことです。

このnonceの正解は膨大なコンピューターパワーによる計算の結果初めて算出することができ、その結果を世界で初めて報告し(ブロードキャスト)し他のマイナーから正解と認められて初めて報酬が付与されます。

先頭の0の数が多いほど計算が難しくなるのでその調整をDifficulty調整といいます。

トランザクションが詰まっているときはDifficulty調整により、求めるnonceの0の数が多くなっているのです。

IBM Academy of Technology 「もやもやブロックチェーンが理解できる」 資料より

そしてそのブロックのハッシュ値はnonceと個別の取引記録及び前のブロックのハッシュ値から算出されるので、ブロック1の取引記録が改ざんされるとブロック2が持つブロック1ハッシュ値が変わってしまうので、ハッシュ値から作られたnonceも変わってしまいます。

よってブロック1以降の全てのnonceの計算をやり直すことになり、改ざんが不可能であると考えられてきました。

マイニングとはいち早くnonceを見つけることであり、取引を改ざんする場合はその後に続くブロックのnonceを全て計算する必要がありますが、今回のように先にブロックを複数マイニングした上でブロードキャストしないことで意図的に孤立ブロックを作り出し、取引所と自分への二重支払いを実現しました。

二重支払いへの対策方法

モナコインの産みの親であるワタナベ氏によると現状ではサービス提供側で入金の承認数を上げる以外に有効な手段はないとのことです(ૢ˃ꌂ˂⁎)

取引の承認をConfirmationといいます。

3ConfirmationならLivecoinへの送金というトランザションデータが格納されたブロックの次の次のブロックが承認された段階で取引所は正しい取引として認識します。

この3Confirmationという数値は取引所や通貨によってそれぞれ異なります。

今回の事件においてもLivecoin取引所がモナコインの承認数がもっと高ければよかったのです。

仮にBloch Withholding Attackによるチェーンの巻き戻しが送金から20ブロック目で行われた場合、承認数を25ブロックに引き上げておくことで、取引所は送金確認より先に巻き戻しを確認することができるので今回のようなことはおこりません(=ω=.)

日本の各取引所もモナコインの必要承認数を引き上げることで各社対応しています。

しかし、入金の承認に必要なブロック数を引き上げることでユーザーは着金までの時間がかかるので使いにくい取引所ということになってしまいます。

玲奈の思うこと

脇Pさんによると最高20ブロック単位でreorgが発生しているらしいので、今回の事件が再発した場合20ブロックくらいは巻き戻しの被害にあう可能性があります。

Monacoinのブロックが生成される時間は平均90秒ほどなので単純計算でもBitcoin(平均600秒)が6Confirmationで安全とか言われているので、40Confirmationくらいは承認数をあげた方が良さそうです。

通常の送金ならチェーンが巻き戻されても、未承認の取引は新チェーンに記録されるので問題ないのですが今回の件のように取引所が少ないブロック数で取引を受け入れてしまうと、巻き戻しに対応できないという弱点があらわになりました。

今回の犯行がなぜこのタイミングかつ、少額(*過去ハッキング事件と比べて)での犯行に疑問が残ります。

このブログを書いている人

丸の内OL3年目の玲奈です。2017年6月から仮想通貨投資を始めました!

誰にでもわかるブログを目指します(∩˃o˂∩)


仮想通貨を買う前に必ず読んでください

▼玲奈おすすめの取引所ランキング

人気のリップルを買うならビットバンク!

いろんな種類の仮想通貨をお得に買える取引所

▼仮想通貨取引に最適なネット銀行

振込手数料無料の住信SBIネット銀行

仮想通貨取引で使うなら住信SBIネット銀行

住信SBIネット銀行のメリット・デメリットはこちら

Pocket
LINEで送る