Golang ベースの静的リンク実行ファイルの CVE の修正

最終更新: 2023-11-09 07:27:26 +0800 +0800
tags: Cve | Docker
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

gosu は、go で記述された su/sudo のコンテナ対応代替です。これは 当社の本番イメージの 1 つであるベースイメージ に含まれており、https://nvd.nist.gov/vuln/detail/CVE-2025-68121. を引き起こします。

すべての Golang ベースの静的リンク実行ファイルに関する一般的な考慮事項 #

静的リンクされた golang プログラムの CVE は、次の 2 つの原因に由来します。

  1. ソフトウェア自身のコード。これは従来のソフトウェア CVE です。
  2. golang 標準 SDK。公式発表。これらの CVE は、特定の実行ファイルのビルドに使用されたツールチェーンに存在します。

多くの場合、原因は Golang SDK にあり、このような CVE の修正は、プログラムを最新の Golang SDK で再ビルドするだけで済みます。

ここでは例として gosu を使用しますが、任意の静的リンク実行ファイルについて考えることができます。

sh
#!/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 内では次のようになります。

sh
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 を報告します。

sh
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 を削除します。

    dockerfile
    RUN rm /usr/local/bin/gosu
  • そうでなければ、イメージが正常に動作するためにそのようなバイナリを必要とするため、難しい方法を取ることになります。任意の静的リンク実行ファイルに対する一般的な修正方法として、最新の golang SDK を使い、自分でソースからビルドします(イメージの CICD パイプラインまたは Dockerfile の一部として実行するなど)。多くの場合、golang の専門家ではない状態で、コンテナ化したシステムが go と無関係であるにもかかわらず、golang に関係する CVE だけを手早く修正したいはずです。そのためには追加の作業が必要なので、幸運を祈ります。

参考資料:

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)