펜리젠트 헤더

CVE-2025-4517 실제 자동화에서 신뢰의 경계를 무너뜨리는 파이썬 타르 추출 버그

엔지니어들이 CVE-2025-4517을 계속 사용하는 이유

누군가 검색할 때 "cve-2025-4517"에서는 일반적으로 상식을 배우는 것이 아니라 운영 관련 질문에 답하려고 합니다:

  • 지금 내가 취약한가요? 어떤 Python 버전, 어떤 API, 어떤 매개변수. (CVE)
  • 실제 경계가 무너진 것일까요, 아니면 양성 에지 케이스일까요? 특히: 추출을 통해 대상 디렉터리를 벗어나 다른 곳에 쓸 수 있습니다. (CVE)
  • 파이썬 3.14에서 "필터=데이터"는 무엇을 변경하며 왜 중요한가요? 기본값이 바뀌고 있고 '기본값으로 안전하다'는 것은 움직이는 목표이기 때문입니다. (파이썬 개선 제안(PEP))
  • 문제를 해결했다는 것을 어떻게 증명하나요? "파이썬을 업그레이드했다"는 말은 증거가 아니며, 검증 가능한 통제와 증거가 필요합니다.

이 문서는 방어 가능한 해답이 필요한 보안 및 플랫폼 엔지니어를 위해 작성되었습니다: 버그가 어디에 있는지, 언제 물리는지, 노출을 안전하게 검증하는 방법, 이런 종류의 문제가 조용히 재발하지 않도록 강화하는 방법 등을 알아보세요.

CVE-2025-4517이 정확히 무엇일까요?

CVE-2025-4517은 CPython의 표준 라이브러리 모듈의 취약점입니다. 타르파일 를 허용할 수 있습니다. 파일 시스템이 의도한 추출 디렉터리 외부에 쓰기 추출할 때 신뢰할 수 없음 타르 아카이브를 특정 방식으로 처리합니다. CVE 레코드는 트리거 조건에 대해 이례적으로 명시적으로 설명합니다:

  • 취약한 API: TarFile.extractall() 또는 TarFile.extract()
  • 트리거: 추출 신뢰할 수 없음 타르 아카이브 filter="data" 또는 filter="tar"
  • 영향을 받는 버전: Python 3.12+ (이전 버전은 이 특정 '필터' 기능의 적용 범위에 포함되지 않음) (CVE)

Red Hat의 CVE 항목에는 운영 측면에서의 영향이 명시되어 있습니다: 임의의 파일 시스템이 추출 디렉터리 외부에 쓰기 신뢰할 수 없는 아카이브의 추출을 통해. (레드햇 고객 포털)

"필터=데이터" 및 "필터=타르"가 중심이 되는 이유

Python은 다음을 통해 추출 필터를 도입했습니다. PEP 706 를 사용하여 타르 추출을 더 안전하고 제어할 수 있습니다. 필터 메커니즘은 추출 중에 위험한 멤버를 거부하거나 메타데이터를 조정할 수 있습니다. (파이썬 개선 제안(PEP))

하지만 CVE-2025-4517은 주의해야 할 사례입니다: 안전 메커니즘은 에지 케이스의 정확성만큼만 안전합니다..

방어자에게 중요한 근본 원인

Google 보안 연구팀은 핵심 버그 패턴을 설명하는 기술 권고문을 발표했습니다:

  • os.path.realpath()"tar" 그리고 "데이터" 필터를 사용하여 경로 유효성 검사
  • 다음과 같은 특정 조건에서 PATH_MAX, realpath() 는 완전히 확장된 경로가 PATH_MAX를 초과할 때 에러를 발생시키지 않습니다.
  • 나중에 extractall() / extract()경로가 통과되지 않고 사용됩니다. realpath() 사이에 불일치가 발생하여 확인 그리고 사용 (GitHub)

실질적으로 이것은 '유효성 검사 격차' 문제입니다: 필터가 안전하다고 판단하는 것과 파일 시스템이 추출 중에 해결하는 것이 다를 수 있습니다.-안전 모드를 사용하고 있다고 생각되는 경우에도 '외부 대상에 쓰기' 동작이 발생하는 방식입니다.

많은 공개 PoC 리포지토리에서 이 클래스의 바이패스에 대해 다음과 같이 설명합니다. PATH_MAX 및 심볼릭 링크 확장 동작을 살펴보세요. 이러한 기능은 방어자가 메커니즘을 이해하는 데 유용하지만 문제를 해결하기 위해 익스플로잇 코드가 필요하지는 않습니다. (GitHub)

