Ctypes-д хүчингүй болсон бутархай тоотой ажиллах үед Python дахь эмзэг байдал

Python програмчлалын хэлний 3.7.10 болон 3.6.13-ын залруулах хувилбарууд байгаа бөгөөд энэ нь ctypes механизмыг ашиглан C функцийг дууддаг зохицуулагчид хүчин төгөлдөр бус хөвөгч цэгийн дугаарыг боловсруулах үед кодыг гүйцэтгэхэд хүргэж болзошгүй эмзэг байдлыг (CVE-2021-3177) зассан. . Асуудал нь Python 3.8 болон 3.9-ийн салбаруудад ч нөлөөлж байгаа боловч тэдгээрийн шинэчлэлтүүд нэр дэвшигчийн статустай хэвээр байна (1-р сарын XNUMX-нд гаргахаар төлөвлөж байна).

Асуудал нь sprintf-г аюултай ашигласны улмаас үүссэн ctypes функцийн PyCArg_repr() дахь буфер хэт ихэссэнээс үүдэлтэй. Ялангуяа 256 байт хэмжээтэй статик буфер ("char buffer" [256]") байхад үр дүн нь энэ утгаас хэтэрч болзошгүй. Аппликешнүүдийн эмзэг байдлын эмзэг байдлыг шалгахын тулд та "1e300" утгыг оруулахыг оролдож болно, үүнийг c_double.from_param аргаар боловсруулахад гарсан тоо нь 308 тэмдэгтийг агуулж байгаа тул алдаа гаргахад хүргэдэг. 256 байт буфер. Асуудалтай кодын жишээ: import ctypes; x = ctypes.c_double.from_param(1e300); repr(x)

Асуудал Debian, Ubuntu болон FreeBSD дээр шийдэгдээгүй хэвээр байгаа боловч Arch Linux, Fedora, SUSE дээр аль хэдийн засагдсан. RHEL-д FORTIFY_SOURCE горим дахь багцын угсралтын улмаас эмзэг байдал үүсэхгүй бөгөөд энэ нь мөрийн функцууд дахь буферийн халилтыг блоклодог.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх