설명
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으로 내용을 검증한 뒤 명시적으로 압축을 풀고 임시 파일을 지웁니다. 예시 체크섬을 그대로 사용해서는 안 됩니다.