この問題の脆弱性トピックは、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億人民元を突破
ETHは2月3日に大きな打撃を受け、それ以来2,800ドルを上回る水準を維持するのに苦労している。...
シカゴ・マーカンタイル取引所グループ(CME)のエグゼクティブ・ディレクター兼デジタル化責任者である...
導入:邵弁護士が近年取り扱った事件や、日々の業務で受けた多数の問い合わせを踏まえると、国内警察(特に...
人気の宿泊施設レンタルサービスAirBnBの創設者の一人が、ユーザーの信頼を高めるためのブロックチェ...
まとめこのレポートは、3 部構成のシリーズの第 2 部であり、ステーキング、再ステーキング、流動性再...
著名なセキュリティとプライバシーの専門家であり、TED 講演者であり、世界的に有名なコンピュータおよ...
「世界は広い、見てみたい」――2015年4月14日の朝、辞表が激しい批判を引き起こした。同年、Rea...
CoinATMRadarは6月24日、世界中のビットコインATM(BTM)の総数が初めて5,000...
クレイジーな解説: 2014 年以来、世界経済フォーラムは将来の金融サービスに焦点を当て始め、それを...
「ブロックチェーン」という言葉を聞いたことがある人の多くは、それがビットコイン、ライトコイン、ドー...
キャピタルプレスによると、ワシントン州グラント郡公益事業委員会(PUD)は8月28日、新たな電気料金...
最近、ユーザーとHuobiカスタマーサービス間のチャットのスクリーンショットがオンラインで出回った。...
まとめ2024年第4四半期は、米国の利下げと中国の大規模な財政・金融刺激策により建設的となり、市場の...
ビットコインはニューヨークコンセンサスSW2X( Segwit2x )拡張計画を成功裏に発動し、ニュ...
会計事務所アーンスト・アンド・ヤングは本日、6月20日〜21日に行われたオーストラリアの大規模な...