README.md
Rendering markdown...
#!/usr/bin/env python3
"""
CVE-2026-8838 — Proof of Concept : Client vulnérable (simulation)
==================================================================
Simule le comportement vulnérable de la fonction vector_in() présente dans
amazon-redshift-python-driver < 2.1.14, en évaluant aveuglément les données
reçues depuis le serveur via eval().
AVERTISSEMENT : À des fins éducatives uniquement.
Ne jamais utiliser contre des systèmes sans autorisation.
Auteur : Maxime288 — https://github.com/Maxime288
"""
import socket
HOST = "127.0.0.1"
PORT = 5439
# ---------------------------------------------------------------------------
# Simulation de la fonction vulnérable (versions < 2.1.14)
# ---------------------------------------------------------------------------
def vector_in_vulnerable(data: bytes) -> object:
"""
Reproduction simplifiée du comportement vulnérable.
Le driver décode la réponse du serveur et appelle eval() sans validation.
"""
raw = data.decode("utf-8")
print(f"[CLIENT] Données reçues du serveur : {raw}")
print("[CLIENT] Appel de eval() sur les données reçues...")
# FAILLE : eval() exécute tout code Python retourné par le serveur
result = eval(raw) # noqa: S307
return result
def vector_in_safe(data: bytes) -> list:
"""
Version corrigée (≥ 2.1.14) : utilise ast.literal_eval() ou un parseur
dédié qui n'exécute pas de code arbitraire.
"""
import ast
raw = data.decode("utf-8")
print(f"[CLIENT] Données reçues du serveur : {raw}")
print("[CLIENT] Appel de ast.literal_eval() (version corrigée)...")
try:
result = ast.literal_eval(raw)
return result
except (ValueError, SyntaxError) as e:
raise ValueError(f"Réponse serveur invalide ou malveillante : {e}") from e
# ---------------------------------------------------------------------------
# Démonstration
# ---------------------------------------------------------------------------
def connect_and_receive() -> bytes:
"""Se connecte au faux serveur et récupère la réponse."""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
print(f"[CLIENT] Connexion à {HOST}:{PORT}...")
s.connect((HOST, PORT))
s.sendall(b"SELECT * FROM test_table;")
data = s.recv(4096)
return data
def main() -> None:
print("=" * 60)
print("CVE-2026-8838 — Démonstration PoC")
print("=" * 60)
raw_response = connect_and_receive()
print("\n--- [ Simulation comportement VULNÉRABLE ] ---")
print("(amazon-redshift-python-driver < 2.1.14)\n")
try:
result = vector_in_vulnerable(raw_response)
print(f"[!] Code exécuté ! Résultat de eval() : {result}")
except Exception as e:
print(f"[-] Erreur : {e}")
print("\n--- [ Simulation comportement CORRIGÉ ] ---")
print("(amazon-redshift-python-driver >= 2.1.14)\n")
try:
result = vector_in_safe(raw_response)
print(f"[+] Résultat sûr : {result}")
except ValueError as e:
print(f"[+] Payload malveillante bloquée : {e}")
print("\n[*] Fin de la démonstration.")
if __name__ == "__main__":
main()