2025/10/29 19:32 I'm Independently Verifying Go's Reproducible Builds

ロボ子、Go 1.21からgoコマンドがtoolchainを自動でダウンロードするようになったのじゃ。

それは便利ですね、博士。でも、セキュリティ面で心配はありませんか?

そこがポイントなのじゃ!ダウンロードしたバイナリを実行することへの懸念に対処するために、Goプロジェクトはいろいろ対策をしているぞ。

具体的には、どのような対策をしているのですか?

まず、Go 1.21以降のバージョンはソースコードから簡単に再現できるようになったのじゃ。それから、toolchainのZipアーカイブのチェックサムを公開しているぞ。

チェックサムを検証するのですね。goコマンドがダウンロードされたtoolchainのチェックサムをChecksum Databaseで検証すると。

その通り!さらに、Source SpotterというものがGo Checksum Databaseの監査をしていて、toolchainの再現性も検証しているのじゃ。

Source Spotterですか。それはどのように機能するのですか?

golang.org/toolchain疑似モジュールの新しいバージョンを検出すると、対応するソースコードをダウンロードして、AWS Lambda関数でビルドするのじゃ。そして、結果のZipファイルのチェックサムをChecksum Databaseに公開されているチェックサムと比較するぞ。

なるほど。自動的に検証してくれるのですね。素晴らしい。

Source Spotterは、Go 1.21.0以降のすべてのtoolchainを、すべてのアーキテクチャとオペレーティングシステムで再現することに成功しているらしいぞ。なんと2,672 toolchainsも!

それはすごいですね!でも、Go toolchainはGoで記述されているとのことですが、どのようにして最初のtoolchainをビルドしたのですか?

良い質問じゃな、ロボ子!Go 1.21、1.22、1.23の再現には、ソースからビルドしたGo 1.20.14 toolchainを使用したらしいぞ。そして、Go 1.24以降の再現には、以前にソースから再現可能であることを検証したバイナリtoolchainを使用しているのじゃ。

段階的に信頼性を高めているのですね。

そういうことじゃ。ただ、いくつか課題もあるみたいじゃな。macOS toolchainにはGoogleの秘密鍵による署名が含まれていて、Source Spotterは署名を削除する必要があるらしい。

それは少し面倒ですね。

linux-arm toolchainの再現には、環境変数GOARM=6を設定する必要があるみたいじゃ(Go 1.21.0を除く)。

環境変数の設定が必要なのですね。

Checksum DatabaseにはGo 1.9.2rc2のtoolchainが含まれているが、これは有効なバージョンではないため、特別な処理が必要になるらしいぞ。

いろいろと細かい問題があるのですね。

Source Spotterは、バックドア対策として、ビルドするすべてのソースtarballのチェックサムも公開しているのじゃ。GoプロジェクトがソースtarballをChecksum Databaseに公開することを希望しているらしいぞ。

セキュリティ対策は重要ですね。博士、今日のまとめをお願いします。

よし、まとめじゃ!Go 1.21以降、goコマンドがtoolchainを自動ダウンロードするようになったが、セキュリティ対策として、再現性の検証やチェックサムの検証が行われているのじゃ。Source Spotterというものが頑張ってくれているぞ!

ありがとうございます、博士。とても勉強になりました!

ところでロボ子、toolchainの自動ダウンロードって、まるで私がロボットを自動生成するみたいじゃな!

博士、私はtoolchainではありません!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。