
CVE-2023-6931 PoC паники ядра
Паника ядра PoC для CVE-2023-6931
CVE-2023-6931 — это уязвимость в perf_event, которая приводит к переполнению буфера в куче, вызванному целочисленным переполнением в read_size группы.
perf_events — это среда мониторинга и анализа производительности, предоставляемая ядром Linux. Эта среда позволяет отслеживать различные данные, связанные с производительностью, генерируемые как аппаратными, так и программными компонентами.
perf_event_open
Интерфейс, который позволяет пользовательскому пространству настраивать события производительности в ядре и управлять ими.
Он используется для создания, группировки, управления событиями или чтения данных из них./proc/sys/kernel/perf_event_paranoid должно быть 1 или меньшеulimit -n.CONFIG_PERF_EVENTS должен быть установлен.Уязвимость возникает из-за целочисленного переполнения в read_size группы. Функция perf_event_validate_size выполняет проверку read_size. Однако способ проверки read_size проверяет только read_size текущего события.
Ключевой момент в том, что при каждой проверке проверяется только текущее событие, а предыдущие — нет. Если для лидера группы установлен флаг PERF_FORMAT_GROUP, простое добавление текущего события может увеличить read_size лидера группы.
Это в конечном счёте приводит к проблеме в perf_read_group. Расчёт event->read_size основан на read_format лидера группы, умноженном на nr_siblings. Поскольку переменная read_size является 2-байтовым u16, максимальное значение, которое она может содержать, равно 0xffff.
Для эксплуатации этой уязвимости атакующий сначала создаёт событие-лидера группы со всеми возможными опциями read_format. Затем создаётся множество событий-сиблингов. Эти сиблинги устанавливают только PERF_FORMAT_TOTAL_TIME_RUNNING в read_Format, чтобы избежать проблем с проверкой в perf_event_validate_size. В результате значение nr_siblings становится чрезвычайно большим, но поскольку каждое событие-сиблинг проходит проверку по отдельности, на этом этапе проблем нет.
Когда в этом состоянии вызывается perf_read_group, read_size лидера группы продолжает увеличиваться, поскольку установлен PERF_FORMAT_GROUP. В конечном итоге это приводит к целочисленному переполнению, и kzalloc выделяет очень маленький буфер. Однако, поскольку фактическое количество событий очень велико, происходит переполнение буфера в куче, вызывающее панику ядра.