본문 바로가기

4-1. 2026-2 심화 스터디/CVE 취약점 분석

CVE 취약점 분석 - 2주차

환경 구축

0. 최종 배포 구성

배포 파일 cve-2025-3248-langflowmaster-1.2.tar.gz Docker Image 저장본 (약 659 MB)

실행 설정 docker-compose.yml Victim 컨테이너 및 외부 네트워크 연결
재빌드 설계도 Dockerfile Langflow 1.2.0 + 분석 도구 설치
설명서 MASTER-ENVIRONMENT.md 환경 목적/실행 절차/검증 방법
무결성 검증 SHA256SUMS.txt 배포 파일 SHA-256 검증값
현재 서비스 cve-2025-3248-langflow 127.0.0.1:7860 -> 컨테이너 7860

1. 구축 목표와 범위

  • 목표: CVE-2025-3248 분석을 위해 부원들이 동일한 Langflow 취약 환경에서 시작할 수 있도록 Victim 쪽 Master Image 만드는 것이다.
  • *공격자 환경은 별도 컨테이너로 구성하기 때문에 Master Image에는 포함하지 않았다.
  • 구성
    • 기준 애플리케이션: Langflow 1.2.0
    • 기준 호스트: Ubuntu 24.04 LTS 계열, x86_64 / amd64
    • 컨테이너: Docker 기반 단일 Victim 컨테이너
    • 공유 네트워크: cve-2025-3248-net (external)
    • 호스트 포트: 127.0.0.1:7860:7860 - 호스트에서만 직접 접근
    • 컨테이너 간 통신: 같은 Docker network에 붙은 컨테이너는 cve-2025-3248-langflow:7860으로 접근 가능
    • 분석 도구: curl, jq, ps, ss, netstat, lsof, ping, nc, vim.tiny, less, file, unzip 등
    *Victim 과 Attacker 분리 이유
      ㄴ>  Master는 정상적으로 재현되는 취약 Victim에 집중, Attacker는 다른 팀원이 별도로 구성했다.
             공격 트래픽/도구/로그를 Victim 과 분리해서 관찰하기 쉽고 여러 공격 시나리오를 같은 Master 환경에 반복해서 적용할 수 있다.

2. Master VM 전체 구조

[VMware Ubuntu 24.04 / amd64]
       |
       +-- Docker Engine 29.8.1
       |
       +-- Docker Network: cve-2025-3248-net (bridge, external)
       |        |
       |        +-- cve-2025-3248-langflow (Victim)
       |                |
       |                +-- Langflow 1.2.0
       |                +-- Python 3.12.3
       |                +-- Debian 12 (bookworm)
       |                +-- 분석용 CLI 도구
       |                +-- container port 7860
       |
       +-- host publish: 127.0.0.1:7860 -> 7860
  • 설계
    • 브라우저: http://127.0.0.1:7860으로 UI 확인
    • 같은 Docker network의 다른 컨테이너: 컨테이너 이름 기반 DNS인 http://cve-2025-3248-langflow:7860으로 접근
    • 외부 PC가 호스트의 7860 포트로 직접 접근하지 못하도록 포트 publish를 127.0.0.1에 묶음

3. 기반 이미지 선택 및 환경 준비

처음부터 Langflow 를 소스에서 직접 설치하는 대신 공식 Docker 이미지를 기반으로 커스텀 Master Image 만들었다.

docker pull langflowai/langflow:1.2.0
docker image inspect langflowai/langflow:1.2.0 \\
 --format '{{index .RepoDigests 0}}'
  • 실제 검증 결과
    • 기준 이미지의 Langflow는 1.2.0, Python은 3.12.3, 컨테이너 OS는 Debian GNU/Linux 12(bookworm)
    • 기본 실행 사용자는 uid 1000의 user, 실제 그룹은 root(gid 0)

4. Master Image 추가

Langflow 자체는 공식 1.2.0 이미지에 맡기고 취약점 분석 중 자주 사용할 진단/네트워크/파일 확인 도구를 이미지 안에 넣었다.

FROM langflowai/langflow:1.2.0@sha256:1e9cfdb0e1565b1187bdd3c6849493ecbd81627645214ab0537d7cbcdbdb454a

