
再現可能なビルドは決定論的コンパイルとも呼ばれ、結果として得られるバイナリコードが再現可能であることを保証するソフトウェアコンパイルプロセスです。決定論的コンパイルを使用してコンパイルされたソースコードは常に同じバイナリを出力します。[1] [2] [3]
再現可能なビルドは信頼の連鎖の一部として機能することができます。[1]ソースコードに署名でき、決定論的コンパイルによりバイナリが信頼できるソースコードからコンパイルされたことを証明できます。検証済みの再現可能なビルドは、バイナリがソースコードと一致しない攻撃(攻撃者がバイナリに悪意のあるコードを挿入した場合など)に対する強力な対抗手段となります。これは関連性のある攻撃です。攻撃者はバイナリを攻撃してもソースコードは攻撃しないことがあります。たとえば、配布されたバイナリしか変更できないため、または開発者が通常レビューして変更するのはソースコードであるため検出を回避するためです。17人の専門家を対象とした調査では、再現可能なビルドは58.8%の参加者から非常に高い有用性評価を受けましたが、70.6%から高コストの評価も受けました。[4]これらのコストを削減するためにソフトウェア開発ツールを変更するさまざまな取り組みが行われています。
方法
コンパイル プロセスを決定論的にするには、使用するビルド環境に関係なく、コンパイラへの入力が同じである必要があります。これには通常、入力ファイルの順序、タイムスタンプ、ロケール、パスなど、変更される可能性のある変数を正規化することが含まれます。
さらに、コンパイラ自体が非決定性を導入してはなりません。これは、ランダムなハッシュ シード値を持つハッシュ テーブルを使用する場合に発生することがあります。また、変数のアドレスを使用する場合にも発生することがあります。これは、アドレス空間レイアウトのランダム化(ASLR) とは異なるためです。
BazelやGitian [5]などのビルドシステムは、決定論的なビルドプロセスを自動化するために使用できます。
歴史
GNUプロジェクトは1990年代初頭に再現可能なビルドを使用しました。1992年の変更ログは継続的な取り組みを示しています。[6]
再現可能なビルドを推進する古いプロジェクト[7]の1つは、Gitianを使用した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]
課題
Reproducible Builds プロジェクトによると、タイムスタンプは「再現性の問題の最大の原因です。多くのビルド ツールは現在の日付と時刻を記録します... また、ほとんどのアーカイブ フォーマットは、独自のタイムスタンプの上に変更時刻を記録します。」[21]彼らは、「ビルドではなくソース コードに関連する日付を使用する方がよい。古いソフトウェアは、再現可能な場合はいつでも後でビルドできる」と推奨しています。これを実現するために、ビルド プロセスを変更するいくつかの方法を特定しています。
- ソース コードから取得した値を使用して、SOURCE_DATE_EPOCH 環境変数を 1970 年 1 月 1 日以降の秒数に設定します。この環境変数をサポートするツールは、現在の日付と時刻の代わりにその値 (設定されている場合) を使用します。
- 出力を後処理してタイムスタンプを削除するか、正規化します。多くの場合、ツール strip-nondeterminism がこれに役立ちます。
- libfaketime などのライブラリを使用して、現在の時刻の要求を傍受し、制御された応答を提供します。
場合によっては、ビルドプロセスを再現可能にするために他の変更を加える必要があります。たとえば、一部のデータ構造は、実行ごとに安定した順序を保証しません。一般的な解決策は、ビルドプロセスを変更して、それらの構造からソートされた出力を指定することです。 [22]
参照
参考文献
- ^ ab "reproducible-builds.org". reproducible-builds.org . 2016年5月20日時点のオリジナルよりアーカイブ。2016年8月22日閲覧。
再現可能なビルドは、人間が読めるソースコードからコンピューターが使用するバイナリコードまでの検証可能なパスを作成する一連のソフトウェア開発手法です。...ビルドシステムは完全に決定論的にする必要があります。つまり、特定のソースを変換すると、常に同じ結果が生成される必要があります。
- ^ Lamb, Chris; Zacchiroli, Stefano (2022年3月). 「再現可能なビルド: ソフトウェアサプライチェーンの整合性の向上」. IEEE Software . 39 (2): 62–70. arXiv : 2104.06020 . doi :10.1109/MS.2021.3073045. S2CID 233219473. 2023年3月26日閲覧。
- ^ Ratliff, Emily (2016 年 4 月 4 日). 「アプリケーションとソース コード間の通信を確立する | SecurityWeek.com」www.securityweek.com . SecurityWeek. 2016 年 9 月 20 日時点のオリジナルよりアーカイブ。 2016 年8 月 22 日閲覧。
- ^ Ladisa, Piergiorgio; Plate, Henrik; Martinez, Matias; Barais, Olivier (2022年4月19日). 「オープンソースソフトウェアサプライチェーンに対する攻撃の分類」. arxiv.org . arXiv : 2204.04008 . doi :10.1109/SP46215.2023.00010 (2024年11月1日非アクティブ).
{{cite journal}}: CS1 メンテナンス: DOI は 2024 年 11 月時点で非アクティブです (リンク) - ^ 「Gitian: 安全なソフトウェア配布方法」gitian.org . 2018年1月10日閲覧。
- ^ Gilmore, John (2017-01-24). 「SOURCE_PREFIX_MAP とオッカムの剃刀」. rb-general (メーリング リスト).
- ^ 「Gitian プロジェクトのライセンスファイル」。GitHub。2019年 12 月 3 日閲覧。
- ^ 決定論的ビルド パート 2: 技術的詳細。2013 年 10 月 4 日
- ^ 「DDP2P」。GitHub。2011年。
- ^ Alhamed、Khalid、他「ボランティアによって管理されるオープンソースソフトウェアの自動更新の分散認証によるセキュリティ」Citeseer。."、Proceedings of Decentralized Coordination。pp 40-59、Lulu Publisher、2013年4月6日。
- ^ Silaghi, MC, Alhamed, K., Dhannoon, O., Qin, S., Vishen, R., Knowles, R., ... & Hirayama, K. (2013 年 9 月). DirectDemocracyP2P - 分散型審議請願ドライブ -. IEEE P2P 2013 Proceedings (pp. 1-2). IEEE.
- ^ Silaghi, M., Alhamed, K., & Stansifer, R. (2015 年 12 月). 複数のレコメンデーションと分散バンドルをサポートするための Java ツール拡張。2015 年国際計算科学および計算知能会議 (CSCI) (pp. 722-725)。IEEE。
- ^ 「Debian での再現可能なビルドに関する講演」 2014 年 9 月 21 日。
- ^ 「再現可能なビルドの歴史」。
- ^ "Linux-Distributionen: Mehr als 90 Prozent der Debian-Pakete reproduzierbar - Golem.de" (ドイツ語)。 2017-07-24 。2018年10月30日に取得。
- ^ 「Reproducible Builds が Software Freedom Conservancy に参加」2018 年 12 月 15 日閲覧。
- ^ 「再現可能なビルド」。F-Droid。
- ^ 「Tails イメージの再現性の検証」。Tails。
- ^ 「Nixos-unstable の iso_minimal.x86_64-linux は 100% 再現可能です!」NixOS Discourse . 2021-06-20 . 2021-06-21に閲覧。
- ^ 「ArchWiki - 再現可能なビルド」。
- ^ 「タイムスタンプ」。再現可能なビルド。2022年4月16日閲覧。
- ^ 「タイムスタンプ」。再現可能なビルド。2022年4月16日閲覧。
外部リンク
- 再現可能なビルド
- Debian 再現可能なビルド
