5465 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / poc_client.py PY
#!/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()