491 / 736REPRO

Reproducible Firmware Build

再現可能なファームウェアのビルド

ハードウェアウォレットを更新するときにインストールするのは、完成したファイルです。そのファイルは、本当にメーカーが公開したコードから作られたのでしょうか。Reproducible Firmware Build は、別の人が同じソフトウェアを独立してビルドし、結果を比較できる仕組みです。公開コードと配布された更新ファイルのつながりを確かめる助けになります。

ファームウェアとは、ハードウェアウォレットなどの機器を動かすソフトウェアです。同じソースコード、指定された環境、手順から、あらかじめ対象としたファイルが完全に一致して得られるとき、そのビルドには再現性があるといいます。同じ動作をするだけでは足りず、データ自体を比較します。署名付きの配布物では、署名をどう扱うかも明確にする必要があります。

メーカーは、プログラマーが読めるソースコードを公開できます。しかし、ウォレットに通常インストールするのは、機械が処理する形になった完成済みのファイル、いわゆるバイナリです。両者をつなぐ工程がビルドです。独立した人がその工程を繰り返し、配布されたファイルと比較します。調べるのは、データの単位であるバイトが一致するかどうかです。内容から計算される指紋のような値、暗号学的ハッシュを使うこともあります。検証の対象はファームウェアなど指定された出力であり、作業ファイルやログまで自動的に含むわけではありません。 [1] [4]

二人の開発者が一つの更新を検証すると考えてみましょう。プロジェクト名だけでは不十分で、コードの正確な版を指定する同じ commit が必要です。利用するライブラリと、コードを機械向けの形に変換するコンパイラのバージョンも必要になります。コンパイラのオプション、関係する環境設定、ウォレットの機種も手順の一部です。こうした情報は事前に決めるか、ビルド時に記録しなければなりません。そうしないと、二人とも誠実に作業していても結果が異なることがあります。 [1] [2]

違いがあるからといって、必ずプログラムの動作が改変されたとは限りません。コンパイラは、不具合を調べるための情報に作業フォルダのパスを書き込むことがあります。二人が別の場所にプロジェクトを置けば、それだけでファイルが変わり得ます。指定のパスを使う、または対応した方法でパスを統一することが解決策になります。その処理は、あらかじめ分かっている手順の一部である必要があります。検証に失敗した後で、説明できない違いを消して一致させるのでは意味がありません。 [3]

デジタル署名では、そのファイルが対応する鍵で作られた署名と一致するかを確認できます。その鍵をメーカーのものだと判断することも、信頼の別の要素です。再現可能なビルドが調べるのは、ファイルが指定のソースコードに対応するかという別の問題です。二つの確認は補い合います。ただし、公式の更新にはローカルのビルドにない署名データが入っていることがあります。形式を理解せずファイル全体を比較すると、プログラム自体は正しくビルドされていても不一致になります。 [5]

Trezor の文書は、バージョンと機種の選択、ファームウェアのビルド、公式ファイルとの比較を説明しています。ローカルの結果にはメーカーの配布物と同じ署名がないため、比較前に厳密に指定された署名フィールドをゼロにします。古い形式では、ファイルの情報を収める先頭部分であるヘッダーにも違いがあります。構造は機種とバージョンによって変わるので、ある機器の手順を別の機器にそのまま適用することはできません。元の署名は別途検証します。調整したコピーの比較は、署名の検証を置き換えません。 [5]

まず、同じコードの版、機種、ファームウェアの種類を比較していたかを確認します。その後で、道具、ライブラリ、指定されたファイル変換を調べます。元のファイルと、見つかった違いの記録は残す必要があります。原因は環境や手順の誤りかもしれず、配布プログラムへの変更かもしれません。不一致だけで原因や責任者を特定することはできません。違いが説明され、検証をやり直すまでは、確認済みのビルドと呼ぶべきではありません。 [1] [4]

公開コードにすでに欠陥があれば、何度ビルドしてもその欠陥が忠実に再現され得ます。共通の信頼できないコンパイラが、すべての結果に同じ悪意ある変更を加える場合もあります。そのコンパイラをもう一度使うことは、道具そのものを独立して検証することではありません。非公開のバイナリ部品があれば、公開コードから再構築できる範囲も限られます。さらに、コンピューター上のファイルが一致しても、手元のウォレットが本物か、そのファームウェアを実際に実行しているかは分かりません。ファイルの由来の確認は安全性の重要な一部ですが、完全な証明ではありません。 [6] [1]

「検証済み」という報告は、誰が、どのコードの版を、どの機種向けに、どの手順でビルドしたかが分かってこそ役立ちます。比較したファイル、ハッシュ関数、結果、署名データの正確な扱いも必要です。その記録があれば、ほかの人が調べたり作業を繰り返したりできます。独立した検証者が増えるほど、一つの配布元への依存は小さくなります。それでも、コード、更新方法、機器自体の確認は必要です。 [2] [4]

例 · REPRO

二つの同じ結果と、一つだけ異なるハッシュ

二人の開発者が同じコードの版を使い、同じ機種向けに同じ環境でビルドします。二つのファイルの SHA-256 は一致しますが、署名付き公式版の値は異なります。文書が署名フィールドを厳密に定義しているなら、コピーに指定の変換を施して再比較します。その一致は、こうして定めた内容についてのものです。元の署名には別途検証が必要であり、ほかの説明できない違いを単に削除してはいけません。

理解を深めるには、この項目とあわせて次もお読みください Hardware Wallet, Private Key, Cold Storage, Secure Element. 次の項目からも参照されています COLDCARD RNG Incident (2026).

01利用者も自分でファームウェアをビルドする必要がありますか?

検証結果を理解するためにプログラマーになる必要はありません。ただし、独立した報告に具体的なバージョン、機種、比較ファイルが記載されているかは確認しましょう。ハッシュの一致は欠陥がない証明ではありません。同じ悪意あるコードやコンパイラも同じファイルを作れます。コードの評価と機器への信頼は、引き続き別の問題です。

02署名付き更新のハッシュが違えば、攻撃なのでしょうか?

必ずしもそうではありません。検証手順が想定する署名データやヘッダーの違いかもしれません。バージョン、機種、正確な手順を確かめる必要があります。ただし、説明できない違いは検証成功ではなく、勝手にデータを消して回避してよいものでもありません。

DOC · 001Reproducible Builds — Definition文書 DOC · 002Reproducible Builds — Recording the environment文書 DOC · 003Reproducible Builds — Build paths文書 DOC · 004Reproducible Builds — Build infrastructure threats文書 DOC · 005Trezor — Reproducible build verification文書 DOC · 006Wheeler — Countering Trusting Trust一次資料
改訂日: 一次資料を優先 · 投資助言ではありません