Роот рањивост у Линук кернелу и ускраћивање услуге у системд-у

Истраживачи безбедности из компаније Куалис открили су детаље о две рањивости које утичу на Линук кернел и системски менаџер система. Рањивост у кернелу (ЦВЕ-2021-33909) омогућава локалном кориснику да постигне извршење кода са роот правима кроз манипулацију високо угнежђеним директоријумима.

Опасност од рањивости погоршава чињеница да су истраживачи успели да припреме радне експлоатације које раде на Убунту 20.04/20.10/21.04, Дебиан 11 и Федора 34 у подразумеваној конфигурацији. Напомиње се да друге дистрибуције нису тестиране, али су теоретски такође подложне проблему и могу бити нападнуте. Обећано је да ће комплетан код експлоатације бити објављен након што се проблем свуда елиминише, али за сада је доступан само прототип ограничене функционалности, што узрокује пад система. Проблем је присутан од јула 2014. и утиче на издања кернела почевши од 3.16. Исправка рањивости је координирана са заједницом и прихваћена у кернел 19. јула. Главне дистрибуције су већ генерисале исправке за своје пакете кернела (Дебиан, Убунту, Федора, РХЕЛ, СУСЕ, Арцх).

Рањивост је узрокована неуспехом да се провери резултат конверзије сизе_т у инт пре извођења операција у коду сек_филе, који креира датотеке из низа записа. Неуспех провере може довести до уписивања ван граница у бафер приликом креирања, монтирања и брисања веома угнежђене структуре директоријума (величина путање већа од 1 ГБ). Као резултат тога, нападач може да постигне низ од 10 бајта „//делетед“ написан са помаком од „-2 ГБ - 10 бајтова“ који указује на област која непосредно претходи додељеном баферу.

Припремљени експлоат захтева 5 ГБ меморије и 1 милион слободних инода за рад. Експлоатација функционише тако што позива мкдир() да креира хијерархију од око милион поддиректоријума како би се постигла величина путање датотеке која прелази 1 ГБ. Овај директоријум се монтира преко бинд-моунт у посебан кориснички простор имена, након чега се покреће функција рмдир() да га уклони. Паралелно, креира се нит која учитава мали еБПФ програм, који је блокиран у фази након провере еБПФ псеудокода, али пре његове ЈИТ компилације.

У непривилегованом корисничком именском простору отвара се датотека /проц/селф/моунтинфо и чита се дугачко име путање директоријума монтираног на везивање, што доводи до тога да се стринг „//делетед“ уписује у област пре почетка бафера. Позиција за писање линије је изабрана тако да преписује инструкцију у већ тестираном, али још несастављеном еБПФ програму.

Затим, на нивоу програма еБПФ, неконтролисано писање ван бафера се трансформише у контролисану способност читања и писања у друге структуре кернела кроз манипулацију структурама бтф и мап_пусх_елем. Као резултат тога, експлоатација одређује локацију бафера модпробе_патх[] у меморији кернела и преписује путању „/сбин/модпробе“ у њој, што вам омогућава да покренете покретање било које извршне датотеке са роот правима у случају рекуест_модуле() позив, који се извршава, на пример, приликом креирања нетлинк соцкета.

Истраживачи пружају неколико решења која су ефикасна само за одређени експлоат, али не елиминишу сам проблем. Препоручује се да подесите "/проц/сис/кернел/унпривилегед_усернс_цлоне" на 0 да бисте онемогућили монтирање директоријума у ​​засебном корисничком ИД именском простору, а "/проц/сис/кернел/унпривилегед_бпф_дисаблед" на 1 да бисте онемогућили учитавање еБПФ програма у кернел.

Важно је напоменути да су истраживачи наишли на још једну рањивост (ЦВЕ-2021-33910) која утиче на системски менаџер система, док су анализирали алтернативни напад који укључује употребу механизма ФУСЕ уместо бинд-моунд за монтирање великог директоријума. Испоставило се да када покушате да монтирате директоријум чија је путања већа од 8 МБ преко ФУСЕ-а, процес иницијализације контроле (ПИД1) остаје без меморије стека и пада, што доводи систем у „панично“ стање.

Проблем је у томе што системд прати и анализира садржај /проц/селф/моунтинфо и обрађује сваку тачку монтирања у функцији унит_наме_патх_есцапе(), која изводи стрдупа() операцију која ставља податке на стек уместо у динамички додељену меморију . Пошто је максимална величина стека ограничена преко РЛИМИТ_СТАЦК, обрада превелике путање до тачке монтирања доводи до пада ПИД1 процеса и заустављања система. За напад, можете користити најједноставнији ФУСЕ модул у комбинацији са коришћењем високо угнежђеног директоријума као тачке монтирања, чија величина путање прелази 8 МБ.

Проблем се појављује од системд 220 (април 2015), већ је поправљен у главном системд спремишту и поправљен у дистрибуцијама (Дебиан, Убунту, Федора, РХЕЛ, СУСЕ, Арцх). Посебно, у системд издању 248 експлоатација не функционише због грешке у системд коду која узрокује неуспех обраде /проц/селф/моунтинфо. Занимљиво је и да је 2018. године настала слична ситуација и када су покушавали да напишу експлоатацију за ЦВЕ-2018-14634 рањивост у језгру Линука, истраживачи Куалиса су наишли на три критичне рањивости у системд-у.

Извор: опеннет.ру

Додај коментар