CI/CD 및 AI 파이프라인에서 CVE-2025-4517이 더 나쁜 이유

이 CVE는 많은 팀이 생각하는 것처럼 "파이썬 전용"이 아닙니다. 더 잘 이해되는 것은 일상적인 자동화 위험:

1) 타르 추출은 현대 자동화의 원시적인 작업입니다.

아카이브는 어디에나 있습니다:

  • CI 작업으로 종속성 풀기 및 아티팩트 빌드하기
  • 릴리스 파이프라인으로 공급업체 번들 풀기
  • 데이터 엔지니어링 작업으로 데이터 세트 풀기
  • ML 파이프라인으로 모델 타볼과 훈련 스냅샷 풀기

엄격한 신뢰 경계 없이 추출이 발생하면 '임의 쓰기 외부 목적지' 프리미티브가 즉시 관련됩니다.

2) '신뢰할 수 없음'에는 내부 소스가 포함됩니다.

팀에서는 '내부 아티팩트 저장소'를 기본적으로 신뢰할 수 있는 저장소로 취급하는 경우가 많습니다:

  • 모든 엔지니어가 아티팩트를 게시할 수 있습니다.
  • PR 빌드는 포크된 컨텍스트에서 아티팩트를 가져옵니다.
  • 파트너 피드가 공유 버킷에 착륙
  • 자동화된 시스템이 검증 없이 "최신" 아티팩트를 가져옵니다.

경계 차단 취약점의 경우 "신뢰할 수 없음"은 "제어 영역 외부에서 엔드투엔드 감사가 가능한 상태"를 의미합니다.

3) 폭발 반경은 코드뿐만 아니라 마운트 및 권한에 따라 달라집니다.

컨테이너 안에서도 중요한 것은

  • 어떤 호스트 경로 또는 퍼시스턴트 볼륨이 마운트되었는지 확인합니다.
  • 프로세스에 형제 디렉터리에 대한 쓰기 권한이 있는지 여부
  • 이후 파이프라인 단계가 쓰기 가능한 경로에서 실행되는지 여부

임의의 글은 종종 독이 될 수 있습니다:

  • 스크립트 작성
  • 구성 파일
  • 종속성 캐시
  • 러너 작업 공간
  • "다음 단계" 입력(나중에 코드 실행으로 이어질 수 있음)

이해해야 할 파이썬 타르파일 필터 환경

파이썬의 자체 문서 타르파일 는 두 가지 변경 사항을 명시합니다:

  • 파이썬 3.12에서 추출은 필터 메커니즘을 사용합니다(그리고 보안에 초점을 맞춘 전환이 진행 중입니다). (Python 문서)
  • 파이썬 3.14에서, 로 설정하면 기본 추출 필터는 데이터이전에는 동작이 효과적으로 fully_trusted. 이는 일부 생태계에서 획기적인 변화입니다. (Python 문서)

PEP 706은 설계 근거를 설명합니다. 추출 필터는 타르 아카이브가 놀랍거나 위험한 기능을 인코딩할 수 있기 때문에 존재하며, 사용 중단 기간이 지나면 더 엄격한 기본값이 계획되어 있습니다. (파이썬 개선 제안(PEP))

이는 두 가지 측면에서 CVE-2025-4517에 중요합니다:

  1. 명시적으로 전달한 경우 filter="data" 또는 filter="tar"를 클릭하면 CVE 레코드에 설명된 영향을 받는 상태에 직접 도달하게 됩니다. (CVE)
  2. 기본 동작에 의존하는 경우, 파이썬 3.14에서는 기본값이 다음과 같이 변경됩니다. 데이터를 사용하여 호환성과 위험 태세를 모두 변경할 수 있습니다. (Python 문서)

따라서 해결 방법은 단순히 "CVE를 패치하는 것"이 아니라 "기본 의미론 변경에 놀라지 않도록 하는 것"이기도 합니다.

나는 취약한가 빠른 의사 결정 트리

대기 중 분류 체크리스트로 사용할 수 있습니다.

모두 사실이라면 고위험군입니다.

  • 파이썬 런타임은 3.12+ (CVE)
  • 다음에서 타르 아카이브를 추출합니다. 신뢰할 수 없거나 신뢰도가 낮은 출처
  • 코드에서 사용합니다:
    • TarFile.extractall(..., filter="data") 또는 filter="tar"
    • 또는 TarFile.extract(..., filter="data") 또는 filter="tar" (CVE)
  • 추출 프로세스는 의도한 대상 외부에 민감한 경로가 있는 파일 시스템에 쓸 수 있습니다.

"파이썬을 업그레이드"한 경우에도 여전히 노출될 수 있습니다.

