Недавно появилась новость о том, что исследователи из команды Google Project Zero разработали un метод эксплуатации уязвимостей в ядре Linux вызвано разыменованием указателя NULL.
До сих пор, проблемы связанный с ядром с разыменованием указателей NULL не получили должного внимания, так как было сочтено нереальным превратить такие проблемы в атаки, которые привели бы к повышению привилегий или выполнению собственного кода (запрещено отображать непривилегированные процессы в нижнюю область адресного пространства).
Как общее правило, такие ошибки приводят к генерации предупреждений oops ядром, после чего проблемные задачи завершаются и состояние восстанавливается без необходимости остановки системы.
Новый метод атаки основан на обработке состояний «упс»., что может привести к увеличению значения счетчика ссылок (refcount), что, в свою очередь, может привести к переполнению счетчика и освобождению памяти, связанной с refcount.
В этом случае эксплуатация сводится к манипуляциям, характерным для атак use-after-free (возникает ситуация, когда счетчик ссылок на объект становится равным нулю, память освобождается, но на самом деле остаются рабочие ссылки, указывающие на освобожденную память).
В настоящее время, когда ядро Linux инициирует нулевое разыменование из контекста процесса, оно генерирует ой , что отличается от паники ядра. Паника возникает, когда ядро определяет, что нет безопасного способа продолжить выполнение, и поэтому все выполнение должно быть остановлено. Тем не менее, ядро нет останавливает все выполнение для oops; вместо этого ядро пытается восстановиться как можно лучше и продолжает выполнение.
Разыменование указателя NULL используется здесь как способ контролируемой генерации состояния "oops". Проблема в том, что для достижения переполнения 232-битного счетчика ссылок требуется около 32 вызовов состояния "oops".
С практической точки зрения, для выполнения атаки требуется около 8 дней непрерывной генерации состояний «упс» используя предложенный эксплойт. В случае успеха эксплойт позволяет добиться выполнения кода на уровне ядра.
Разыменование указателя NULL, используемое в эксплойте, было исправлено в октябре, но, поскольку подобные проблемы не являются редкостью и ранее рассматривались как ошибки, а не уязвимости, разработчики добавят общую защиту в ядро Linux для предотвращения атак, манипулирующих генерацией «oops». ."
В случае задачи это означает отказ от существующего стека ядра и переход непосредственно к make_task_dead, который вызывает do_exit. Ядро также отправит в dmesg журнал «сбоев» и трассировку ядра, показывающую, в каком состоянии было ядро, когда произошла ошибка. Это может показаться странным выбором, когда явно произошло повреждение памяти; однако цель состоит в том, чтобы упростить обнаружение и регистрацию ошибок ядра в соответствии с философией, согласно которой работающую систему намного легче отлаживать, чем неработающую.
В частности, ядро 6.2 включает изменения, ограничивающие максимальное количество "oops". После достижения лимита, который по умолчанию установлен в 10 тысяч oops (при желании его можно изменить через параметр oops_limit), ядро инициирует переход в состояние «паники» с последующей перезагрузкой, что не позволит количество итераций, необходимых для сброса refcount до нуля.
Также планируется, что ограничение будет перенесено на ранее выпущенные, но еще поддерживаемые ветки ядра, а также на пакеты ядра популярных дистрибутивов.
В конце концов если вам интересно узнать об этом больше, вы можете проверить подробности в по следующей ссылке.