Проблема вызвана переполнением буфера в ctypes-функции PyCArg_repr(), возникающем из-за небезопасного использования sprintf. В частности, на обработку результата выполнения преобразования 'sprintf(buffer, "‹cparam '%c' (%f)›", self-›tag, self-›value.d)' выделялся статический буфер размером 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 и Gentoo. В RHEL уязвимость не проявляется из-за сборки пакетов в режиме FORTIFY_SOURCE, блокирующем подобные переполнения буфера в строковых функциях.
Дополнение: Релизы Python 3.9.2 и 3.8.8 с устранением уязвимости опубликованы раньше изначально намеченного срока.
Источник: https://www.opennet.ru/opennews/art.shtml?num=54616
(opennet.ru, основная лента)