Kerentanan dalam Python saat menangani bilangan pecahan yang tidak divalidasi di ctypes

Rilis korektif bahasa pemrograman Python 3.7.10 dan 3.6.13 tersedia, yang memperbaiki kerentanan (CVE-2021-3177) yang dapat menyebabkan eksekusi kode saat memproses angka floating point yang tidak divalidasi di penangan yang memanggil fungsi C menggunakan mekanisme ctypes . Masalah ini juga mempengaruhi cabang Python 3.8 dan 3.9, tetapi pembaruan untuk cabang tersebut masih dalam status kandidat rilis (rilis dijadwalkan pada 1 Maret).

Masalahnya disebabkan oleh buffer overflow pada fungsi ctypes PyCArg_repr(), yang terjadi karena penggunaan sprintf yang tidak aman. Khususnya untuk memproses hasil transformasi 'sprintf(buffer, " ", self->tag, self->value.b)' mengalokasikan buffer statis sebesar 256 byte ("char buffer[256]"), sedangkan hasilnya dapat melebihi nilai ini. Untuk memeriksa kerentanan aplikasi terhadap kerentanan, Anda dapat mencoba meneruskan nilai "1e300", yang jika diproses dengan metode c_double.from_param, akan menyebabkan crash, karena angka yang dihasilkan berisi 308 karakter dan tidak sesuai dengan a penyangga 256 byte. Contoh kode yang bermasalah: import ctypes; x = ctypes.c_double.from_param(1e300); ulangan(x)

Masalahnya masih belum terselesaikan di Debian, Ubuntu dan FreeBSD, namun telah diperbaiki di Arch Linux, Fedora, SUSE. Di RHEL, kerentanan tidak terjadi karena perakitan paket dalam mode FORTIFY_SOURCE, yang memblokir buffer overflows dalam fungsi string.

Sumber: opennet.ru

Tambah komentar