[Docker] 이미지 CVE 대응 정리 CVE-2025-69720, CVE-2025-32434 (python:3.9-slim, PyTorch)

2026. 4. 3. 23:14·개발 (Development)/Docker

문제 정의

Docker 이미지 스캔 과정에서 여러 CVE가 발견되었고, 이를 해결하는 과정에서 다음과 같은 질문이 발생했습니다.

  • base image 문제인지, 라이브러리 문제인지 어떻게 구분할까?
  • apt-get install -y --no-install-recommends는 왜 쓰는 걸까?
  • CVE-2025-32434는 왜 발생했고 어떻게 해결해야 할까?
  • requirements.txt에서는 무엇을 바꿔야 할까?

결론적으로 이번 문제는 OS 패키지와 Python 패키지 취약점을 구분하고 각각 다른 방식으로 해결하는 과정이 핵심이었습니다.

1. 문제의 시작: CVE 탐지

사용 중인 base image는 아래와 같았습니다.

python:3.9.12-slim

이미지 스캔 결과 여러 취약점이 발견되었고, 처음에는 base image 문제로 판단했지만 분석 결과 취약점 종류에 따라 해결 방법이 완전히 다르다는 것을 알게 되었습니다.

2. 취약점 유형 구분 (핵심 포인트)

문제를 해결하기 위해 가장 먼저 정리한 기준은 다음과 같습니다.

구분 해결 방법
OS 패키지 취약점 apt (update, upgrade, purge)
Python 패키지 취약점 pip (requirements 수정)

이걸 구분하지 않으면 계속 엉뚱한 방향으로 대응하게 됩니다.

3. OS 패키지 관련 대응

초기에 발견된 취약점 중 일부는 Debian 패키지 기반이었습니다.

