포스트

[Podman] Podman을 사용한 이미지 패치

[Podman] Podman을 사용한 이미지 패치

최근 OpenSSL 관련 심각한 취약점이 발생했습니다. (CVE-2025-1546)

  • CVE-2025-15467은 OpenSSL 라이브러리에서 발생하는 스택 버퍼 오버플로우(Stack Buffer Overflow) 취약점으로 CMS(Cryptographic Message Syntax)의 AuthEnvelopedData 구조를 파싱할 때 Initialization Vector (IV)의 값 검증 미흡으로 원격 공격자가 조작된 CMS 메시지를 전송하여 원격 코드 실행(RCE) 가능(CVSS 9.8)

이를 위해 로컬에서 Podman에 대한 간략한 설명과 Podman을 사용해 취약 이미지를 복구하는 과정을 설명합니다.

Podman이란

Podman(Pod Manager)은 컨테이너를 실행하고 관리하는 도구입니다. Docker Desktop과 거의 동일합니다.

다만 Docker가 기존 dockerd라는 프로그램(Daemon)이 메모리에 계속 떠있으면서 점유율을 차지하는것과 달리 Podman은 별도의 Deamon이 없어 낮은 시스템 점유율만을 사용하는 특징이 있습니다.

왜 Docker Desktop을 사용하지 않은건가요?
-> Docker Desktop은 기업에서 사용하면 유료입니다. 하지만 Podman은 오픈소스이기에 완전무료입니다.

컨테이너 같은 기술은 대부분 Linux 기반 환경에서만 사용할 수 있습니다. 그렇기에 Window 환경에서 이런 도구를 사용할려면 Linux 환경이 필요합니다.

WSL

WSL (Windows Subsystem for Linux)

기존에 VMWare같은 가상머신 도구는 아래와 같은 구조로 이루어져있었습니다.

1
2
3
4
5
6
7
Windows 컴퓨터
└─ VirtualBox 설치
   └─ Ubuntu Linux 전체를 가상으로 설치
      - 부팅 시간: 1~2분
      - 메모리 사용: 2~4GB
      - 디스크 사용: 20~50GB
      - Windows와 완전히 분리됨

단점:

  • 무겁다 (컴퓨터 리소스 많이 사용)
  • 느리다 (Linux 부팅 기다려야 함)
  • 파일 공유 불편 (Windows ↔ Linux 간 파일 이동이 복잡)

이런 불편함을 WSL2은 아래와 같이 변경하여 개선하였습니다.

1
2
3
4
5
6
7
Windows 컴퓨터
└─ WSL 2 (경량 가상화)
   └─ Linux Kernel만 실행
      - 시작 시간: 1~2초
      - 메모리 사용: 필요한 만큼만 (동적 할당)
      - 디스크: 경량 (수 GB)
      - Windows와 긴밀히 통합

장점:

  • ✅ 빠르다! (거의 즉시 시작)
  • ✅ 가볍다! (필요한 만큼만 리소스 사용)
  • ✅ 편하다! (Windows 파일 시스템 바로 접근 가능)

다만 WSL1의 경우 호환성 문제로 별로 사용하지 않고, 실제 WSL2를 사용하는게 정신건강에 좋습니다.

즉 정리하면 WSL2를 통해 Window내 경량 Linux 환경을 만들고 그곳에 Podman machine을 기동시켜서 사용하는 원리입니다.

동작 원리

1
2
3
4
5
6
7
8
9
10
11
12
13
1. podman machine init 실행
   ↓
2. WSL에 "podman-machine-default"라는 이름의 Linux VM 생성
   - Fedora CoreOS 기반
   - Podman 엔진 미리 설치됨
   - 최소한의 구성요소만 포함 (경량)

3. podman machine start 실행
   ↓
4. 이 VM이 시작되고, SSH 서버가 켜짐
   - 포트: 127.0.0.1:64560

5. Windows의 Podman CLI가 SSH로 이 VM에 명령 전달

