コンテナ中でVCS Stampingが失敗する話

こんにちは、garsueです。最近、手元の開発環境を一新していて遭遇したちょっとした小ネタを紹介します。同じ問題に遭遇する人もいそうな気がするので参考になれば幸いです。

事象: DockerにマウントしたGoのプロジェクトでビルドがコケる

当社の開発環境では開発中のコードをDockerのコンテナにマウントしてコンテナ中でビルドしています。その際に一部のコンテナで以下のエラーとともにビルドが失敗していました。

error obtaining VCS status: exit status 128
Use -buildvcs=false to disable VCS stamping.

VCS StampingはGo 1.18から追加された機能で、Gitなどのバージョンコントロールシステムからリビジョン番号などを取得してバイナリに埋め込む機能です。

エラーの詳細としては exit status 128 としか表示されておらず、なぜ失敗しているのか上記のエラーだけではパッとはわかりませんでした。

なお、単にエラーが起きないようにするだけならエラーメッセージにあるようにビルドオプションに -buildvcs=false を追加すればいいだけです。大抵の場合、開発途中では不要かと思います。1

VCS Stampingのコードを見る

エラーメッセージ error obtaining VCS status: を手がかりに、Goのコードを追ってみると、以下の関数が見つかりました。

https://github.com/golang/go/blob/6f597a8a9370e1389399520d721b594277a6766b/src/cmd/go/internal/load/pkg.go#L2442-L2444

どうやらVCSのコマンド(ここではGit)の実行時エラーを埋め込んでいて、exit status 128はGitの終了コードのようです。

そこで問題の起きているコンテナ内で直接Gitコマンドを実行してみます。

# git status
fatal: detected dubious ownership in repository at '/go/src/github.com/garsue/xxx'
To add an exception for this directory, call:

        git config --global --add safe.directory /go/src/github.com/garsue/xxx
# echo $?
128

再現しました。 dubious ownership とはなんでしょうか。

CVE-2022-24765

調べてみると、以下でアナウンスされた脆弱性CVE-2022-24765に対するセキュリティとして導入された機能でした。

https://github.blog/2022-04-12-git-security-vulnerability-announced/

複数ユーザーで使っている共有マシンや共有ディレクトリ上で他人のリポジトリを操作する際、Gitの設定を経由して任意のコマンドを実行させらてしまうという脆弱性です。

今回の場合、Dockerコンテナ内でGitを実行していますが、リポジトリのオーナーはホストマシン側のユーザーになっているため dubious ownership となっていたということがわかりました。

感想など

ちょっとエラーがわかりにくくてつらいですね(笑)

実行したVCSのコマンドがエラーで終了した場合の標準エラー出力をある程度拾ってエラーメッセージに埋めるなどできるとみんな幸せになれそうな気がしました。


  1. 逆にCI環境などリリースする成果物としてビルドする際はVCS Stampingを活用することをおすすめします。 [return]