依存関係、VCSから直接取得で安全に

テクノロジー

ソフトウェア開発において、外部パッケージリポジトリに依存するのではなく、バージョン管理システム(VCS)から直接依存関係を取得することで、セキュリティリスクを低減し、信頼性と再現性を向上させることができるという考え方があります。これは、Go言語の依存関係管理システムであるGo Modulesの仕組みにも見られます。

Goでは、`github.com/user/pkg`のようなURLで依存関係が識別され、リポジトリから取得されます(現在は既定でモジュールプロキシ経由ですが、識別子と出どころはあくまでVCSです)。`go.mod`ファイルが依存関係の指定とロックの両方の役割を果たし、正確なバージョンのみをリストします。Go Modulesは、2018年のGo 1.11で導入されました。ロック用の`go.sum`ファイルも当初からあり、2019年のGo 1.13でチェックサムデータベース(sum.golang.org)による検証が標準で有効になって、モジュールが改ざんされていないかを自動で確認できるようになりました。さらに、2022年のGo 1.18からは、GoコンパイラがVCSメタデータ(現在のコミットハッシュ、コミット時間など)をバイナリに埋め込むようになり、トレーサビリティとデバッグ能力が向上しました。

これは、npmのようなJavaScriptのパッケージマネージャーが抱えるセキュリティリスクと比較すると、その重要性が際立ちます。npmの過去の侵害の多くは、公開されたパッケージへの悪意あるコードの注入が原因でした。例えば、`event-stream`というパッケージの依存関係であった`flatmap-stream`には、公開されたnpmパッケージの`index.min.js`にのみ悪意のあるコードが含まれていました。ソースリポジトリ自体が侵害されることは稀であり、攻撃者は公開されたパッケージにコードを隠す必要があります。VCSから直接取得することで、この「公開パッケージへの不正注入」という攻撃経路を回避できるのです。

VCSから直接依存関係を取得することは、コードの変更履歴を`git log -p old..new`のようなコマンドで容易に確認できるため、監査も容易になります。このアプローチは、ソフトウェア開発における信頼性と安全性を高めるための、一つの有効な手段と言えるでしょう。


関連記事


参考にした情報源: arp242.net

コメント

タイトルとURLをコピーしました