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.

  1. Обновите списки пакетов репозитория:
sudo apt-get update

  1. Установите последние доступные обновления безопасности для ядра:
sudo apt-get upgrade linux-image-generic

  1. Если вы используете конкретный дистрибутив (например, RHEL/CentOS), используйте менеджер пакетов yum:
sudo yum update kernel

  1. После обновления необходимо перезагрузить систему для инициализации нового ядра:
sudo reboot

  1. Проверьте версию ядра после перезагрузки, чтобы убедиться, что изменения вступили в силу:
uname -r

Временные меры

Если немедленное обновление ядра и перезагрузка невозможны, следует применить следующие защитные механизмы для снижения риска эксплуатации:

  1. Ограничьте доступ к системным вызовам для непривилегированных пользователей с помощью профилей AppArmor или SELinux.

  2. Используйте механизмы аудита для отслеживания подозрительной активности, связанной с системными вызовами futex:

sudo auditctl -a always,exit -S futex -F key=futex_monitor

  1. В критических случаях, где это допустимо, ограничьте возможность запуска произвольных бинарных файлов локальными пользователями, чтобы предотвратить выполнение эксплойта.

  2. Для систем на базе контейнеров (Docker/LXC) используйте фильтрацию системных вызовов через seccomp, чтобы запретить или ограничить вызов futex().