기업의 현실은 다음과 같습니다:

  • 공급업체 이미지에 내장된 파이썬 런타임
  • 자주 재구축되지 않는 장수명 CI 러너 이미지
  • 내부 레지스트리에 고정된 기본 이미지
  • 간접적으로 추출을 수행하는 다운스트림 툴링
CVE-2025-4517

문제를 무기화하지 않고 안전한 유효성 검사

여기서 목표는 다음과 같습니다. 방어적 유효성 검사시스템에 취약한 호출 패턴이 있는지, 제어가 대상 외부 쓰기를 방지하는지 확인합니다.

1단계 위험한 통화 사이트 찾기

CVE 트리거는 명시적이므로 먼저 명시적 필터 사용을 검색하세요.

rg -n "tarfile\\.open\\(" .
rg -n "\\.extractall\\(" .
rg -n "\\.extract\\(" .
rg -n "filter\\s*=\\s*[\\"'](data|tar)[\\"']" .

래퍼나 공유 유틸리티 함수를 발견하면 이를 '초크 포인트'로 간주하여 이를 수정하면 위험을 크게 줄일 수 있습니다.

2단계 축복받은 안전한 추출 도우미 만들기

패치를 적용한 후에도 정책을 중앙 집중화해야 합니다. CVE-2025-4517의 교훈은 "필터는 나쁘다"가 아니라 "단일 안전 계층에 모든 것을 걸지 말라"는 것입니다.

아래는 일반적인 탈출 프리미티브를 차단하는 보수적인 안전 추출 헬퍼입니다. 이는 익스플로잇 세부 정보에 의존하지 않고 추론할 수 있는 불변성을 적용합니다.

import os
tarfile 가져오기
경로 라이브러리에서 경로 가져오기

클래스 UnsafeTarMember(예외):
    pass

def _within(base: Path, target: Path) -> bool:
    # 최선을 다해 해결합니다. target이 아직 존재하지 않으면 절대()는 여전히 정규화됩니다.
    try:
        base_r = base.resolve()
    를 반환합니다:
        base_r = base.absolute()
    try:
        target_r = target.resolve()
    파일 찾을 수 없음 에러를 제외하고:
        target_r = target.absolute()

    # 공통경로는 디렉터리 포함 검사에 강력합니다.
    반환 os.path.commonpath([str(base_r)]) == os.path.commonpath([str(base_r), str(target_r)])

def safe_extract_tar(tar_path: str, dest_dir: str, *, allow_links: bool = False) -> None:
    dest = Path(dest_dir)
    dest.mkdir(parents=True, exist_ok=True)

    tarfile.open(tar_path, mode="r:*")을 tf로 사용합니다:
        members = tf.getmembers()

        멤버의 m에 대해
            name = m.name

            # 절대 경로 거부
            name.startswith("/") 또는 name.startswith("\\\\")인 경우:
                raise UnsafeTarMember(f"절대 경로 차단됨: {name}")

            # 트래버스 세그먼트 거부
            Path(name).parts에 ".."가 있으면:
                raise UnsafeTarMember(f"트래버스 차단됨: {이름}")

            # 명시적으로 허용되지 않는 한 심볼릭 링크/하드링크 차단
            if (m.issym() 또는 m.islnk()) 및 허용_링크가 아닌 경우:
                raise UnsafeTarMember(f"링크 차단됨: {이름}")

            # 대상 포함 보장
            대상 = 대상 / 이름
            not _within(dest, target):
                raise UnsafeTarMember(f"이스케이프 대상: {이름}")

        # 유효성 검사 후에만 추출
        tf.extractall(path=str(dest))

이것이 중요한 이유: 향후 CVE가 다시 타파일 필터링에 걸리더라도 환경의 위협 모델에 맞는 격리 규칙과 링크 정책에 의해 추출이 차단됩니다.

3단계 "괜찮다고 생각합니다"가 아닌 증거를 제시하세요.

추출 초크 지점에 구조화된 로그를 추가하세요:

  • 입력 소스 및 해시
  • 목적지 경로
  • 회원 수
  • 차단된 멤버와 그 이유
  • 런타임 파이썬 버전

이를 통해 방어 가능한 감사 추적을 확보할 수 있습니다.

CVE-2025-4517

기업 현실에 맞는 패치 및 완화 전략

패치 기준선

CVE 레코드는 영향을 받는 버전과 트리거 조건을 정의합니다. 거기서 시작하세요. (CVE)

그런 다음 플랫폼의 공급업체 지침에 따르세요. Red Hat의 CVE 페이지는 배포판의 엔터프라이즈 추적 및 패치 상태에 유용합니다. (레드햇 고객 포털)

