Уязвимость ядре 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 в начале марта.