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

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

Проблемът е причинин от препълване на буфера в функцията ctypes PyCArg_repr(), което възниква поради небезопасна употреба на sprintf. В частност, за обработка на резултата от преобразуването 'sprintf(buffer, "", 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, който блокира подобни препълвания на буфера в строкови функции.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster