説明
Dockerfile でリモートファイルをダウンロードする際、入手元と整合性を検証しないと、改ざんされたファイルをイメージに含めるおそれがあります。HTTPS は通信を保護しますが、期待したアーティファクトであることまでは確認しません。
ADD 自体が誤った選択ではありません。対応する Dockerfile では、ADD --checksum でリモート HTTP ファイルの SHA-256 を検証できます。curl や wget で取得した場合も検証が必要です。
想定される影響
- 改ざんされた実行ファイルや設定がイメージに含まれ、実行時に使われるおそれがあります。
- URL の内容が更新されると、同じ Dockerfile でもビルド結果が変わる場合があります。
対処方法
- 信頼できる配布元を使い、期待するチェックサムや署名を独立して確認したうえで、取得したファイルを検証してください。
- ADD --checksum または明示的なダウンロード・検証コマンドを使い、検証失敗時はビルドを停止してください。必要な展開処理と一時ファイル削除も明示してください。
例
JAVA_BUILD_IMAGE ビルド引数には、tar を備えたサポート中の Linux Java ベースイメージを指定してください。非推奨となった openjdk イメージを入力に置き換えています。example.com の URL とチェックサムは例示用なので、実際の入手元と検証済みの値に変更してください。
変更前
dockerfile
ARG JAVA_BUILD_IMAGE
FROM ${JAVA_BUILD_IMAGE}
ADD https://example.com/app.tar.gz /opt/app/
変更後
dockerfile
ARG JAVA_BUILD_IMAGE
FROM ${JAVA_BUILD_IMAGE}
ADD --checksum=sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
https://example.com/app.tar.gz /tmp/app.tar.gz
RUN mkdir -p /opt/app \
&& tar -xzf /tmp/app.tar.gz -C /opt/app \
&& rm /tmp/app.tar.gz
補足:
- 変更前: チェックサムを検証せずに取得します。この ADD はリモートのアーカイブを自動展開しません。
- 変更後: ADD --checksum で検証してから明示的に展開し、一時ファイルを削除します。例示用チェックサムをそのまま使用しないでください。