በሊኑክስ ከርነል ውስጥ የስር ተጋላጭነት እና በስርዓትd ውስጥ አገልግሎትን መከልከል

የኳሊስ የደህንነት ተመራማሪዎች በሊኑክስ ከርነል እና በስርዓተ-ስርዓት አስተዳዳሪ ላይ ተጽዕኖ የሚያሳድሩ ሁለት ተጋላጭነቶችን ዝርዝሮች ገልጠዋል። በከርነል ውስጥ ያለው ተጋላጭነት (CVE-2021-33909) የአካባቢያዊ ተጠቃሚ በጣም የጎጆ ማውጫዎችን በመጠቀም ከስር መብቶች ጋር ኮድ አፈፃፀምን እንዲያገኝ ያስችለዋል።

ተመራማሪዎቹ በነባሪ ውቅር ውስጥ በኡቡንቱ 20.04/20.10/21.04፣ Debian 11 እና Fedora 34 ላይ የሚሰሩ የስራ ብዝበዛዎችን ማዘጋጀት በመቻላቸው የተጋላጭነቱ አደጋ ተባብሷል። ሌሎች ስርጭቶች አልተሞከሩም ነገር ግን በንድፈ ሀሳብ ለችግሩ የተጋለጡ እና ሊጠቁ እንደሚችሉም ተጠቅሷል። የብዝበዛዎች ሙሉ ኮድ ችግሩ በሁሉም ቦታ ከተወገደ በኋላ እንደሚታተም ቃል ገብቷል, አሁን ግን የተገደበ ተግባራዊነት ምሳሌ ብቻ ነው, ይህም ስርዓቱ እንዲበላሽ አድርጓል. ችግሩ ከጁላይ 2014 ጀምሮ የነበረ እና ከ3.16 ጀምሮ የከርነል ልቀቶችን ይነካል። የተጋላጭነት ማስተካከያው ከማህበረሰቡ ጋር የተቀናጀ እና በጁላይ 19 ወደ ከርነል ተቀባይነት አግኝቷል። ዋናዎቹ ስርጭቶች የከርነል ጥቅሎቻቸው (Debian፣ Ubuntu፣ Fedora፣ RHEL፣ SUSE፣ Arch) ዝማኔዎችን አስቀድመው ፈጥረዋል።

ተጋላጭነቱ የሚከሰተው በሴክ_ፋይል ኮድ ውስጥ ስራዎችን ከመስራቱ በፊት የመጠን_t ወደ ኢንት ልወጣ ውጤቱን ባለማረጋገጥ ሲሆን ይህም ፋይሎችን ከተከታታይ መዛግብት ይፈጥራል። ማረጋገጥ አለመቻል በጣም የጎጆ የማውጫ መዋቅር ሲፈጥሩ፣ ሲጫኑ እና ሲሰርዙ ከክልል ውጭ መፃፍን ሊያስከትል ይችላል (የመንገዱ መጠን ከ1 ጊባ በላይ)። በዚህ ምክንያት አንድ አጥቂ በ "-10 ጂቢ - 2 ባይት" ማካካሻ የተጻፈ ባለ 10 ባይት ሕብረቁምፊ ማሳካት ይችላል -XNUMX ጂቢ - XNUMX ባይት ወዲያውኑ ከተመደበው ቋት በፊት ያለውን ቦታ ያሳያል።

የተዘጋጀው ብዝበዛ ለመስራት 5 ጂቢ ማህደረ ትውስታ እና 1 ሚሊዮን ነፃ ኢንኖዶችን ይፈልጋል። ብዝበዛው የሚሰራው mkdir() በመደወል ከ1 ጂቢ በላይ የሆነ የፋይል መንገድ መጠን ለማግኘት ወደ አንድ ሚሊዮን የሚጠጉ ንዑስ ማውጫዎች ተዋረድ ለመፍጠር ነው። ይህ ማውጫ በተለየ የተጠቃሚ ስም ቦታ በቢንድ-mount በኩል ተጭኗል፣ከዚያም እሱን ለማስወገድ የrmdir() ተግባር ይሰራል። በትይዩ፣ ትንሽ የኢቢፒኤፍ ፕሮግራምን የሚጭን ክር ይፈጠራል፣ ይህም eBPF pseudocodeን ከተመለከተ በኋላ በደረጃው ላይ የታገደ ነገር ግን የጂአይቲ ማጠናቀር በፊት።

በማይጠቅም የተጠቃሚነት ስም ቦታ ፋይሉ/proc/self/mountinfo ይከፈታል እና የቢንድ-mounted ማውጫው ረጅም የዱካ ስም ይነበባል፣ በዚህም ምክንያት ቋቱ ከመጀመሩ በፊት "// ተሰርዟል" የሚለው ሕብረቁምፊ ወደ አካባቢው ይጻፋል። መስመሩን የሚጽፍበት ቦታ የሚመረጠው ቀድሞ በተፈተነው ግን ገና ያልተጠናቀረ የኢቢፒኤፍ ፕሮግራም ውስጥ ያለውን መመሪያ እንዲጽፍ ነው።

