Ctypes'te doğrulanmamış kesirli sayıları işlerken Python'daki güvenlik açığı

Python programlama dili 3.7.10 ve 3.6.13'ün, ctypes mekanizmasını kullanarak C işlevlerini çağıran işleyicilerde doğrulanmamış kayan nokta sayılarını işlerken kod yürütülmesine yol açabilecek bir güvenlik açığını (CVE-2021-3177) gideren düzeltici sürümleri mevcuttur. . Sorun aynı zamanda Python 3.8 ve 3.9 şubelerini de etkiliyor ancak bunlara yönelik güncellemeler hâlâ sürüm adayı durumunda (sürüm 1 Mart için planlanıyor).

Sorun, sprintf'in güvenli olmayan kullanımı nedeniyle oluşan PyCArg_repr() ctypes işlevindeki arabellek taşmasından kaynaklanmaktadır. Özellikle 'sprintf(buffer, " dönüşümünün sonucunu işlemek için ", self->tag, self->value.b)' 256 baytlık statik bir arabellek ayırdı ("char buffer[256]"), sonuç bu değeri aşabilir. Uygulamaların güvenlik açığına karşı güvenlik açığını kontrol etmek için, c_double.from_param yöntemiyle işlendiğinde ortaya çıkan sayı 1 karakter içerdiğinden ve bir diziye sığmadığı için çökmeye yol açacak olan “300e308” değerini aktarmayı deneyebilirsiniz. 256 baytlık arabellek. Sorunlu kod örneği: içe aktarma türleri; x = ctypes.c_double.from_param(1e300); tekrar(x)

Sorun Debian, Ubuntu ve FreeBSD'de çözülmedi ancak Arch Linux, Fedora ve SUSE'de zaten düzeltildi. RHEL'de bu güvenlik açığı, dize işlevlerindeki bu tür arabellek taşmalarını engelleyen FORTIFY_SOURCE modundaki paket derlemesi nedeniyle ortaya çıkmıyor.

Kaynak: opennet.ru

Yorum ekle