Версии Crypt::OpenSSL::PKCS12 до 1.98 для Perl допускают разыменование NULL-указателя в print_attribute через атрибут BMPSTRING нулевой длины.
print_attribute() определяет размер буфера назначения для атрибута BMPSTRING по его объявленной длине в байтах с помощью `Renew(*attribute, length, char)`. Атрибут нулевой длины приводит к перераспределению нулевого размера, которое Perl реализует как свободное возвращение NULL, поэтому указатель буфера становится NULL, следующий `strncpy` ничего не копирует, а вызывающая сторона разыменовывает NULL в `strlen()`, который передается в `newSVpvn()`. Нулевая длина BMPSTRING является четной, поэтому декодер ASN.1 принимает ее, и значение достигает этого кода.
Размер плеч UTF8STRING, OCTET STRING и BIT STRING равен `length + 1` или `length * 4 + 1` и не затрагивается. Любой вызывающий объект, который передает ненадежный файл PKCS#12 в info_as_hash(), может привести к сбою процесса. info() печатает значения атрибутов напрямую, не изменяя размер буфера, и на это не влияет.
Показать оригинальное описание (EN)
Crypt::OpenSSL::PKCS12 versions before 1.98 for Perl allow a NULL pointer dereference in print_attribute via a zero length BMPSTRING attribute. print_attribute() sizes the destination buffer for a BMPSTRING attribute from its declared byte length with `Renew(*attribute, length, char)`. A zero length attribute makes that a zero size reallocation, which Perl implements as a free returning NULL, so the buffer pointer becomes NULL, the following `strncpy` copies nothing, and the caller dereferences NULL in the `strlen()` it passes to `newSVpvn()`. A zero length BMPSTRING is even length, so the ASN.1 decoder accepts it and the value reaches this code. The UTF8STRING, OCTET STRING and BIT STRING arms size on `length + 1` or `length * 4 + 1` and are unaffected. Any caller that passes an untrusted PKCS#12 file to info_as_hash() can crash the process. info() prints attribute values directly without sizing a buffer and is unaffected.
Характеристики атаки
Последствия
Строка CVSS v3.1