Ranjivost u Pythonu pri rukovanju nepotvrđenim razlomačkim brojevima u ctypes

Dostupna su ispravna izdanja programskog jezika Python 3.7.10 i 3.6.13 koja popravljaju ranjivost (CVE-2021-3177) koja bi mogla dovesti do izvršavanja koda prilikom obrade nevažećih brojeva s pomičnim zarezom u rukovateljima koji pozivaju C funkcije pomoću ctypes mehanizma . Problem također utječe na grane Python 3.8 i 3.9, ali ažuriranja za njih su još uvijek u statusu kandidata za izdanje (izdanje je zakazano za 1. ožujka).

Problem je uzrokovan prekoračenjem međuspremnika u ctypes funkciji PyCArg_repr(), do kojeg dolazi zbog nesigurne upotrebe sprintf-a. Konkretno, za obradu rezultata transformacije 'sprintf(buffer, " ", self->tag, self->value.b)' je dodijelio statički međuspremnik od 256 bajtova ("char buffer[256]"), dok je rezultat mogao premašiti ovu vrijednost. Da biste provjerili ranjivost aplikacija na ranjivost, možete pokušati proslijediti vrijednost "1e300", koja će, kada se obradi metodom c_double.from_param, dovesti do rušenja, budući da rezultirajući broj sadrži 308 znakova i ne uklapa se u Međuspremnik od 256 bajta. Primjer problematičnog koda: import ctypes; x = ctypes.c_double.from_param(1e300); repr(x)

Problem ostaje neriješen u Debianu, Ubuntuu i FreeBSD-u, ali je već riješen u Arch Linuxu, Fedori, SUSE. U RHEL-u se ranjivost ne pojavljuje zbog sastavljanja paketa u načinu rada FORTIFY_SOURCE, koji blokira takva prekoračenja međuspremnika u funkcijama niza.

Izvor: opennet.ru

Dodajte komentar