mt.Goxの攻撃につかわれたTransaction malleability とはどういうものか?(テクニカル)

mt.Goxの攻撃につかわれたTransaction malleabilityについてのテクニカルな説明です

Transaction malleabilityとは、専門用語で、トランザクション展性と呼びます。

ビットコインのトランザクションにおいては、送金の内容は変わらないのですが、結果として、トランザクションのIDに相当するものが変わります。

ビットコインのトランザクションでは、スクリプト部分があります。

(input)3044022013ee2063e10a58e450d1fa598a447a7f18af816f09b3a3cf4b8843f6b902b32c022025ea137d9ba1d8205a43720d81627c2f899c91b031eb170ed02ae9fd916f328601 040ceb5a5a57fd4a6f77a1b65fc8e19f4d0d396142d4521d2e413c8f97b10ed77762d32c53df07b9687e78f582a93d1c7488c78b6223a0c90ca67cda4096730de9

(output) OP_DUP OP_HASH160 0f403837793e1e5f707eb0450a145d1940accd10 OP_EQUALVERIFY OP_CHECKSIG

たとえばこういったものなのですが、たとえばマイナーは、スクリプトの結果が変わらない範囲で、いくつかの情報の変更が可能になっています。

典型的な手法は、input スクリプトのOP_0を、OP_PUSHUDATA2に置き換えるものです。このスクリプトの変更は、署名検証の手順をすこし変えるだけなので、結果は変わらず、トランザクションにふくまれる署名は正しく確認され、トランザクション自体は有効とみなされます。

しかしながら、ビットコインの仕様では、署名部分も含めてトランザクション全体に対して、hashをとり、それをtransaction hashとしています。そして、これがいわゆるtransaction idとして、いままでは利用されててきました。

当然、トランザクションにふくまれるスクリプトの一部の情報を変えたので、outputは一緒でも、hashをとったら、transaction idは別のものになります。これが、Transaction malleability です。つまり、これを突くと、アウトプットはかわらず、署名も有効なトランザクションだが、transaction hashだけが書き換わったものを作り出すことができるということです。

もし、このtransaction hash だけをみて、トランザクションを特定しているシステムがあると、危険なことが起こりそうなのは想像がつくでしょう。

この問題は以前から指摘されており、transaction の識別においては単にhashだけでやらないように注意すべきとのことだったようです。

mt.goxにおいては、あるギークの証言では次のような実装がされていたとのこと

①BTCの引き出しが行われると、そのtransaction hash をMt.GoxのDBに記録。

②しばらくして、blockchainを参照し、ブロックに当該transaction hashが含まれているかを確認。含まれていれば、引き出し送金に成功したとみなして終了。

③しかし、ブロックに当該transaction hashが含まれていない場合、そのトランザクションに失敗したとして、再送金のトランザクションを起こしていた(自動)

明らかにまずい実装だということがわかります。transaction hashだけをみて送金確認をしていた点にくわえ、自動で再送金をしていた点が致命的。ダブルでまずい。

本来は、送金先、input outputの金額を複数検証してtransactionを特定すべきです。しかし、transaction hashだけを見るという単純な実装をしていた可能性があります。

悪意ある人が、Transaction malleabilityをつかって、transaction hashを書き換えれば、mt.Goxは送金を繰り返すというわけです。

なぜ、このような安易な実装を取ったのかは不明ですが、そのギークの推測によれば、

Mt.Goxの送金システムはそもそもトランザクションの仕様に乗っ取らないおかしなトランザクションを生成しており、そのため度々、ネットワークに拒否されることが多かったとのこと。

たとえば、新規に生成されたコインは、100 confirmation終わるまではトランザクションに含めてはいけないルールなのだが、100 confirmに満たない若いコインを送金に含めていたとのこと。

「2年ほど前に、Bitcoin の transactionのルールが変わったが、それにMt.Goxはちゃんと対応出来ておらず、彼らにおいては、拒否されるトランザクションが多発した。その数が相当数にのぼったため、送金トランザクションの再送信も自動化したのではないか」という指摘であった。

 

【ノマド研究所5期会員募集のお知らせ】人生は短いです。あーやりたい事があるのに、何か思い切って一歩を踏み出せない自分にいらいらする、もっと自由に生き見たいのに。ノマド研は、ノマド的な生き方を志向するひと、ノマド的な生き方を実践するひとのネットワークです。400名以上の価値観のちかいメンバーと一緒に語らいましょう。⇒ご案内