በ ctypes ውስጥ ያልተረጋገጡ ክፍልፋይ ቁጥሮችን በሚይዝበት ጊዜ በፓይዘን ውስጥ ተጋላጭነት

የ Python ፕሮግራሚንግ ቋንቋ 3.7.10 እና 3.6.13 የማስተካከያ ልቀቶች ይገኛሉ፣ ይህም ተጋላጭነትን የሚያስተካክል (CVE-2021-3177) ያልተረጋገጠ ተንሳፋፊ ነጥብ ቁጥሮች ሲተይቡ በሚጠሩ ተቆጣጣሪዎች ውስጥ ወደ ኮድ አፈፃፀም ሊያመራ ይችላል . ችግሩ የ 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 ማስመጣት; x = ctypes.c_double.from_param (1e300); repr(x)

ችግሩ በዴቢያን ፣ ኡቡንቱ እና ፍሪቢኤስዲ ውስጥ እንዳልተስተካከለ ይቆያል ፣ ግን ቀድሞውኑ በአርክ ሊኑክስ ፣ ፌዶራ ፣ SUSE ውስጥ ተስተካክሏል። በRHEL ውስጥ፣ በFORTIFY_SOURCE ሁነታ ላይ ባለው የጥቅል ስብስብ ምክንያት ተጋላጭነቱ አይከሰትም፣ ይህም በሕብረቁምፊ ተግባራት ውስጥ እንደዚህ ያሉ ቋት መትረፍን የሚያግድ ነው።

ምንጭ: opennet.ru

አስተያየት ያክሉ