이 경우 접근 방식은 다음과 같습니다.

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y --no-install-recommends 패키지 \
    && rm -rf /var/lib/apt/lists/*

여기서 중요한 질문이 하나 있었습니다.

Q. --no-install-recommends는 왜 쓰는가?

A. 필수 패키지만 설치하고 불필요한 패키지를 제거하기 위함입니다.

패키지는 다음과 같이 나뉩니다.

  • Depends: 필수
  • Recommends: 권장 (기본 설치됨)
  • Suggests: 선택

이 옵션을 사용하면:

  • 이미지 용량 감소
  • 공격 표면 감소 (CVE 감소)
  • 빌드 속도 개선

즉, Docker에서는 사실상 필수 옵션입니다.

4. 핵심 문제: CVE-2025-32434

문제를 계속 추적하다 보니, 이번 이슈의 핵심은 OS가 아니라 PyTorch였습니다.

기존 requirements.txt 일부는 아래와 같았습니다.

--find-links https://download.pytorch.org/whl/torch_stable.html
torch==2.0.0+cpu
torchvision==0.15.1+cpu
torchaudio==2.0.1

여기서 질문이 생겼습니다.

Q. 왜 이게 문제인가?

A. torch==2.0.0은 취약 버전이기 때문입니다.

CVE-2025-32434는 PyTorch에서 발생하는 취약점이며,
2.5.1 이하 버전에서 영향, 2.6.0에서 패치되었습니다.

5. 해결 방법: PyTorch 업그레이드

문제 정의 이후 해결 방법은 명확했습니다.

기존

torch==2.0.0+cpu
torchvision==0.15.1+cpu
torchaudio==2.0.1

변경

--index-url https://download.pytorch.org/whl/cpu
torch==2.6.0
torchvision==0.21.0
torchaudio==2.6.0

핵심은 단순히 torch만 올리는 것이 아니라
버전 호환 세트를 맞추는 것입니다.

6. Q. --index-url은 꼭 필요할까?

이 부분도 중요한 고민 포인트였습니다.

결론

👉 Docker 환경에서는 유지하는 것이 안전

이유

  • PyTorch는 일반 PyPI보다 전용 wheel 저장소 사용이 안정적
  • CPU/GPU 환경에 따라 wheel이 다름
  • 잘못된 wheel 설치 방지

따라서 아래 구조 유지가 가장 안정적입니다.

--index-url https://download.pytorch.org/whl/cpu

7. 추가로 발견한 문제

requirements.txt를 정리하는 과정에서 아래 문제가 있었습니다.

PyYAML==6.0
PyYAML

해결

PyYAML==6.0

중복 선언은 제거하는 것이 안전합니다.

8. 최종 requirements.txt

최종적으로 정리된 파일은 다음과 같습니다.

--index-url https://download.pytorch.org/whl/cpu
torch==2.6.0
torchvision==0.21.0
torchaudio==2.6.0
fastapi==0.95.0
pandas==2.2.2
uvicorn==0.21.1
pytest==7.1.1
tqdm==4.64.0
requests==2.27.1
psycopg2-binary==2.9.5
scikit-learn==1.3.0
numpy==1.26.4
PyYAML==6.0
lmdb==1.4.1
kafka-python==2.0.2
python-dotenv
boto3==1.40.40
shap==0.49.1
SQLAlchemy==2.0.45

9. 결과 확인

Docker 캐시 때문에 반드시 캐시 없이 재빌드해야 합니다.

docker build --no-cache -t your-image .

설치된 버전 확인:

python -c "import torch, torchvision, torchaudio; print(torch.__version__, torchvision.__version__, torchaudio.__version__)"

정상 출력:

2.6.0 0.21.0 2.6.0

10. 결과 및 출력

  • PyTorch 취약점 제거
  • CVE-2025-32434 해결
  • 불필요 패키지 정리
  • requirements 구조 개선

11. 응용 및 팁

1) CVE는 무조건 base image 문제가 아니다

→ Python 패키지일 가능성도 항상 확인

2) Docker는 최소 설치가 핵심

→ --no-install-recommends 적극 활용

3) ML 라이브러리는 버전 호환이 중요

→ torch / torchvision / torchaudio 세트로 관리

4) requirements.txt 정리는 필수

→ 중복, 불필요 패키지 제거

반응형

'개발 (Development) > Docker' 카테고리의 다른 글

Docker 빌드 시 adoptopenjdk/openjdk11:jre HIGH 취약점 해결 방법  (0) 2026.01.25
[Docker/Java] Java 기반 Docker 이미지에서 SQLite 관련 취약점 제거 방법 (CVE-2025-6965)  (4) 2025.08.15
[Docker] Docker 환경에서 yarn 설치 시 인증서 오류 해결  (0) 2025.06.01
[Docker] on-premise 환경에서 Docker Compose의 Build 문제 해결  (0) 2025.06.01
[Docker] Alpine 이미지 SSL 인증 오류 해결 (certificate verify failed)  (0) 2025.06.01
'개발 (Development)/Docker' 카테고리의 다른 글
  • Docker 빌드 시 adoptopenjdk/openjdk11:jre HIGH 취약점 해결 방법
  • [Docker/Java] Java 기반 Docker 이미지에서 SQLite 관련 취약점 제거 방법 (CVE-2025-6965)
  • [Docker] Docker 환경에서 yarn 설치 시 인증서 오류 해결
  • [Docker] on-premise 환경에서 Docker Compose의 Build 문제 해결
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (249) N
      • 개발 (Development) (181)
        • Algorithm (1)
        • Angular (1)
        • AWS (7)
        • DeepSeek (2)
        • Docker (9)
        • Git (3)
        • Java (41)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (7)
        • PostgreSQL (40)
        • Python (35)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (11)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (12)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Linux
    DevOps
    자바
    Vue.js
    리눅스 마스터 2급
    docker
    백준온라인저지
    javascript
    리눅스 마스터 2급 2차
    PostgreSQL
    데이터분석
    JSON
    springboot
    python
    Kafka
    JPA
    AWS
    pandas
    파이썬
    백준
    Kubernetes
    ADsP
    오답노트
    java
    Linux master
    Spring
    deepseek
    백준자바
    MyBatis
    백준알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[Docker] 이미지 CVE 대응 정리 CVE-2025-69720, CVE-2025-32434 (python:3.9-slim, PyTorch)
상단으로

티스토리툴바