Осенью 2016 года в ядре Linux была выявлена и исправлена уязвимость CVE-2016-5195, получившая имя Dirty COW, существовала в коде начиная с версии 2.6.22, то есть с 2007 года. Проблема была связана с тем, как подсистема памяти ядра работает с механизмом copy-on-write (COW). Эксплуатируя баг можно спровоцировать так называемое состояние гонки. В итоге неавторизованный локальный пользователь получает доступ к memory mappings с правом записи, тогда как в нормальной ситуации доступ должен ограничивать только чтением (read-only).
Кроме того, Dirty COW представляла проблему для устройств, работающих на базе Android. К примеру, Dirty COW и ее производные можно использовать против Android для получения root-доступа к системе. Также от Dirty COW не спасала даже контейнерная виртуализация.
Теперь, спустя год после обнаружения уязвимости, выяснилось, что тогда проблему Dirty COW устранили не до конца. К такому выводу пришли эксперты компании Bindecy, уже опубликовавшие все подробности проведенного исследования в своем блоге.
Так, оригинальная проблема касалась функции get_user_pages, которая используется для получения реальных физических страниц, стоящих за виртуальными адресами. По сути, уязвимость позволяла осуществлять запись для страниц с привилегиями read-only. Но, по словам исследователей, патч лишь «научил» get_user_pages запоминать тот факт, что цикл COW уже был пройден.
«С выходом исправления для проблемы Dirty COW (CVE-2016-5195) работу функции can_follow_write_pmd() изменили таким образом, чтобы она принимала во внимание новый флаг FOLL_COW (8310d48b125d 'mm/huge_memory.c: respect FOLL_FORCE/FOLL_COW for thp')», — пишут специалисты.
Исследователям удалось обнаружить проблему, связанную с работой pmd_mkdirty() и touch_pmd(). Вследствие бага get_user_pages может обратиться к touch_pmd() и добиться подмены содержимого PMD (Page Medium Directory), сделав его «грязным». Данный сценарий нарушит новую логику работы can_follow_write_pmd(): PMD станет «грязным», не выполнив цикл COW. В итоге запись для больших страниц памяти, промаркированных read-only, по-прежнему будет возможна.
Специалисты опубликовали proof-of-concept эксплоит на GitHub и присвоили новой проблеме идентификатор CVE-2017–1000405. Для ядра Linux уже был подготовлен патч, и все крупные дистрибутивы должны обновиться в ближайшее время.