
パッケージマネージャのGit引数インジェクション脆弱性と --end-of-options フラグ
調査対象の19個のパッケージマネージャのうち17個がGitバイナリをフォークしており、そのうち --end-of-options を一貫して使用しているのはGoの cmd/go だけであることが判明した。大多数のパッケージマネージャは CVE 開示後に対応している。
Andrew Nesbitt は、Git の --end-of-options フラグがパッケージマネージャの引数インジェクション脆弱性の防止において果たす役割を調査した。2026年7月の報告によると、調査対象の19個のパッケージマネージャのうち17個がGitバイナリをフォークしているが、一貫して --end-of-options を使用しているのは Go の cmd/go のみである。ほとんどのパッケージマネージャは -- または先頭ダッシュチェックを採用しており、多くの場合は CVE 開示後の対応となっている。
--end-of-options の導入と対応状況
--end-of-options フラグは 2019年11月に Git 2.24.0 で追加された。しかし、サブコマンドごとの段階的な実装となり、git rev-parse は 2.30.0(2020年2月)まで対応しなかった。git checkout と git reset は 2024年2月の 2.43.1 まで --end-of-options を拒否していた。
Goは2019年6月に一般的なセキュリティ強化の一環として、リポジトリ URL の前に -- を追加した。しかし2026年1月、CVE-2025-68119 の修正として --end-of-options をすべてのコマンドに追加する必要があった。Go のコミットメッセージは「今後このような問題が再び導入されないようにするため、より構造的な変更を検討すべきだが、ひとまずこれで問題に対応している」と述べられている。
パッケージマネージャの防御メカニズム
調査対象19個のうち17個がGitバイナリをフォークし、2個がライブラリをデフォルトとしている。Cargo は libgit2 を使用しているが、opt-in の net.git-fetch-with-cli 設定でフォークに切り替え可能である。Poetry は 1.2.0 で dulwich に移行し、system-git-client 設定でフォールバック可能である。Nix はローカルリポジトリ読み込みに libgit2 を使用するが、フェッチ時はGitをフォークしている。
過去に開示された脆弱性には、CVE-2021-43809(Bundler)、CVE-2021-29472 および CVE-2022-24828(Composer)、CVE-2022-36069(Poetry)、CVE-2023-5752(pip)、CVE-2022-21223 および CVE-2022-24440(CocoaPods)、CVE-2025-68119(Go)がある。Bundler の CVE-2021-43809 修正として git clone に -- が追加され、cocoapods-downloader は 2022年3月に先頭ダッシュ拒否を3つのコミットで実装した。Poetry の防御は2021年9月に追加され、1年後に CVE が割り当てられている。
Git バージョン互換性の課題
Homebrew は Linux での最小Git要件を 2.7.0(2018年設定)としており、vcpkg のGit統合は 2.7.4 を最小バージョンとしている。一方、Amazon Linux 2 にパッケージされていた 2.14.3 は先月でサポート終了となった。Ubuntu 18.04(git 2.17.0、2028年まで拡張サポート)と Ubuntu 20.04(git 2.25.1、2030年まで拡張サポート)では互換性に差がある。Ubuntu 20.04 の git 2.25.1 は git fetch で --end-of-options を受け入れるが、git rev-parse では拒否する。
Nesbitt は Homebrew に対して最小Git要件を 2.30.0 に引き上げ、--end-of-options ガードを追加するプルリクエストを開いている。
Git実装ライブラリの選択肢
libgit2、gitoxide、go-git、JGit、dulwich はいずれも十分な Git ワイヤプロトコル実装を備え、インプロセスでのクローンとフェッチが可能である。Jujutsu は gitoxide を Git 相互運用に使用しており、引数インジェクション関連の公開CVEは報告されていない。同プロジェクトの2つのセキュリティ勧告はパストラバーサルと継承された SHA-1 衝突検出欠落である。go-git は引数インジェクション関連の CVE として CVE-2025-21613 があり、これは file:// トランスポート特有の問題である。
筆者の見立て
- 引数インジェクション失敗モードはシェルが関与しないため、コマンドインジェクションと区別されるべきと論じている
- -- と --end-of-options を相互交換可能と扱うことは誤りと指摘している
- Git ライブラリを利用することは異なる問題に置き換わることになると解釈している。バンドル版の Git 実装は、上流の Git がリリースするすべてのチェックアウト安全性修正を追跡する必要があるため
- 最小Git要件を 2.30.0、checkout と reset について 2.43.1 に引き上げることは、配布パッケージ版 Git を使用している利用者を失う可能性を示唆している
- -- メカニズム自体は本質的に安全性の低い設計であり、それを含まないコードは正しく見え、引数がダッシュで始まるまで正常に機能すると論じている
この記事は元記事の事実のみに基づいて自動生成されました。
出典
Andrew Nesbitt、「–end-of-options」、https://nesbitt.io/2026/07/21/end-of-options.html