USER root

RUN apt-get update \\
    && apt-get install -y --no-install-recommends \\
        curl jq procps iproute2 net-tools lsof iputils-ping \\
        netcat-openbsd vim-tiny less ca-certificates file unzip \\
    && rm -rf /var/lib/apt/lists/*
RUN mkdir -p /opt/cve-2025-3248-lab \\
    && chown -R 1000:0 /opt/cve-2025-3248-lab
USER user
WORKDIR /app
EXPOSE 7860
CMD ["langflow", "run"]

*/opt/cve-2025-3248-lab: 실습/분석 파일을 둘 수 있는 위치로 만듦, user가 쓸 수 있도록 권한 조정

5. 이미지 3개 (1.0, 1.1, 1.2)

세 개의 태그는 같은 이미지를 불필요하게 여러 번 만든 것이 아닌 구축 과정에서 발견한 문제를 단계적으로 해결하고 최종 재현성 확보를 위한 버전 기록이다.

태그 역할 내용 검증/변경 이유
1.0 최초 Master 후보 Langflow 1.2.0 + 분석 도구 + Healthcheck를 포함한 첫 커스텀 이미지 user:user chown 오류를 uid/gid 기반인 1000:0 으로 바로잡음 Healthcheck 때문에 curl 프로세스가 [curl] <defunct>로 남는 현상이 관찰됨
1.1 안정화 버전 Healthcheck를 제거하고 동일한 분석 도구/권한 구성을 유지 컨테이너, UI, API, 내부 DNS 통신 검증 ps aux에서 Healthcheck 관련 curl 좀비가 사라졌고 Langflow 프로세스만 정상적으로 유지됨
1.2 최종 배포 후보 1.1 의 안정적인 구성을 유지하면서 FROM에 공식 base image의 정확한 digest 를 함께 고정 태그 1.2.0 만 바라보지 않고 당시 사용한 정확한 base layer 명시해 재현성 강화

*바로 1.2만 만들지 않은 이유

       실제 실행 중 발생한 문제를 로그/프로세스로 확인하고 수정한 과정을 남기는 것이 중요하다.
             1.0 → 1.1: Healthcheck가 만든 불필요한 흔적 제거하는 운영 안정화 단계
             1.1 → 1.2: 최종 배포본의 재현성을 강화하는 단계

6. Docker Network, Docker Compose

Victim과 Attacker 분리하되 서로 통신할 수 있어야 한다.

→ cve-2025-3248-net이라는 user-defined bridge network 만들고 Compose에서는 이 네트워크를 external: true로 참조하도록 했다.

langflow:
   image: cve-2025-3248-langflow-master:1.2
   container_name: cve-2025-3248-langflow
   ports:
     - "127.0.0.1:7860:7860"
   networks:
     - cve-2025-3248-net

networks:
   cve-2025-3248-net:
   external: true
   name: cve-2025-3248-netlangflow:
   image: cve-2025-3248-langflow-master:1.2
   container_name: cve-2025-3248-langflow
   ports:
     - "127.0.0.1:7860:7860"
   networks:
     - cve-2025-3248-net

networks:
   cve-2025-3248-net:
   external: true
   name: cve-2025-3248-net

*external 네트워크로 만든 이유
       향후 Attacker 컨테이너를 같은 네트워크에 추가하기 위함
        docker compose down 실행해도 이 네트워크 자체는 Compose가 제거하지 않음 → 네트워크를 실습 인프라의 공통 연결 지점으로 사용할 수 있음

7. 정리

2주차 활동은 선정한 CVE-2025-3248의 PoC를 위해 팀 전체가 통일된 환경 구축하기 위한 Master VM을 구축했다. 이후 해당 구축된 환경을 토대로 CVE 취약점 분석을 진행할 예정이다. 추가적으로 attacker docker도 구축하여 CVE 취약점 분석을 진행할 예정이다.

'4-1. 2026-2 심화 스터디 > CVE 취약점 분석' 카테고리의 다른 글

CVE 취약점 분석 - 1주차  (0) 2026.10.08