Kerentanan dalam Python apabila mengendalikan nombor pecahan tidak sah dalam ctypes

Keluaran pembetulan bahasa pengaturcaraan Python 3.7.10 dan 3.6.13 tersedia, yang membetulkan kelemahan (CVE-2021-3177) yang boleh membawa kepada pelaksanaan kod apabila memproses nombor titik terapung tidak sah dalam pengendali yang memanggil fungsi C menggunakan mekanisme ctypes . Masalah ini juga menjejaskan cawangan Python 3.8 dan 3.9, tetapi kemas kini untuk mereka masih dalam status calon keluaran (pelepasan dijadualkan pada 1 Mac).

Masalahnya disebabkan oleh limpahan penimbal dalam fungsi ctypes PyCArg_repr(), yang berlaku disebabkan penggunaan sprintf yang tidak selamat. Khususnya, untuk memproses hasil transformasi 'sprintf(buffer, " ", self->tag, self->value.b)' memperuntukkan penimbal statik sebanyak 256 bait ("char buffer[256]"), manakala hasilnya boleh melebihi nilai ini. Untuk menyemak kerentanan aplikasi kepada kerentanan, anda boleh cuba menghantar nilai "1e300", yang, apabila diproses oleh kaedah c_double.from_param, akan membawa kepada ranap sistem, kerana nombor yang terhasil mengandungi 308 aksara dan tidak sesuai dengan Penampan 256 bait. Contoh kod bermasalah: import ctypes; x = ctypes.c_double.from_param(1e300); repr(x)

Masalahnya masih belum dibetulkan dalam Debian, Ubuntu dan FreeBSD, tetapi telah pun diperbaiki dalam Arch Linux, Fedora, SUSE. Dalam RHEL, kelemahan tidak berlaku disebabkan pemasangan pakej dalam mod FORTIFY_SOURCE, yang menyekat limpahan penimbal tersebut dalam fungsi rentetan.

Sumber: opennet.ru

Tambah komen