#!/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()