セキュリティガイド |ビットコインの恣意的盗難脆弱性の簡単な分析

セキュリティガイド |ビットコインの恣意的盗難脆弱性の簡単な分析

この問題の脆弱性トピックは、Bitcoin の脆弱性 CVE-2010-5141 です。この脆弱性により、攻撃者が誰かのビットコインを盗む可能性があり、非常に有害です。幸いなことに、この脆弱性は悪用されておらず、すぐに修正されました。この脆弱性はビットコインのスクリプト エンジンに関連しており、パブリック チェーン開発者にとって重要な参考情報となります。現在市場に出回っているパブリックチェーンから判断すると、そのほとんどにはDAppエコシステムを構築するための仮想マシンやスクリプトエンジンが組み込まれており、これもブロックチェーンの大きなトレンドの1つです。

1. ビットコインの UTXO モデルとは何ですか?

ヒント: 脆弱性コード スニペットには UTXO 関連の知識と概念がいくつか含まれているため、脆弱性の理論的な分析を行う前にこれらの知識ポイントを理解する必要があります。すでに理解している場合は、直接スキップできます。

Ⅰ.アカウントモデルとUTXOモデル

UTXO モデルを見る前に、まず共通アカウント モデルについて説明しましょう。アカウントモデルとは何ですか?アカウント モデルのデータ構造は、単純に「アカウント => 残高」として理解でき、各アカウントは残高に対応します。たとえば、アカウント A がアカウント B に 200 を送金する場合、アカウント モデルでは、送金操作には A-200 と B+200 のみが必要です。現在、銀行システムや Ethereum などのほとんどのソフトウェアはアカウント モデルを使用しています。

しかし、ビットコインは独自に開発されたUTXOモデルを使用しています。 UTXOには「account=>balance」のようなデータ構造がないので、どうやって送金するのでしょうか?

Ⅱ.ビットコインの送金方法

A から B への転送を例にとると、UTXO でこの転送を完了するには次の操作が必要です。

1. Aの口座の残高200の出所を見つける。つまり、Aが200を受け取った取引を見つける。

2. トランザクションxを入力とし、トランザクションyを出力としてBに200を送金する場合、xとyは対応しており、xとyの送金金額は等しくなければならない。

3. トランザクションxは使用済みとしてマークされ、トランザクションyは未使用としてマークされます

2 つの取引の送金金額は等しくなければなりません。簡単に言えば、受け取った金額と同じ額だけ送金できるということです。実際その通りです。

しかし、その一部だけを他の人に譲渡する必要がある場合はどうでしょうか?答えは、その一部だけを他の人に譲渡し、残りを自分の別のアカウントに譲渡することです。

III.インターネットから 2 つの画像とテキストを引用します。

アカウントモデル

UTXOモデル

この記事では、ビットコインがなぜ UTXO モデルを採用したのかについては焦点を当てていません。 UTXO の原理を理解する必要があります。

2. ビットコインのスクリプトエンジン

Bitcoin スクリプトはチューリング完全ではありません。ビットコインは、トランザクションやその他の操作を実行するために独自に定義されたスクリプトを使用するため、ビットコインの柔軟性は限られています。マルチ署名や資金凍結などの単純な機能は実装していますが、それ以上の機能は実装していません。

ビットコインがこれを実行する理由は、セキュリティを確保するためにある程度の完全性を犠牲にするためです。 Bitcoin スクリプトの原理は、最初に一連のオペコードを定義し、次にスクリプト エンジンがスタックに基づいて各オペコードを 1 つずつ実行することです。

スタックは理解しやすいです。キューは先入れ後出しですが、スタックはその逆で先入れ先出しです。要素がスタックにプッシュされた後、最初にポップアウトされます。

Bitcoin の初期バージョンでは、標準転送 (pay-to-pubkey) トランザクションを送信するには、スクリプト署名 (scriptSig) と公開鍵検証スクリプト (scriptPubKey) が必要でした。具体的な処理フローは以下のとおりです。

まず実行するスクリプトを入力し、署名 (sig) と公開鍵 (pubKey) がスタックにプッシュされ、次にオペコード OP_CHECKSIG が署名などを検証します。検証に合格すると、スタックに true がプッシュされ、合格しないと false がスタックにプッシュされます。

3. CVE-2010-5141 脆弱性分析

