Вразливість у Python, що виявляється при обробці неперевірених дробових чисел у ctypes

Доступні коригувальні випуски мови програмування Python 3.7.10 і 3.6.13, у яких усунута вразливість (CVE-2021-3177), здатна привести до виконання коду при обробці неперевірених чисел з плаваючою комою в обробниках, що викликають функції на мові Сі за допомогою механізму . Проблема також торкається гілок 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

Додати коментар або відгук