Уязвимость в ядрах Linux

13/04/2004 16:54

Никита Ющенко из МГУ опубликовал в BUGTRAQ информацию, согласно которой возможно выполнение локального DoS в Linux с ядрами 2.4, 2.6. Уязвимость (или баг) связана с механизмом работы нитей (linuxthreads). При завершении одной из нитей другая нить того же процесса получает сигнал 33 (SIGRT_1), что свидетельствует о завершении соседней нити при этом завершившаяся нить находится в статусе "zombie". В случае генерации сигнала, соответствующий код ядра размещается в объекте, который называется "struct sigqueue", который держит информацию о сигнале до момента доставки другой нити. Однако в этой структуре может быть одновременно размещено ограниченное количество информации. Для сигналов с идентификаторами меньше 32 в коде ядра есть механизм, позволяющий доставить сигнал независимо от состояния объекта "struct sigqueue". В случае же описываемого сигнала 33 в случае невозможности помещения информации в "struct sigqueue" просто возвращается значение -EAGAIN. В результате процесс не будет оповещён о завершении нити и закончившаяся нить останется в состоянии "zombie". Для long-living процессов, порождающих много short-living нитей (например, mysqld), переполнение таблицы процессов происходит за несколько минут. В результате возникает типичная ситуация DoS. Автором написан исходный код эксплоита. В ядрах 2.6, использующих NPTL, механизм оповещения процессов несколько другой, однако и там существует возможность DoS.
Подробности