Состојба на трка во собирачот на ѓубре на кернелот на Linux што може да доведе до ескалација на привилегиите

Јан Хорн од тимот на Google Project Zero, кој еднаш ги идентификуваше ранливостите на Spectre и Meltdown, објави техника за искористување на ранливост (CVE-2021-4083) во собирачот на ѓубре на кернелот на Linux. Ранливоста се должи на состојба на трка при чистење на дескриптори на датотеки на уникс приклучоци и потенцијално дозволува локалниот непривилегиран корисник да го изврши својот код на ниво на јадрото.

Проблемот е интересен затоа што временскиот прозорец за време на кој се јавува состојбата на трката се проценува дека е премногу мал за да се создадат вистински експлоатирања, но авторот на студијата покажа дека дури и таквите првично скептични пропусти можат да станат извор на вистински напади ако креаторот на експлоатацијата има потребните вештини и време. Јан Хорн покажа како, со помош на филигрански манипулации, можете да ја намалите состојбата на трката што се јавува при повикување на функциите close() и fget() истовремено во целосно експлоатибилна ранливост за користење после бесплатно и да постигнете пристап до веќе ослободени податоци структура во внатрешноста на јадрото.

Состојба за трка се јавува за време на процесот на затворање на дескриптор на датотека додека истовремено се повикуваат close() и fget(). Повикот за затворање() може да се појави пред да се изврши fget(), што ќе го збуни собирачот на ѓубре бидејќи, според refcount, структурата на датотеката нема да има надворешни референци, туку ќе остане прикачена на дескрипторот на датотеката, т.е. Собирачот на ѓубре ќе мисли дека има ексклузивен пристап до структурата, но всушност, за краток временски период, преостанатиот запис во табелата со дескриптори на датотеки сè уште ќе укажува на ослободување на структурата.

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

Втората важна карактеристика беше употребата на прекини генерирани од хардверски тајмер за да се зголеми времето на состојбата на трката. Моментот беше избран така што управувачот со прекини ќе пука кога ќе се појави состојба на трка и ќе го прекине извршувањето на кодот некое време. За дополнително одложување на враќањето на контролата, околу 50 илјади записи во редот на чекање беа генерирани со помош на epoll, што бараше пребарување низ управувачот со прекини.

Техниката за искористување на ранливоста беше откриена по 90-дневен период на необјавување. Проблемот се појавува уште од кернелот 2.6.32 и беше поправен на почетокот на декември. Поправката беше вклучена во кернелот 5.16 и исто така беше префрлена во LTS гранките на пакетите на јадрото и кернелот испорачани во дистрибуции. Вреди да се одбележи дека ранливоста беше идентификувана при анализата на сличен проблем CVE-2021-0920, кој се манифестира во собирачот на ѓубре при обработка на знамето MSG_PEEK.

Извор: opennet.ru

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