WSL & Podman 실행

WSL과 Podman을 설치 되었다고 가정합니다.

  • Podman 설치 파일 사용
  • WSL2 윈도우 시스템 활성화

Podman 초기화

최초 1회 Podman 초기화 작업이 필요합니다.

1
podman machine init

초기화 되었다면 Machine의 상태를 확인합니다.

1
2
3
C:\Users\>podman machine list
NAME                     VM TYPE     CREATED       LAST UP         CPUS        MEMORY      DISK SIZE
podman-machine-default*  wsl         6 months ago  17 minutes ago  0           0B          5.909GiB

Podman을 시작합니다.

1
2
3
4
5
C:\Users\>podman machine start
Starting machine "podman-machine-default"
This machine is currently configured in rootless mode. If your containers
(... 생략)
Machine "podman-machine-default" started successfully

Currently running을 확인합니다.

1
2
3
4
C:\Users\
C:\Users\>podman machine list
NAME                     VM TYPE     CREATED       LAST UP            CPUS        MEMORY      DISK SIZE
podman-machine-default*  wsl         6 months ago  Currently running  16          312.7MiB    5.909GiB

Window와 Podman간의 연결을 확인합니다.

1
2
3
4
C:\Users\>podman system connection list
Name                         URI                                                          Identity                                       Default
podman-machine-default       ssh://user@127.0.0.1:64560/run/user/1000/podman/podman.sock  C:\Users\\.ssh\podman-machine-default  true
podman-machine-default-root  ssh://root@127.0.0.1:64560/run/podman/podman.sock            C:\Users\\.ssh\podman-machine-default  false

정상적으로 Podman이 실행되었다면 이미지 저장소로부터 이미지를 가져와 보겠습니다.

1
C:\Users\>podman pull --tls-verify=false myimageregisty.azurecr.io/alpine/java:17

원격 저장소로부터 가져온 이미지를 확인

1
2
3
C:\Users\>podman images
REPOSITORY                                  TAG         IMAGE ID      CREATED        SIZE
myimageregisty.azurecr.io/alpine/java  17          c6b1a03c388c  18 months ago  320 MB

이슈 기록

SSH 연결 실패

1
2
Cannot connect to Podman...
dial tcp 127.0.0.1:64560: connectex: No connection could be made

너무 오래된 Podman VM 사용으로 설정이 꼬인것으로 추정

기존 Podman machine 일괄 삭제 후 다시 초기화로 해결

1
2
3
podman machine stop
podman machine rm -f
podman machine init --cpus 4 --memory 8192 --disk-size 50 --now

Podman 사용하여 Openssl 업데이트하기

Podman 이미지 실행 및 안에 들어가기

1
podman run -it --name user myimageregisty.azurecr.io/alpine/java:17 sh

openssl 버전 확인

1
openssl version

apk update 시 https 오류 발생

openssl 취약점을 조치하기 위함이지만.. openssl 이슈로 인해 조치를 못하는 상황??

1
apk update

임시로 http 통신으로 변경

1
2
echo "http://dl-cdn.alpinelinux.org/alpine/v3.20/main" > /etc/apk/repositories
echo "http://dl-cdn.alpinelinux.org/alpine/v3.20/community" >> /etc/apk/repositories

openssl 업데이트 관련 라이브러리까지 함께 업데이트 (openssl libssl3 libcrypto3)

1
apk upgrade openssl libssl3 libcrypto3

업그레이드 후 openssl 버전 확인

1
openssl version

현재 image 상태 그대로 커밋

1
podman commit user myimageregisty.azurecr.io/alpine/java:17-patched

이미지 재 태깅

1
podman tag myimageregisty.azurecr.io/alpine/java:17-patched myimageregisty/alpine/java:17-openssl

원격 저장소로 새로운 이미지를 push하면서 취약점이 조치된 이미지를 사용할 수 있게 되었습니다.

1
podman push myimageregisty/alpine/java:17-openssl
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.