Исследователи представили способ эксплуатации уязвимости в обход патча.
Как сообщают специалисты компании Bindecy, обновление для уязвимости Dirty COW исправляет ее не полностью.
Обнаруженная в прошлом году серьезная уязвимость в Linux под названием Dirty COW связана с ошибкой состояния операции (race condition), возникающей при работе подсистемы памяти ядра с механизмом копирования при записи (Copy-On-Write, COW). С ее помощью злоумышленник может повысить свои привилегии и записать данные в области памяти, предназначенной только для чтения.
Проблема также затрагивает ОС Android. Даже после того, как Google выпустила патч, ИБ-эксперты продолжали фиксировать атаки на Android с использованием Dirty COW. Самое последнее вредоносное ПО, эксплуатирующее данную уязвимость, было проанализировано в сентябре текущего года.
Если сама уязвимость вызвала большой резонанс, то патч для нее, похоже, никого особо не заинтересовал. Иначе как объяснить, почему в течение целого года с момента его выпуска никто не заметил, что обновление не устраняет проблему до конца?
Уязвимость затрагивает функцию get_user_pages, использующуюся для получения доступа к страницам по их виртуальным адресам в пользовательских процессах. Как уже упоминалось выше, с помощью Dirty COW можно писать поверх страниц, предназначенных только для чтения. Однако патч не ограничивает запрашиваемые привилегии, отмечают исследователи Bindecy. Вместо этого «функция get_user_pages теперь помнит тот факт, что мы проходили через цикл COW», поясняют они. Поэтому в следующем цикле запись поверх страниц, предназначенных только для чтения, может осуществляться только в случае, если указаны флаги FOLL_FORCE и FOLL_COW, а элементы таблицы страниц (PTE) обозначены как грязные.
Патч предполагает, что PTE никогда не укажет на предназначенную только для чтения привилегированную копию страницы с грязным битом. Здесь, по мнению исследователей, и кроется проблема. Уязвимость по-прежнему можно проэксплуатировать с использованием Transparent Huge Pages (THP) и Page Medium Directory (PMD).
Linux обычно использует 4096-байтные страницы, однако размер страниц THP может достигать 2 МБ, даже если их объединить в нормальные страницы. THP реализуются путем включения PAGE_PSE, из-за чего PMD указывает на 2-мегабайтную физическую страницу вместо директории в PTE.
По словам исследователей, проблема возникает, когда речь идет об объемных PMD. «Страница может обозначаться грязным битом без прохождения цикла COW с помощью функции touch_pmd», сообщили исследователи. Каждый раз, когда get_user_pages пытается получить доступ к объемным страницам, вызываемая функция приводит к обозначению страниц грязным битом без прохождения цикла COW. Таким образом, логика can_follow_write_pmd не работает должным образом.
Дальнейшая эксплуатация уязвимости очевидна, считают исследователи. Можно воспользоваться схемой эксплуатации оригинальной Dirty COW, только теперь после избавления от копированной версии страницы нужно сделать так, чтобы появилась оригинальная страница, а затем включить грязный бит.
От классики до авангарда — наука во всех жанрах