하지만 패치 적용만으로는 충분하지 않습니다.

왜냐하면:

  • 인벤토리에 포함하지 않은 여러 런타임에서 추출이 발생할 수 있습니다.
  • 기본값이 파이썬 3.14에서 변경되어 호환성이 깨지고 새로운 호출 경로가 발생할 수 있습니다(Python 문서)
  • 팀은 다음을 제거하여 "수정"할 수 있습니다. filter="data" 버전 및 기본값에 따라 무의식적으로 더 허용적인 동작으로 되돌아갑니다.

강력한 전략에는 세 가지 계층이 있습니다:

  1. 런타임 업그레이드 이미지, 러너, 배치 워커 및 임베디드 Python에서
  2. 안전한 추출 중앙 집중화 새로운 코드가 위험한 패턴을 다시 도입할 수 없도록 합니다.
  3. 대상 외 쓰기 모니터링 추출 워크플로우 중, 특히 CI 러너와 파이프라인 작업자의 경우 더욱 그렇습니다.

관련 CVE 및 타르 추출을 진화하는 공격 표면으로 취급해야 하는 이유

CVE-2025-4517은 타르 추출 경화가 진화하고 있으며(PEP 706) 필터 의미론 및 우회 조건과 관련된 여러 CVE가 발생하고 있다는 보다 넓은 범위의 일부입니다.

예를 들어, NVD의 CVE-2025-4138에 따르면 파이썬 3.14에서는 기본 필터가 다음과 같이 변경됩니다. 데이터 기본값에 의존하면 노출에 영향을 미칠 수 있다고 경고합니다. (NVD)

요점은 "타르를 추출하지 말라"는 것이 아닙니다. 맞습니다:

  • 추출을 권한 있는 작업으로 취급
  • 자체 경계에서 불변성 적용
  • 추출 도우미에 회귀 테스트 추가하기
  • 파이썬 3.14 기본값 변경에 신중을 기하여 갑작스러운 파손을 방지해야 합니다(Python 문서)

이번 주에 배포할 수 있는 실용적인 탐지 및 가드레일

리포지토리 가드레일

위험한 패턴이 도입되면 실패가 누적됩니다:

  • 에 직접 통화 extractall() 안전 도우미를 거치지 않고
  • 명시적 filter="data" 또는 filter="tar" 검토되지 않은 경로에서

런타임 가드레일

추출 프로세스가 화이트리스트 디렉터리 트리 외부에 쓸 때 알림을 받습니다.

Linux에서는 CI 작업 중 민감한 위치에 대한 쓰기 이벤트를 감사하고 추출 로그와 상호 연관시키는 것을 고려하세요. 이것은 CVE에만 국한된 것이 아니라 "추출을 통한 경계 침범"이라는 전체 클래스에 대한 제어입니다.

증명 지향 운영 체크리스트

다음은 티켓 템플릿에 복사할 수 있는 간결한 표입니다.

제어구현하는 내용증명할 수 있는 내용
인벤토리아카이브를 추출할 수 있는 모든 Python 런타임 찾기버전 및 소유자가 있는 이미지/러너/작업자 목록
패치영향을 받는 런타임 업그레이드SBOM/빌드 로그 + 런타임 버전 확인
안전한 추출격리 + 링크 정책을 갖춘 하나의 축복받은 도우미CI 가드레일에는 직접 추출 호출이 표시되지 않습니다.
원격 분석로그 추출, 차단 규칙 및 이벤트 쓰기데스트 외 쓰기가 발생하지 않았다는 증거
회귀 테스트단위 테스트 제작 에지 케이스 경로 및 링크경계 이스케이프에서 실패하는 테스트 스위트

약속이 아닌 증거가 목표일 때 펜리전트가 적합한 경우

"패치를 계속하고 있지만 안전하다는 것을 증명할 수 없다"는 고민이 있다면, 가장 가치 있는 결과물은 증거 체인입니다:

  • 플랫폼에서 타르를 추출하는 모든 위치 식별
  • 통제된 테스트에서 동작 검증
  • 연결되는 보고서를 생성합니다. 런타임 버전 + 코드 경로 + 컨트롤 + 로그 하나의 방어 가능한 내러티브로

이 CVE에 대한 방어적 유효성 검사 패턴에 대해 Penligent와 관련된 심층 분석을 원한다면 다음 두 가지 내부 참조 자료가 직접 주제에 대한 것이며 이미 "무기화하지 말라"는 자세로 작성되어 있습니다.펜리전트)

참조

게시물을 공유하세요:
관련 게시물
ko_KRKorean