Осебпазирӣ дар Python ҳангоми коркарди рақамҳои касри беасос дар ctypes

Варақаҳои ислоҳкунандаи забони барномасозии Python 3.7.10 ва 3.6.13 дастрасанд, ки осебпазириро (CVE-2021-3177) ислоҳ мекунанд, ки метавонад ба иҷроиши код ҳангоми коркарди рақамҳои шинокунандаи беэътибор дар коркардкунандагоне, ки функсияҳои C-ро бо истифода аз механизми ctypes даъват мекунанд, оварда расонад. . Мушкилот инчунин ба шохаҳои Python 3.8 ва 3.9 таъсир мерасонад, аммо навсозиҳо барои онҳо то ҳол дар мақоми номзади релиз қарор доранд (барориши 1 март ба нақша гирифта шудааст).

Мушкилот аз пур шудани буфер дар функсияи ctypes PyCArg_repr(), ки аз сабаби истифодаи хатарноки sprintf рух медиҳад, ба вуҷуд омадааст. Аз ҷумла, барои коркарди натиҷаи табдили 'sprintf(buffer, " ", self->tag, self->value.b)' буфери статикии 256 байт ("char buffer [256]") ҷудо кардааст, дар ҳоле ки натиҷа метавонад аз ин арзиш зиёд бошад. Барои санҷидани осебпазирии барномаҳо ба осебпазирӣ, шумо метавонед кӯшиш кунед, ки арзиши "1e300" -ро гузаронед, ки ҳангоми коркард бо усули c_double.from_param боиси садама мегардад, зеро рақами натиҷавӣ 308 аломатро дар бар мегирад ва ба як аломат мувофиқат намекунад. буфери 256-байт. Намунаи рамзи мушкилот: ctypes import; x = ctypes.c_double.from_param(1e300); repr(x)

Мушкилот дар Debian, Ubuntu ва FreeBSD ҳалнашуда боқӣ мемонад, аммо аллакай дар Arch Linux, Fedora, SUSE ҳал карда шудааст. Дар RHEL осебпазирӣ аз сабаби васлкунии бастаҳо дар реҷаи FORTIFY_SOURCE, ки чунин фаромадани буферро дар функсияҳои сатр блок мекунад, рух намедиҳад.

Манбаъ: opennet.ru

Илова Эзоҳ