VPNアプリの再現可能ビルド:一致が証明するもの
一致する再ビルドは、配布されたバイナリを宣言されたソースとツールに結びつける。そのバイナリの背後にあるVPNサービスやログについては何も語らない。
再現性はサプライチェーンの性質である。同じ宣言済み入力からは同じ成果物が生成されなければならない。VPNクライアントでは、この文はダウンロードしたインストーラを、誰でも再ビルドできるソースとツールチェーンに結びつけるが、クライアントが接続するサービスについては何も語らない。
したがって有用な問いは狭く、答えられる。プロジェクトは手順を公開しているか、そしてあなたの特定の成果物はそれに一致するか。
ビルドが決定的でなくなる場所
コンパイラは、指示しなければタイムスタンプ、絶対パス、ビルドホスト名を埋め込む。アーカイブはファイルの順序と更新時刻を記録し、リンカはツールチェーンの版によって出力を変え、並列圧縮はブロックを並べ替えうる。そのどれか一つで、同じソースの二つのビルドは、不穏なことが何も起きなくてもバイト単位で異なる。決定性はビルドに設計として組み込まれるもので、既定で受け継がれるものではない。
再現性を主張するプロジェクトは、適用する正規化——固定タイムスタンプ、マップされたパス、並べ替えたアーカイブ項目、固定したコンパイラと依存関係の版——を明示しなければならない。この一覧がなければ、正当な変動の範囲が定義されていないため、不一致を解釈できない。
宣言済み入力も完全でなければならない。タグのないリポジトリURLはリビジョンではなく、ハッシュのないロックファイルは依存関係の集合ではなく、実行時にツールをダウンロードするビルドスクリプトには誰も固定できない入力がある。どの隙間も後で差異になる。意味のある形では失敗できないのだから、何かを比較する前に一覧を完成させよ。
| Input | How it drifts | What pins it |
|---|---|---|
| Source | Branch moves after release | Commit hash in the build metadata |
| Toolchain | Compiler patch level differs | Container image digest |
| Packaging | Archive order and mtimes vary | Normalised archive settings |
比較が実際に検査するもの
独立した第三者が宣言された環境で再ビルドし、出力を公開成果物と比較する。ビット単位の一致が強い形であり、記録された差異を反転させて結果が一致する、文書化された正規化手順は、弱いが依然として有用な形である。
比較が対象とするのはバイナリであり、署名は別の問いに答える。リリースを鍵に、鍵を身元に結びつけるものであり、誰も再ビルドしていない成果物に有効な署名が付くこともある。二つの検査は互いを置き換えるのではなく積み重なる。
sha256sum wireguard-installer.msi gpg --verify wireguard-installer.msi.sig wireguard-installer.msi
インストール前に両方を実行し、同じリリースと同じプラットフォームについて公開されたハッシュと比較せよ。ベンダーのページと一致するハッシュはダウンロードが無傷で届いたことを証明し、公開ハッシュと一致する再ビルド済みバイナリは、それがどう作られたかについてより強いことを証明する。
不一致が改ざんの証拠にならない理由
ほとんどの不一致は、誰も制御していなかった入力から生じる。別のコンパイラのパッチリリース、デバッグシンボルに漏れたビルドパス、並べ替え順を変えたロケール、比較後に適用されたパッケージ手順は、いずれも誠実な作業とは異なるハッシュを生む。
だからこそ不一致は、物語になる前に文書化された手順と照らして読まれなければならない。手順がすべてを固定しているのに差異が説明できないなら、それはプロジェクトに提起する価値のある実際の発見である。手順がパッケージについて沈黙しているなら、差異はまったく想定内かもしれない。
ここでは対称性も重要である:一致はソースに欠陥がないことを証明しない、つまりバイナリがそれに対応していることだけを証明する。よく監査されたコードと再現可能なコードは別の性質であり、プロジェクトは一方だけを持つことができる。
主張がアプリの背後のサービスについて語ること
クライアントは端末上のプログラムであり、サービスは他所にあるサーバ、アカウント体系、保持方針である。再現性は前者を制約し、後者については、インストーラがどれほど注意深く検証されても何も語らない。
エンドポイント設定も、リモート設定やプロバイダが管理するプロファイルによってインストール後に変わりうる。そうした変更はネットワーク経由で届き、接続前に計算したどのハッシュにも含まれない。
主張をその実際の範囲で読み、次に、プロバイダが何を記録し、どの法域の下で要求に応答するのかという隣接する問いを別に確認せよ。検証済みのバイナリと未検証のサービスは共存しうるものであり、まさにそれが、サプライチェーン検査が可視化のために設計されていて修正のためではない理由である。