gosu は、go で記述された su/sudo のコンテナ対応代替です。これは 当社の本番イメージの 1 つであるベースイメージ に含まれており、https://nvd.nist.gov/vuln/detail/CVE-2025-68121. を引き起こします。
すべての Golang ベースの静的リンク実行ファイルに関する一般的な考慮事項 #
静的リンクされた golang プログラムの CVE は、次の 2 つの原因に由来します。
- ソフトウェア自身のコード。これは従来のソフトウェア CVE です。
- golang 標準 SDK。公式発表。これらの CVE は、特定の実行ファイルのビルドに使用されたツールチェーンに存在します。
多くの場合、原因は Golang SDK にあり、このような CVE の修正は、プログラムを最新の Golang SDK で再ビルドするだけで済みます。
ここでは例として gosu を使用しますが、任意の静的リンク実行ファイルについて考えることができます。
#!/bin/bash
set -eux
CONT_NAME=tmp_mysqlcontainer
docker create --pull=always --name $CONT_NAME mysql:latest
docker cp $CONT_NAME:/usr/local/bin/gosu /tmp/gosu
docker run -it --rm -v /tmp/gosu:/tmp/gosu golang:latestそして docker 内では次のようになります。
ldd /tmp/gosu/gosu
# not a dynamic executable
go version /tmp/gosu/gosu
# /tmp/gosu/gosu: go1.24.6すべての golang バージョン 1.24.13 未満に影響する https://nvd.nist.gov/vuln/detail/CVE-2025-68121 のため、このプログラムが脆弱な golang ツールチェーンでビルドされていることは確実です。
実環境での問題 #
ソフトウェアのメンテナーの中には、バイナリリリースを継続的に再ビルドすることを拒む人がいます。
主な主張は、自身のコードが影響を受ける golang 標準ライブラリを呼び出していないというものです。
公式の CVE チェッカー golang.org/x/vuln/cmd/govulncheck@latest は、プログラムをビルドした単純な golang バージョン番号ではなく、関数呼び出し経路に基づいて CVE を報告します。
go run golang.org/x/vuln/cmd/govulncheck@latest -mode=binary /tmp/gosu/gosu
# === Symbol Results ===
#
# No vulnerabilities found.
#
# Your code is affected by 0 vulnerabilities.
# This scan also found 2 vulnerabilities in packages you import and 31
# vulnerabilities in modules you require, but your code doesn't appear to call
# these vulnerabilities.
# Use '-show verbose' for more details.この主張には合理性がありますが、作業環境のセキュリティポリシーによっては、これで問題を回避できる場合もあれば、できない場合もあります。
修正方法 #
迅速に修正するには、不要であれば
gosuを削除します。dockerfileRUN rm /usr/local/bin/gosuそうでなければ、イメージが正常に動作するためにそのようなバイナリを必要とするため、難しい方法を取ることになります。任意の静的リンク実行ファイルに対する一般的な修正方法として、最新の golang SDK を使い、自分でソースからビルドします(イメージの CICD パイプラインまたは Dockerfile の一部として実行するなど)。多くの場合、golang の専門家ではない状態で、コンテナ化したシステムが go と無関係であるにもかかわらず、golang に関係する CVE だけを手早く修正したいはずです。そのためには追加の作業が必要なので、幸運を祈ります。
参考資料:
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)