Уязвимость в ядре Linux, позволяющая выйти из изолированного контейнера

В опубликованных несколько часов назад выпусках ядра Linux 3.14.73, 4.4.14 и 4.6.3 устранена критическая уязвимость (CVE-2016-4997), позволяющая локальному пользователю повысить свои привилегии или выполнить код с правами ядра. Уязвимость пока не устранена в дистрибутивах, обновление в процессе подготовки: SUSE, Ubuntu, Debian, RHEL.

Уязвимость присутствует в подсистеме netfilter и связана с недоработкой в обработчике setsockopt IPT_SO_SET_REPLACE. Проблема проявляется только при использовании пространств имён для изоляции сети и идентификаторов пользователей (user namespaces и network namespaces, сборка ядра с CONFIG_USER_NS=y и CONFIG_NET_NS=y). Так как user namespaces по умолчанию отключены в большинстве дистрибутивов, уязвимость представляет опасность в основном для систем, использующих изолированные контейнеры.

В обычных условиях вызов compat_setsockopt() может выполнить только пользователь root, но в ядрах с поддержкой пространств имён для сети и идентификаторов пользователей данное ограничение снимается и функциональность доступна для непривилегированного пользователя, работающего внутри контейнера (т.е. пользователь из контейнера может обойти изоляцию, выполнив код на уровня ядра). Детальное описание метода эксплуатации планируется обнародовать на следующей неделе.

Примечательно, что в списке изменений к новым выпускам факт исправления уязвимости никак не отмечен. Более того, исправления были предложены ещё для ветки 4.6-rc2 в апреле, без акцентирования внимания на наличие уязвимости, а начальный патч был подготовлен компанией Google, отправлен разработчикам ядра и использован в Chrome OS в начале марта.