Уразлівасць у 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

Дадаць каментар