በመቀጠል፣ በ eBPF ፕሮግራም ደረጃ፣ ከቁጥጥር ውጪ የሆነ ጽሑፍ የbtf እና map_push_elem መዋቅሮችን በማጭበርበር ወደ ሌሎች የከርነል መዋቅሮች የማንበብ እና የመፃፍ ችሎታ ይለወጣል። በዚህ ምክንያት ብዝበዛው የ modprobe_path[] ቋት በከርነል ማህደረ ትውስታ ውስጥ የሚገኝበትን ቦታ ይወስናል እና በውስጡ ያለውን የ"/sbin/modprobe" ዱካ ይተካዋል፣ይህም በሚከሰትበት ጊዜ ማንኛውንም ተፈጻሚ ፋይል ከስር መብቶች ጋር ለማስጀመር ያስችልዎታል። request_module () ጥሪ, ይህም የሚፈጸመው, ለምሳሌ, netlink ሶኬት ሲፈጥሩ.

ተመራማሪዎች ለአንድ የተወሰነ ብዝበዛ ብቻ ውጤታማ የሆኑ በርካታ መፍትሄዎችን ይሰጣሉ, ነገር ግን ችግሩን በራሱ አያስወግዱትም. በተለየ የተጠቃሚ መታወቂያ የስም ቦታ ላይ የመጫኛ ማውጫዎችን ለማሰናከል "/proc/sys/kernel/unprivileged_userns_clone"ን ወደ 0 ለማቀናበር እና "/proc/sys/kernel/unprivileged_bpf_disabled"ን ወደ 1 ለማቀናበር የኢቢኤፍኤፍ ፕሮግራሞችን ወደ ከርነሉ ለማሰናከል ይመከራል።

ትልቅ ዳይሬክተሪ ለመጫን ከማሰር-ሞውንድ ይልቅ የ FUSE ዘዴን መጠቀምን የሚያካትት አማራጭ ጥቃትን ሲተነተን፣ ተመራማሪዎቹ በስርዓተ-ስርዓት አስተዳዳሪ ላይ ተጽዕኖ የሚያሳድረው ሌላ ተጋላጭነት (CVE-2021-33910) ማጋጠማቸው ትኩረት የሚስብ ነው። በ FUSE በኩል ከ 8 ሜባ በላይ የሆነ የመንገድ መጠን ያለው ማውጫ ለመጫን ሲሞክሩ የቁጥጥር ማስጀመሪያ ሂደት (PID1) ከቁልል ማህደረ ትውስታ አልቆ እና ብልሽቶች እንደፈጠሩ ታወቀ ፣ ይህም ስርዓቱን በ “አስደንጋጭ” ሁኔታ ውስጥ ያደርገዋል።

ችግሩ በስርአት የተዘረጋው /proc/self/mountinfo ይዘቶችን በመተንተኑ እና እያንዳንዱን ተራራ ነጥብ በ unit_name_path_escape() ተግባር ውስጥ ማስኬድ ነው፣ይህም በተለዋዋጭ የተመደበ ማህደረ ትውስታ ውስጥ ሳይሆን ውሂቡን በቁልል ላይ የሚያስቀምጥ strdupa() ክወና ነው። . ከፍተኛው የቁልል መጠን በRLIMIT_STACK የተገደበ ስለሆነ ወደ ተራራው ነጥብ የሚወስደውን መንገድ በጣም ትልቅ ማካሄድ የPID1 ሂደት እንዲበላሽ እና ስርዓቱ እንዲቆም ያደርገዋል። ለጥቃቱ በጣም ቀላል የሆነውን FUSE ሞጁሉን እንደ ማፈናጠጫ ነጥብ በመጠቀም በጣም ቀላል የሆነውን የ FUSE ሞጁል መጠቀም ይችላሉ ፣ የመንገዱ መጠን ከ 8 ሜባ ይበልጣል።

ችግሩ ከስርአት 220 (ኤፕሪል 2015) ጀምሮ እየታየ ነው፣ አስቀድሞ በዋናው የስርዓት ማከማቻ ማከማቻ ውስጥ ተስተካክሎ እና በስርጭት (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) ተስተካክሏል. በተለይም በስርዓተ ክወና 248 መጠቀሚያው አይሰራም በሲስተድ ኮድ ውስጥ ባለ ስህተት የ/proc/self/mountinfo ሂደት እንዳይሳካ ያደርገዋል። በተጨማሪም በ 2018 ተመሳሳይ ሁኔታ መከሰቱ እና በሊኑክስ ከርነል ውስጥ ለ CVE-2018-14634 ተጋላጭነት ለመበዝበዝ ለመጻፍ ሲሞክሩ የኳሊስ ተመራማሪዎች በስርዓተ-ፆታ ውስጥ ሶስት ወሳኝ ተጋላጭነቶችን አጋጥሟቸዋል ።

ምንጭ: opennet.ru

አስተያየት ያክሉ