Стан гонкі ў зборшчыку смецця ядра Linux, здольнае прывесці да павышэння прывілеяў

Ян Хорн (Jann Horn) з каманды Google Project Zero, у свой час які выявіў уразлівасці Spectre і Meltdown, апублікаваў тэхніку эксплуатацыі ўразлівасці (CVE-2021-4083) у зборшчыку смецця ядра Linux. Уразлівасць выклікана станам гонкі пры чыстцы файлавых дэскрыптараў unix-сокетаў і патэнцыйна дазваляе лакальнаму непрывілеяванаму карыстачу дамагчыся выкананні свайго кода на ўзроўні ядра.

Праблема цікавая тым, што часавае акно, на працягу якога выяўляецца стан гонкі, ацэньвалася як занадта малаважнае для стварэння рэальных эксплоітаў, але аўтар даследавання паказаў, што нават падобныя першапачаткова скептычна разгляданыя ўразлівасці могуць стаць крыніцай рэальных нападаў, калі ў стваральніка эксплоіта ёсць неабходныя навыкі і час. Ян Хорн паказаў, як пры дапамозе філігранных маніпуляцый можна звесці стан гонкі, якое ўзнікае пры адначасовым выкліку функцый close() і fget(), да паўнавартасна эксплуатаванай уразлівасці класа use-after-free і дамагчыся звароты да ўжо вызваленай структуры дадзеных усярэдзіне ядраў.

Стан гонкі ўзнікае падчас зачынення файлавага дэскрыптара пры адначасовым выкліку функцый close() і fget(). Выклік close() можа адпрацаваць да выканання fget(), што ўвядзе зборшчык смецця ў замяшанне бо ў адпаведнасці са лічыльнікам refcount у структуры file не будзе вонкавых спасылак, але яна застанецца прымацаваная да файлавага дэскрыптара, г.зн. зборшчык смецця палічыць, што мае эксклюзіўны доступ да структуры, але фактычна невялікі прамежак часу які застаецца ў табліцы файлавых дэскрыптараў запіс яшчэ будзе паказваць на якая вызваляецца структуру.

Для павелічэння верагоднасці траплення ў стан гонкі скарыстана некалькі трукаў, якія дазволілі давесці верагоднасць поспеху эксплуатацыі да 30% пры занясенні спецыфічных для пэўнай сістэмы аптымізацый. Напрыклад, для павелічэння часу звароту да структуры з файлавымі дэскрыптарамі на некалькі сотняў нанасекунд выканана выцясненне дадзеных з працэсарнага кэша праз засмечванне кэша актыўнасцю на іншым ядры CPU, што дазволіла дамагчыся аддачы структуры з памяці, а не з хуткага кэша CPU.

Другой важнай асаблівасцю стала выкарыстанне для павелічэння часу стану гонкі перапыненняў, якія генерыруюцца апаратным таймерам. Падбіраўся такі момант, каб апрацоўшчык перапынення спрацоўваў падчас узнікнення стану гонкі і на нейкі час перапыняў выкананне кода. Для дадатковага зацягвання вяртання кіравання пры дапамозе epoll генеравалася каля 50 тысяч запісаў у waitqueue, якія патрабуюць перабору ў апрацоўшчыку перапыненняў.

Тэхніка эксплуатацыі ўразлівасці расчынена пасля 90-дзённага перыяду невыдавання. Праблема выяўляецца пачынальна з ядра 2.6.32 і ўхіленая ў пачатку снежня. Выпраўленне ўвайшло ў склад ядра 5.16, а таксама перанесена ў LTS-галінкі ядра і пакеты з ядром, якія пастаўляюцца ў дыстрыбутывах. Характэрна, што ўразлівасць была выяўлена падчас аналізу падобнай праблемы CVE-2021-0920, якая выяўляецца ў зборшчыку смецця пры апрацоўцы сцяга MSG_PEEK.

Крыніца: opennet.ru

Дадаць каментар