CPython допускает неверную интерпретацию HTTP-ответов при разборе целых чисел

Python

CPython, эталонная реализация языка Python, слишком мягко разбирает целые числа в теле HTTP-ответа (протокол передачи гипертекста) и при разбиении ответа на блоки. Из-за этого приложение понимает содержимое ответа иначе, чем отправитель. По формулировке бюллетеня, ошибка ведёт к обходу политики безопасности, то есть набора правил, по которым приложение решает, что ему разрешено. Затронуты сборки без последнего исправления, официальная граница в записи - версии младше 3.16.0.

Разбор целых чисел и блоков в HTTP-ответах, CVE-2026-103995

Ответ по HTTP передаётся либо целиком, либо фрагментами, которые называют блоками. Перед каждым блоком идёт число, задающее его длину в шестнадцатеричном виде, то есть в системе счисления по основанию 16. Разбор в CPython принимает не шестнадцатеричные записи и отрицательные значения вместо того, чтобы их отвергнуть. В результате длина блока или всего тела вычисляется неверно, и граница между частями ответа смещается. Приложение разбирает уже другое содержимое, чем сформировал отправитель, и опирается на неверные значения дальше по цепочке обработки.

Расхождение возникает на стыке двух чисел: общей длины тела и длины каждого блока. Если разбор принимает значение, которое протокол считает недопустимым, читаемая позиция смещается не так, как задумывал отправитель. Приложение получает границы, которые не совпадают с реальными, и трактует соседние данные как часть своего ответа. Класс слабости в записи - CWE-444, расхождение в трактовке HTTP-сообщений отправителем и получателем. Ошибка находится в самом интерпретаторе, поэтому её наследуют приложения на Python, которые получают ответы по HTTP.

Оценка по CVSS 4.0, системе оценки серьёзности уязвимостей, составляет 2.0 из 10, это низкий уровень. Оценка складывается из сетевого вектора, высоких привилегий и отсутствия прямого влияния на уязвимую систему. Атака идёт по сети, сложность низкая, но нужны высокие привилегии и дополнительные условия в целевой системе. Участие пользователя пассивное: отдельного подтверждения от него не требуется. Влияния на саму уязвимую систему нет, целостность связанной системы может пострадать в низкой степени.

Исправленная версия в записи CVE не названа. Перечень исправлений и поддерживаемые ветки приведены в бюллетене безопасности Python PSF-2026-47 от 27 октября 2026 года, точные номера версий нужно брать оттуда. Граница 3.16.0 означает, что в списке затронутых числятся все более ранние версии, включая поддерживаемые ветки. Для версий, которых нет в списке затронутых, в записи указан статус "не затронуто" по умолчанию. Это предварительный вывод, а не подтверждённая безопасность остальных сборок.

Запись опубликована 27 октября 2026 года и обновлена 28 октября. Сведений об эксплуатации в реальных атаках нет: раскрытие технических деталей означает доступность описания, а не использование уязвимости. Обходных мер вендор не приводит. При таком раскладе остаются установка обновлённой сборки CPython и отслеживание обновлений бюллетеня. Сверка номера сборки с бюллетенем показывает, закрыта ли ошибка в конкретной установке.

Высокие требования к привилегиям и дополнительные условия ограничивают применимость атаки. Значимость сохраняется для приложений, которые принимают решения по разобранному HTTP-ответу. Неверная интерпретация в них ведёт к обходу политики безопасности, и обновление закрывает как саму ошибку разбора, так и этот сценарий.

Ссылки

Комментарии: 0