Изследователи от екипа на Google Project Zero публикуваха метод за експлоатация на уязвимост (CVE-2020-29661) в реализацията на ioctl обработвача TIOCSPGRP от tty подсистемата на ядрото на Linux и подробно разгледаха механизмите за защита, които биха могли да блокират подобни уязвимости.
Проблемният бъг беше отстранен в ядрото на Linux още на 3 декември миналата година. Проблемът се проявява в ядрото до версия 5.9.13, но повечето дистрибуции вече са отстранили проблема с актуализации на пакетите с ядро, предложени още миналата година (Debian, RHEL, SUSE, Ubuntu, Fedora, Arch). Похожие уязвимости (CVE-2020-29660) бяха открити едновременно в реализацията на ioctl извикването TIOCGSID, но и те вече са широко отстранени.
Проблемът е причинен от грешка при настройка на заключвания, която води до състезателно състояние в кода drivers/tty/tty_jobctrl.c, което успя да бъде използвано за създаване на условия за достъп до паметта след освобождаване (use-after-free), експлоатирани от пространството на потребителя чрез манипулации с ioctl извикването TIOCSPGRP. Работещ експлоит е демонстриран за повишаване на привилегиите в Debian 10 с ядро 4.19.0-13-amd64.
В публикуваната статия акцентът не е поставен толкова на техниката за създаване на работещ експлоит, а на инструментите в ядрото, които съществуват за защита от подобни уязвимости. Изводът не е утешителен, методи като сегментиране на паметта в купа и контрол за достъп до паметта след освобождаване не се прилагат на практика, тъй като водят до намаляване на производителността, а защитата на базата на CFI (Control Flow Integrity), която блокира експлоити на по-късни етапи на атаката, изисква доработка.
При разглеждане на това, което би могло да промени ситуацията в дългосрочен план, се акцентира на използването на напреднали статични анализатори или на езици, които осигуряват безопасна работа с паметта, като Rust и диалекти на езика C с разширени анотации (например, Checked C), на етапа на сборка, проверяващи състоянието на заключванията, обектите и указателите. Сред методите за защита също се споменава активиране на режима panic_on_oops, превод на структурите на ядрото в режим само за четене и ограничаване на достъпа до системните извиквания чрез такива механизми, като seccomp.
Източник: opennet.ru
