
эксплойт ядра Linux
Повышение привилегий в Linux с помощью системного вызова waitid. Эксплойт предоставлен @XeR_0x2A и @chaign_c из HexpressoTeam только для образовательных целей.
Ошибка была внесена 2017-05-21 и исправлена 2017-10-09; 4.14.0-rc4+ известен как уязвимый.
Если у вас уровень начинающего или среднего разработчика эксплойтов, мы рекомендуем вам попробовать эксплуатировать её самостоятельно перед прочтением нашей реализации. Это очень хорошее упражнение с простым примитивом эксплуатации (произвольная запись в доступную для записи память ядра).
Мы также бросаем вызов @LiveOverflow попробовать.
Вот описание:
oss-security:
Привет,Крис Сэллс (Chris Salls) обнаружил, что при рефакторинге системного вызова waitid() в ядре Linux v4.13 случайно перестала проверяться принадлежность входящего аргумента пространству пользователя. Это позволяло локальным злоумышленникам выполнять прямую запись в память ядра, что могло привести к повышению привилегий.
Внесено этим коммитом:
https://git.kernel.org/linus/4c48abe91be03d191d0c20cc755877da2cb35622Исправлено этим коммитом в основной ветке:
https://git.kernel.org/linus/96ca579a1ecc943b75beba58bebb0356f6cc4b51В ближайшее время исправление должно появиться в стабильной ветке (будущая версия v4.13.7):
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/log/?h=linux-4.13.yСпасибо,
waitid:
waitid -- ожидает изменения состояния дочернего процесса.
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
Ядро не проверяет, является ли infop указателем на пространство ядра или пользовательское пространство, поэтому мы можем перезаписывать память на любой странице памяти ядра с правами на запись. Забавно, что мы лишь частично контролируем то, что записывается.
Существует более тысячи способов эксплуатации этой уязвимости. Мы решили превратить этот примитив записи в разыменование нулевого указателя. Мы перезаписали переменную have_canfork_callback в секции .BSS ядра. Установка этой переменной в любое значение, отличное от 0 (истина), приводит к тому, что неинициализированный обратный вызов (null) «вызывается при создании новой задачи до того, как процесс станет видимым».
Спасибо Крису Сэллсу и @kees_cook за совместное раскрытие CVE.
Первый «реальный» эксплойт для ядра Linux от
@XeR_0x2A и
@chaign_c из
HexpressoTeam.
2017-10-22