CVE-2014-3153
Linux Kernel
2022-05-25
The futex_requeue function in kernel/futex.c in Linux kernel does not ensure that calls have two different futex addresses, which allows local users to gain privileges.
Технический анализ и план устранения
Суть уязвимости
CVE-2014-3153 (известная как Towelroot) представляет собой критическую ошибку в подсистеме futex (fast userspace mutex) ядра Linux, а именно в функции futex_requeue. Уязвимость возникает из-за некорректной обработки очередей ожидания при выполнении операций перестановки (requeue) потоков из одного futex в другой.
Проблема заключается в том, что ядро не проверяет должным образом, являются ли два адреса futex различными, и не учитывает состояние потока, который уже был пробужден, но еще не удален из очереди. Это приводит к состоянию "use-after-free" (использование памяти после освобождения) в стеке ядра. Локальный пользователь может использовать этот дефект для манипуляции структурами данных ядра (rt_waiter), что позволяет перезаписать указатели и выполнить произвольный код с правами суперпользователя (root), полностью обходя механизмы защиты (SMEP/SMAP).
Как исправить
Основным способом устранения является обновление ядра Linux до версии, в которой внесен патч, проверяющий корректность параметров в kernel/futex.c.
- Обновите списки пакетов репозитория:
sudo apt-get update
- Установите последние доступные обновления безопасности для ядра:
sudo apt-get upgrade linux-image-generic
- Если вы используете конкретный дистрибутив (например, RHEL/CentOS), используйте менеджер пакетов yum:
sudo yum update kernel
- После обновления необходимо перезагрузить систему для инициализации нового ядра:
sudo reboot
- Проверьте версию ядра после перезагрузки, чтобы убедиться, что изменения вступили в силу:
uname -r
Временные меры
Если немедленное обновление ядра и перезагрузка невозможны, следует применить следующие защитные механизмы для снижения риска эксплуатации:
-
Ограничьте доступ к системным вызовам для непривилегированных пользователей с помощью профилей AppArmor или SELinux.
-
Используйте механизмы аудита для отслеживания подозрительной активности, связанной с системными вызовами futex:
sudo auditctl -a always,exit -S futex -F key=futex_monitor
-
В критических случаях, где это допустимо, ограничьте возможность запуска произвольных бинарных файлов локальными пользователями, чтобы предотвратить выполнение эксплойта.
-
Для систем на базе контейнеров (Docker/LXC) используйте фильтрацию системных вызовов через seccomp, чтобы запретить или ограничить вызов
futex().