OpenSC — это инструменты и промежуточное программное обеспечение для смарт-карт с открытым исходным кодом. До версии 0.27.0 sc_compacttlv_find_tag ищет в буфере Compact-TLV заданный тег. В компактном TLV один байт кодирует тег (старший полубайт) и длину значения (младший полубайт).
При использовании 1-байтового буфера {0x0A} закодированный элемент требует тега = 0 и длины = 10, но за ним не следуют байты значения. Вызов sc_compacttlv_find_tag с тегом поиска 0x00 возвращает указатель, равный buf+1 и outlen=10, без проверки того, что заявленная длина значения помещается в оставшийся буфер. В тех случаях, когда sc_compacttlv_find_tag предоставляет ненадежные данные (например, считываемые с карт/файлов), злоумышленники могут повлиять на него, чтобы он возвращал указатели за пределами границ, что приводит к повреждению нисходящей памяти, когда последующий код пытается разыменовать указатель.
Эта проблема исправлена в версии 0.27.0.
Показать оригинальное описание (EN)
OpenSC is an open source smart card tools and middleware. Prior to version 0.27.0, sc_compacttlv_find_tag searches a compact-TLV buffer for a given tag. In compact-TLV, a single byte encodes the tag (high nibble) and value length (low nibble). With a 1-byte buffer {0x0A}, the encoded element claims tag=0 and length=10 but no value bytes follow. Calling sc_compacttlv_find_tag with search tag 0x00 returns a pointer equal to buf+1 and outlen=10 without verifying that the claimed value length fits within the remaining buffer. In cases where the sc_compacttlv_find_tag is provided untrusted data (such as being read from cards/files), attackers may be able to influence it to return out-of-bounds pointers leading to downstream memory corruption when subsequent code tries to dereference the pointer. This issue has been patched in version 0.27.0.
Характеристики атаки
Последствия
Строка CVSS v3.1