上記の知識を理解した後、CVE-2010-5141 の脆弱性の分析を開始できます。作者は脆弱なバージョン 0.3.3 をダウンロードしました。ダウンロード アドレスは github のビットコイン リポジトリにあり、リリースを見つけます。

script.cpp コード スニペット VerifySignature 関数:

VerifySignature 関数は各トランザクションに対して呼び出され、スクリプトを実行して署名を検証し、トランザクションが使用されたかどうかをマークするために使用されます。

まず、txFrom パラメータは前のトランザクションであり、txTo は処理中のトランザクションです。上の章で説明したUTXOモデルを理解していれば、ここでの理解は難しくありません。 EvalScript 関数が呼び出される 1125 行目に注目してください。最初のパラメータは、txin.scriptSig (署名情報を含む) + セパレータ オペコード OP_CODESEPARATOR + txout.scriptPunKey (公開鍵情報、OP_CHECKSIG 命令を含む) です。これらは、EvalScript 関数によって実行されるスクリプトです。以下のパラメータは当面無視できます。 EvalScript 関数が true を返す限り、検証署名は渡されます。 EvalScript 関数はどのようにして true を返すことができますか?

まず、スタックは空にできず、スタックの最上部は bool に変換された後に true である必要があります。著者は、スタックトップが存在する必要があり、値が 0 になることはないと単純に解釈しています。

次にキーOP_CHECKSIGオペコードを見てください

(注: オペコードが多すぎるため、この記事では OP_CHECKSIG オペコードに焦点を当てます)

上記のコードは理解するのが難しくありません。 Checksig 関数は署名を検証するために呼び出され、その後 FSuccess 変数に返されます。真の場合、vchTrue (0 以外) がスタックにプッシュされ、それ以外の場合は vchFalse (0) がスタックにプッシュされます。オペコードが OP_CHECKSIG ではなく OP_CHECKSIGVERIFY の場合、vchTrue がスタックからポップされ、後続のオペコードが実行されます。

OP_CHECKSIG の通常のロジックによれば、署名検証が失敗した場合、スタックの先頭に vchFalse が残ります。スタックは空ではありませんが、スタックの一番上の値は 0 なので、false が返されます。

前のコードに戻ると、EvalScript 関数によって実行されるスクリプトは主に次の変数で構成されています。

1. txin.scriptSig

2. OP_コードセパレータ

3. txout.script公開キー

最初の署名情報は制御可能であり、2 番目の署名情報は単なる区切り文字であるため削除されます。3 番目の署名情報は、前のトランザクションからのものであるため制御できません。

最初の変数は制御可能であり、スクリプトとして実行されるため、この変数は署名情報だけでなく、オペコードにもなります。これは扱いやすいです。次に、魔法のオペコード OP_PUSHDATA4 を参照する必要があります。 Bitcoin 0.3.3 がこのオペコードをどのように処理するかを見てみましょう。

まずオペコードを取得します。オペコードの値が OP_PUSHDATA4 の値以下の場合は、すべての vchPushValues をスタックにプッシュしてから、GetOp 関数を実行します。

ソースコードを読むと、OP_PUSHDATA4 命令は 78 として定義されていることがわかります。そのため、関数が OP_PUSHDATA4 に遭遇すると、ポインターは 78+4=82 ビットに移動し、そのうち 78 ビットのデータがスタックにプッシュされます。したがって、OP_PUSHDATA4 オペコードが txin.scriptSig に挿入されている限り、後続の公開鍵情報と OP_CHECKSIG 命令は「取り込まれ」、パラメータとしてスタックにプッシュされます。ポインタが端に到達すると、最終判定が下されます。

1. スタックは空ですか?いいえ

2. スタックの一番上の要素は 0 ですか?いいえ

したがって、条件が満たされた場合、EvalScript 関数は true を返し、VerifySignature 関数も true を返します。署名の検証が回避されるため、他人のビットコインを自由に使うことができます。

4. CVE-2010-5141 脆弱性修復ソリューション

著者はビットコインバージョン0.3.8をダウンロードし、キーコードを直接確認した。

修正方法も非常に明確で、scriptSig と scriptPubkey を別々に実行します。 scriptSig に何が含まれていても、後続の scriptPubkey の実行には影響しません。

結論は:

Bitcoinの脆弱性分析はDVP創刊号から連載されているため、現在の資料は2010年のものです。現在の脆弱性分析には主に以下の難点があります。

