Ранливост во 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 бајти. Пример за проблематичен код: увоз на типови; x = ctypes.c_double.from_param(1e300); repr(x)

Проблемот останува нерешен во Debian, Ubuntu и FreeBSD, но веќе е поправен во Arch Linux, Fedora, SUSE. Во RHEL, ранливоста не се јавува поради склопување на пакетот во режимот FORTIFY_SOURCE, што ги блокира таквите прелевања на баферот во функциите на низата.

Извор: opennet.ru

Додадете коментар