Стање трке у сакупљачу смећа Линук кернела које може довести до ескалације привилегија

Јанн Хорн из Гоогле Пројецт Зеро тима, који је својевремено идентификовао рањивости Спецтре и Мелтдовн, објавио је технику за искоришћавање рањивости (ЦВЕ-2021-4083) у сакупљачу смећа Линук кернела. Рањивост је последица стања трке приликом чишћења дескриптора датотека на уникс сокетима и потенцијално омогућава локалном непривилегованом кориснику да изврши свој код на нивоу кернела.

Проблем је интересантан јер је временски оквир током којег се дешава тркачко стање процењено да је премали да би створио стварне експлоатације, али је аутор студије показао да чак и такве првобитно скептичне рањивости могу постати извор стварних напада ако креатор експлоатације има потребне вештине и време. Ианн Хорн је показао како, уз помоћ филигранских манипулација, можете смањити услов трке који се јавља када се истовремено позивају функције цлосе() и фгет() у рањивост која се може у потпуности искористити и остварити приступ већ ослобођеним подацима структура унутар језгра.

Услов трке се јавља током процеса затварања дескриптора датотеке док се истовремено позивају цлосе() и фгет(). Позив цлосе() може се догодити пре него што се фгет() изврши, што ће збунити сакупљача смећа јер, према рефцоунту, структура датотеке неће имати спољне референце, већ ће остати прикачена за дескриптор датотеке, тј. Сакупљач смећа ће мислити да има ексклузивни приступ структури, али у ствари, за кратак временски период, преостали унос у табели дескриптора фајлова ће и даље указивати на то да се структура ослобађа.

Да би се повећала вероватноћа уласка у стање трке, коришћено је неколико трикова, који су омогућили повећање вероватноће успеха експлоатације на 30% када се уведу оптимизације специфичне за систем. На пример, да би се повећало време приступа структури са дескрипторима датотека за неколико стотина наносекунди, подаци су избачени из кеша процесора тако што су кеш меморију затрпали активностима на другом ЦПУ језгру, што је омогућило да се структура преузме из меморије, а не из брза ЦПУ кеш меморија.

Друга важна карактеристика била је употреба прекида које генерише хардверски тајмер за повећање времена услова трке. Тренутак је изабран тако да се руковалац прекида активира када дође до стања трке и прекине извршавање кода на неко време. Да би се повратак контроле додатно одложио, око 50 хиљада уноса у реду чекања је генерисано помоћу еполл-а, што је захтевало претрагу кроз руковалац прекида.

Техника за искоришћавање рањивости је откривена након 90-дневног периода неоткривања. Проблем се појављује од кернела 2.6.32 и решен је почетком децембра. Исправка је укључена у кернел 5.16 и такође је пребачена на ЛТС гране кернела и пакете кернела који се испоручују у дистрибуцијама. Важно је напоменути да је рањивост идентификована током анализе сличног проблема ЦВЕ-2021-0920, који се манифестује у сакупљачу смећа приликом обраде ознаке МСГ_ПЕЕК.

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

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