Ctypes менен текшерилбеген бөлчөк сандарды иштетүүдө Pythonдогу аялуу

Python программалоо тилинин 3.7.10 жана 3.6.13 түзөтүүчү релиздери бар, алар ctypes механизмин колдонуп C функцияларын чакырган иштеткичтерде валидацияланбаган калкыма чекит сандарын иштетүүдө коддун аткарылышына алып келиши мүмкүн болгон (CVE-2021-3177) кемчиликти оңдойт. . Көйгөй Python 3.8 жана 3.9 бутактарына да таасирин тийгизет, бирок алар үчүн жаңыртуулар дагы эле талапкер статусунда (релиз 1-мартка пландаштырылган).

Көйгөй ctypes PyCArg_repr() функциясында буфердин толуп кетишинен келип чыгат, ал sprintf кооптуу колдонуудан улам пайда болот. Атап айтканда, "sprintf(buffer,") трансформациясынын натыйжасын иштетүү үчүн ", self->teg, self->value.b)' 256 байт ("char buffer[256]") статикалык буферди бөлгөн, ал эми натыйжа бул мааниден ашып кетиши мүмкүн. Тиркемелердин алсыздыгына карата аялуулугун текшерүү үчүн, c_double.from_param ыкмасы менен иштетилгенде, бузулууга алып келе турган “1e300” маанисин өткөрүп көрүүгө болот, анткени алынган сан 308 белгиден турат жана 256-байт буфер. Көйгөйлүү коддун мисалы: import ctypes; x = ctypes.c_double.from_param(1e300); repr(x)

Көйгөй Debian, Ubuntu жана FreeBSDде чечилбеген бойдон калууда, бирок буга чейин Arch Linux, Fedora, SUSEде оңдолгон. RHELде, сап функцияларындагы буфердин толуп кетишин бөгөттөп турган FORTIFY_SOURCE режиминде топтомду чогултууга байланыштуу алсыздык пайда болбойт.

Source: opennet.ru

Комментарий кошуу