В cbor2 до версии 5.7.0 существует множество уязвимостей в функции decode_definite_long_string() декодера расширения C (source/decoder.c): (1) Недополнение целого числа, ведущее к чтению за пределами границ (CWE-191, CWE-125): неправильная ссылка на переменную и отсутствующий сброс состояния в цикле обработки фрагмента приводят к тому, что buffer_length не сбрасывается в ноль после использования символов UTF-8. Это приводит к тому, что последующие вычисления chunk_length дают отрицательные значения (например, chunk_length = 65536 - buffer_length), которые передаются как целые числа со знаком в метод read(), что потенциально может вызвать неограниченное количество операций чтения и исчерпание ресурсов. (2) Утечка памяти из-за отсутствия освобождения счетчика ссылок (CWE-401): основной цикл обработки не может освободить ссылки на объекты Python (Py_DECREF) для объектов фрагментов, выделенных на каждой итерации. Для строк CBOR длиной более 65536 байт это приводит к совокупным утечкам памяти, пропорциональным размеру полезных данных, что делает возможным проведение атак на исчерпание памяти посредством повторной обработки больших полезных данных CBOR.
Обе уязвимости можно использовать удаленно без аутентификации, отправив специально созданные данные CBOR, содержащие текстовые строки определенной длины с многобайтовыми символами UTF-8, расположенными на границах фрагментов размером 65536 байт. Успешная эксплуатация приводит к отказу в обслуживании из-за сбоя процесса (исключения CBORDecodeEOF) или нехватки памяти. Уязвимости затрагивают все приложения, использующие расширение C cbor2 для обработки ненадежных данных CBOR, включая веб-API, сборщики данных IoT и процессоры очередей сообщений.
Исправлено в коммите 851473490281f82d82560b2368284ef33cf6e8f9, добавленном в выпущенную версию 5.7.1.
Показать оригинальное описание (EN)
Multiple vulnerabilities exist in cbor2 through version 5.7.0 in the decode_definite_long_string() function of the C extension decoder (source/decoder.c): (1) Integer Underflow Leading to Out-of-Bounds Read (CWE-191, CWE-125): An incorrect variable reference and missing state reset in the chunk processing loop causes buffer_length to not be reset to zero after UTF-8 character consumption. This results in subsequent chunk_length calculations producing negative values (e.g., chunk_length = 65536 - buffer_length), which are passed as signed integers to the read() method, potentially triggering unlimited read operations and resource exhaustion. (2) Memory Leak via Missing Reference Count Release (CWE-401): The main processing loop fails to release Python object references (Py_DECREF) for chunk objects allocated in each iteration. For CBOR strings longer than 65536 bytes, this causes cumulative memory leaks proportional to the payload size, enabling memory exhaustion attacks through repeated processing of large CBOR payloads. Both vulnerabilities can be exploited remotely without authentication by sending specially-crafted CBOR data containing definite-length text strings with multi-byte UTF-8 characters positioned at 65536-byte chunk boundaries. Successful exploitation results in denial of service through process crashes (CBORDecodeEOF exceptions) or memory exhaustion. The vulnerabilities affect all applications using cbor2's C extension to process untrusted CBOR data, including web APIs, IoT data collectors, and message queue processors. Fixed in commit 851473490281f82d82560b2368284ef33cf6e8f9 pushed with released version 5.7.1.
Характеристики атаки
Последствия
Строка CVSS v3.1
Тип уязвимости (CWE)
Уязвимые продукты 1
| Конфигурация | От (включительно) | До (исключительно) |
|---|---|---|
|
Agronholm Cbor2
cpe:2.3:a:agronholm:cbor2:*:*:*:*:*:python:*:*
|
— |
<= 5.7.0
|