1. 脆弱性に関する情報はほとんどありません。ほとんどの脆弱性には、CVE 番号と簡単な概要のみが記載されています。大量の情報を調べなければ、それらを見つけるのは困難です。

2. コンパイル、プライベートチェーンの構築(初期のビットコインにはプライベートチェーンの概念すらありませんでした)など、環境の設定が困難です。初期のビットコインのソースコードのコンパイルに必要な依存関係の多くは、メンテナンスされなくなり、オフラインになっています。

これらの理由から、著者は理論的な研究のみを行い、実践的な検証は行いませんでした。誤りがあれば修正してください。

5. 参考リンク

https://bitcoin.stackexchange.com/questions/37403/which-release-fixed-cve-2010-5141-attacker-can-spend-any-coin

https://en.bitcoin.it/wiki/スクリプト

<<:  黒い邪悪な勢力が鉱業分野に参入、青海日経は一連の鉱業詐欺を慎重に明らかにする

>>:  カナンクリエイティブのシャオ・ジアンリャン氏:カナンクリエイティブの売上高は2018年に40億人民元を突破

推薦する

インドに続いて、パキスタンはもう一つの重要なビットコイン拠点となるでしょうか?

パキスタンは現在、約2億200万人の住民を抱え、世界で7番目に人口の多い国です。現在、この国にはビッ...

ビットコインは31,000ドルを超え、9週間の下落が終わり、暗号通貨市場に希望の光が見えてくるかもしれない

Bitpush端末のデータによると、ビットコインは24時間で5.82%上昇した。記事執筆時点で、ビッ...

マイニング、フォーク、アグリゲーターまで、DeFiの進化について1つの記事で学ぶ

(星月夜、フィンセント・ファン・ゴッホ) DeFiは2年以上の休眠状態を経て、2020年夏に爆発的に...

2016年ブロックチェーン国際サミットが6月に北京で盛大に開幕

主催者: 中関村ブロックチェーン産業連盟アジアブロックチェーンDACA協会共催:バビットブロックチェ...

ビットコインの価格は、次の 2 つの要因により、過去 1 週間で 10% 近く上昇しました。

過去1週間でビットコインの価格は10%近く上昇しました。強気な市場センチメントと低い流動性により、価...

ブロックチェーン投資会社CoinsiliumがスマートコントラクトプラットフォームRootstockに10万ドルを投資

ブロックチェーン投資会社Coinsiliumは、スマートコントラクトプラットフォームRootstoc...

シリコンバレーの有名なベンチャーキャピタル会社A16z、ビットコイン、Urbit

クレイジーな解説:Tlon は、シリコンバレーの有名なベンチャーキャピタル会社 Andreessen...

ノースカロライナ州、著名なビットコイン企業に免除を認める

ノースカロライナ州は、米国の他の州で見られるような不明確な規制を回避するため、ビットコインやブロック...

中央銀行の盛松成氏:なぜ中央銀行のデジタル通貨だけが通貨と呼べるのか?

中国の中央銀行デジタル通貨はどのようなものになるのでしょうか?さまざまな噂が流れています。 6月24...

Bitcoinコンセンサスプロトコルに関するbitcoin.orgからの重要な声明

ビットコインは「金融機関を介さずに、オンラインで個人間に直接支払いを行うことができるピアツーピアの電...

スマートサイエンス: Filecoin はどのようにして魔女の攻撃を防ぐのでしょうか?

プロフェッショナリズムと集中力、双方に利益のある協力専門化業界専門化注記 2020年8月24日月曜日...

イーサリアムの「マージ」に関する8つの疑問

PoW から PoS へ、イーサリアムの「統合」はますます期待が高まっています。 4月11日、イーサ...

ビットコインマイニングの分散化を実現するにはどうすればいいでしょうか?

はじめに: マイニング プールは集中化される傾向があるため、ビットコインは分散化されていると批判され...

JPモルガン・チェースがイーサリアム(フォーク)に参加し、プライベートブロックチェーン「Quorum」を開発

最近の声明によると、資産総額2兆3,500億ドルを誇る米国最大の銀行JPモルガン・チェースは、イーサ...

イーサリアムスポット ETF は近づいているか?

メディアの報道によると、事情に詳しい4人の関係者は、米国の発行会社やその他の企業は、米証券取引委員会...