
再現可能なビルド(決定論的コンパイルとも呼ばれる)は、結果として得られるバイナリコードが再現可能であることを保証するソフトウェア構築プロセスです。決定論的にコンパイルされたソースコードは、常に同じバイナリを出力します。[ 1 ] [ 2 ] [ 3 ]
再現可能なビルドは信頼の連鎖の一部として機能します。[ 1 ]ソースコードに署名し、決定論的コンパイルによってバイナリが信頼できるソースコードからコンパイルされたことを証明できます。検証済みの再現可能なビルドは、バイナリがソースコードと一致しない攻撃(たとえば、攻撃者がバイナリに悪意のあるコードを挿入した場合)に対する強力な対策となります。これは関連する攻撃です。攻撃者は、配布されたバイナリしか変更できないため、または開発者が通常レビューおよび変更するのはソースコードであるため検出を回避するために、ソースコードではなくバイナリを攻撃することがあります。17人の専門家を対象とした調査では、再現可能なビルドは参加者の58.8%から非常に高い有用性の評価を得ましたが、70.6%からは高いコストの評価も得ました。[ 4 ]これらのコストを削減するために、ソフトウェア開発ツールの変更に関するさまざまな取り組みが行われています。
コンパイル処理が決定論的であるためには、使用するビルド環境に関係なく、コンパイラへの入力が同じである必要があります。これは通常、入力ファイルの順序、タイムスタンプ、ロケール、パスなど、変化する可能性のある変数を正規化することによって実現されます。
さらに、コンパイラ自体が非決定性を導入してはなりません。これは、ランダムなハッシュシード値を持つハッシュテーブルを使用する場合に発生することがあります。また、アドレス空間配置ランダム化(ASLR)によって変数のアドレスが変化するため、変数のアドレスを使用する場合にも発生する可能性があります。
Bazel、GNU Guix、Gitianなどのビルドシステム[ 5 ]は、決定論的なビルドプロセスを自動化するために使用できます。
GNUプロジェクトは1990年代初頭に再現可能なビルドを使用していた。1992年の変更履歴は、継続的な取り組みを示している。[ 6 ]
再現可能なビルドを促進する古いプロジェクト[ 7 ]の 1 つは、 Gitian 、そして後に GNU Guix を使用したBitcoinプロジェクトです。2013 年に、Tor (匿名ネットワーク)プロジェクトは、再現可能なビルドに Gitian を使用し始めました。[ 8 ]
2011 年以降、分散型ピアツーピア FOSS プロジェクト DirectDemocracyP2P 用に再現可能な Java ビルド システムの開発が始まりました。[ 9 ]システムの自動更新推奨サポートへの適用に関する概念は、2013 年 4 月に Decentralized Coordination で初めて発表されました。[ 10 ] [ 11 ]再現可能な Java コンパイル ツール自体の実装の詳細に焦点を当てた論文が 2015 年に公開されました。 [ 12 ]
2013 年 7 月、Debianプロジェクトはパッケージ アーカイブ全体にわたって再現可能なビルドの実装を開始しました。[ 13 ] [ 14 ] 2017 年 7 月までに、リポジトリ内のパッケージの 90% 以上が再現可能なビルドであることが証明されました。[ 15 ]
2018年11月、Reproducible BuildsプロジェクトはSoftware Freedom Conservancyに加わりました。[ 16 ]
F-Droidは再現可能なビルドを使用して、配布されるAPKが主張されているフリーソースコードを使用していることを保証しています。[ 17 ]
Tailsポータブルオペレーティングシステムは再現可能なビルドを使用し、配布物の検証方法を他の人に説明しています。[ 18 ]
NixOSは、2021年6月時点で、最小限のISOリリースのビルド再現性が100%であると主張している。[ 19 ]
2020年5月現在 Arch Linux は、すべての公式パッケージを再現可能にするために取り組んでいます。[ 20 ]
2025年3月現在 Bookworm 用の Debianライブイメージは再現可能です。[ 21 ]
FreeBSDオペレーティングシステムは、2025年10月以降、rootアクセスなしで再現性のあるビルドが可能になりました。[ 22 ]
再現可能なビルドプロジェクトによると、タイムスタンプは「再現性の問題の最大の原因」です。多くのビルドツールは現在の日時を記録し、ほとんどのアーカイブ形式は独自のタイムスタンプに加えて変更時刻を記録します。[ 23 ]彼らは、再現性がある場合、「ビルドではなくソースコードに関連する日付を使用する方が良い。古いソフトウェアはいつでも後でビルドできる」と推奨しています。彼らは、これを実現するためにビルドプロセスを変更するいくつかの方法を挙げています。
場合によっては、ビルド プロセスを再現可能にするために他の変更を加える必要があります。たとえば、一部のデータ構造は、実行ごとに安定した順序を保証しません。一般的な解決策は、ビルド プロセスを変更して、これらの構造からソートされた出力を指定することです。 [ 24 ]
再現可能なビルドは、人間が読めるソース コードからコンピュータで使用されるバイナリ コードへの検証可能なパスを作成する一連のソフトウェア開発手法です。...ビルド システムは完全に決定論的である必要があります。特定のソースを変換すると、常に同じ結果が生成される必要があります。