Typlarda tasdiqlanmagan kasr raqamlarini qayta ishlashda Python-da zaiflik

Python dasturlash tilining 3.7.10 va 3.6.13 tuzatuvchi versiyalari mavjud boʻlib, ular C funksiyalarini ctypes mexanizmidan foydalangan holda chaqiruvchi ishlov beruvchilarda tasdiqlanmagan suzuvchi nuqta raqamlarini qayta ishlashda kod bajarilishiga olib kelishi mumkin boʻlgan zaiflikni (CVE-2021-3177) tuzatadi. . Muammo Python 3.8 va 3.9 filiallariga ham ta'sir qiladi, ammo ular uchun yangilanishlar hali ham reliz nomzodi holatida (reliz 1 martga rejalashtirilgan).

Muammo ctypes funksiyasi PyCArg_repr()da buferning to'lib ketishi bilan bog'liq bo'lib, bu sprintf dan xavfli foydalanish natijasida yuzaga keladi. Xususan, "sprintf(bufer,") o'zgartirish natijasini qayta ishlash uchun ", self->tag, self->value.b)' 256 baytlik statik buferni ajratdi ("char bufer[256]"), natijada bu qiymatdan oshib ketishi mumkin. Ilovalarning zaiflikka nisbatan zaifligini tekshirish uchun siz c_double.from_param usuli bilan ishlov berilganda ishdan chiqishga olib keladigan “1e300” qiymatini o'tkazishga urinib ko'rishingiz mumkin, chunki natijada olingan raqam 308 ta belgidan iborat bo'lib, bir qatorga mos kelmaydi. 256 baytlik bufer. Muammoli kodga misol: import ctypes; x = ctypes.c_double.from_param(1e300); repr(x)

Muammo Debian, Ubuntu va FreeBSD-da hal qilinmagan, ammo Arch Linux, Fedora, SUSE-da allaqachon tuzatilgan. RHELda zaiflik FORTIFY_SOURCE rejimida paketlarni yig'ish tufayli yuzaga kelmaydi, bu string funktsiyalarida bunday bufer to'lib ketishini bloklaydi.

Manba: opennet.ru

a Izoh qo'shish