Уязвимость в реализации протокола DCCP в ядре Linux

В реализации сокетов с поддержкой протокола DCCP выявлена уязвимость CVE-2017-8824, потенциально позволяющая выполнить код на уровне ядра Linux через локальные манипуляции с сокетами DCCP из непривилегированного процесса. Уязвимость проявляется начиная с выпуска ядра Linux 2.6.16. Для тестирования подготовлен прототип эксплоита.

Проблема вызвана обращением к уже освобождённому блоку памяти в коде обработки сокетов DCCP: Когда объект сокета находится в состоянии DCCP_LISTEN и выполняется вызов функции connect(), выполнение dccp_disconnect() переводит сокет в состояние DCCP_CLOSED, но не освобождает память для структур dccps_hc_tx_ccid и dccps_hc_rx_ccid и не обнуляет их. В дальнейшем, если вызвать connect() в режиме AF_INET6, объект сокета будет клонирован функцией dccp_create_openreq_child(), а на выходе выдан новый объект сокета, в котором сохранятся ссылки dccps_hc_rx_ccid и dccps_hc_tx_ccid из старого объекта сокета. Таким образом, старый и новый объекты сокета будут ссылаться на одну и ту же область памяти.

Уязвимость проявляется только в ядрах, собранных с опцией CONFIG_IP_DCCP, которая, как правило, включена по умолчанию. Исправление пока доступно только в виде патча. Обновления пакетов с ядром для дистрибутивов пока не выпущены (Debian, Fedora, openSUSE, SUSE, RHEL, Ubuntu). Примечательно, что критические проблемы в реализации DCCP уже обнаруживались в феврале 2017 года, а также в 2014 и 2008 годах. В качестве обходного пути защиты можно запретить загрузку модуля ядра dccp, который в обычных условиях загружается автоматически:

   echo "install dccp /bin/true"  /etc/modprobe.d/disable-dccp.conf

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.