25.02.2021

Уязвимость в Python, проявляющаяся при обработке непроверенных дробных чисел в ctypes

Доступны корректирующие выпуски языка программирования Python 3.7.10 и 3.6.13, в которых устранена уязвимость (CVE-2021-3177), способная привести к исполнению кода при обработке непроверенных чисел с плавающей запятой в обработчиках, вызывающих функции на языке Си при помощи механизма ctypes. Проблема также затрагивает ветки Python 3.8 и 3.9, но обновления для них пока находятся в состоянии кандидата в релизы (релиз запланирован на 1 марта).

Проблема вызвана переполнением буфера в ctypes-функции PyCArg_repr(), возникающем из-за небезопасного использования sprintf. В частности, на обработку результата выполнения преобразования ‘sprintf(buffer, «<cparam ‘%c’ (%d)>», self->tag, self->value.b)выделялся статический буфер размером 256 байт («char buffer[256]«), в то время как результат мог превышать данное значение. Для проверки подверженности приложений уязвимости можно попробовать передать значение «1e300», которое при обработке методом c_double.from_param приведёт к краху, так как результирующие число содержит 308 знаков и не умещается в 256-байтный буфер. Пример проблемного кода:

 import ctypes; x = ctypes.c_double.from_param(1e300); repr(x)

Проблема остаётся неисправленной в Debian, Ubuntu и FreeBSD, но уже устранена в Arch Linux, Fedora, SUSE. В RHEL уязвимость не проявляется из-за сборки пакетов в режиме FORTIFY_SOURCE, блокирующем подобные переполнения буфера в строковых функциях.

Источник.