Pythonin haavoittuvuus käsiteltäessä vahvistamattomia murtolukuja ctypeissä

Python-ohjelmointikielistä 3.7.10 ja 3.6.13 on saatavilla korjaavia julkaisuja, jotka korjaavat haavoittuvuuden (CVE-2021-3177), joka voi johtaa koodin suorittamiseen käsittelijöissä, jotka kutsuvat C-funktioita ctypes-mekanismin avulla. . Ongelma koskee myös Python 3.8- ja 3.9-haaroja, mutta niiden päivitykset ovat edelleen julkaisuehdokkaan tilassa (julkaisu ajoittuu 1. maaliskuuta).

Ongelman aiheuttaa puskurin ylivuoto ctypes-funktiossa PyCArg_repr(), joka johtuu sprintf:n vaarallisesta käytöstä. Erityisesti muunnoksen 'sprintf(buffer, " käsittelyn tulos ", self->tag, self->value.b)" varasi 256 tavun staattisen puskurin ("char buffer[256]"), kun taas tulos saattoi ylittää tämän arvon. Tarkistaaksesi sovellusten haavoittuvuuden haavoittuvuudelle voit yrittää välittää arvon "1e300", joka c_double.from_param-menetelmällä käsiteltynä johtaa kaatumiseen, koska tuloksena oleva luku sisältää 308 merkkiä eikä mahdu 256-tavuinen puskuri. Esimerkki ongelmallisesta koodista: import ctypes; x = ctypes.c_double.from_param(1e300); repr(x)

Ongelma on edelleen korjaamaton Debianissa, Ubuntussa ja FreeBSD:ssä, mutta se on jo korjattu Arch Linuxissa, Fedorassa ja SUSE:ssa. RHEL:ssä haavoittuvuutta ei esiinny pakettien kokoonpanon vuoksi FORTIFY_SOURCE-tilassa, joka estää tällaiset puskurin ylivuodot merkkijonofunktioissa.

Lähde: opennet.ru

Lisää kommentti