Добавлен перевод статьи "Avoiding CVE-2016-8655 with systemd"
This commit is contained in:
91
s4a.tex
91
s4a.tex
@@ -5171,6 +5171,97 @@ localectl, busctl, systemd-analyze, systemd-run).}.
|
||||
подробностями обращайтесь к документации (начать изучение темы можно со ссылок,
|
||||
приведенных в этой статье).
|
||||
|
||||
\sectiona{Защита от уязвимостей \texttt{AF\_PACKET} при помощи
|
||||
systemd\sfnote{Эта и последующие статьи официально не входят в цикл <<systemd
|
||||
для администраторов>>, и поэтому не~имеют порядковых номеров. Однако они сходны
|
||||
по тематике с остальными статьями цикла и несут довольно много полезной
|
||||
информации, и поэтому их перевод все же присутствует в данном документе.}}
|
||||
|
||||
Небольшая заметка о том, как ограничительные механизмы, встроенные в последние
|
||||
версии systemd, позволяют защитить ваши службы от эксплуатации
|
||||
уязвимости \href{http://seclists.org/oss-sec/2016/q4/607}{CVE-2016-8655}%
|
||||
\footnote{Прим. перев.: Решение перевести эту заметку связано с появлением
|
||||
информации о целом ряде уязвимостей, связанных с +AF_PACKET+. Помимо уже
|
||||
упомянутой автором CVE-2016-8655, это
|
||||
\href{https://googleprojectzero.blogspot.com/2017/05/exploiting-linux-kernel-via-packet.html}%
|
||||
{CVE-2017-7308},
|
||||
\href{http://seclists.org/oss-sec/2017/q3/279}{CVE-2017-10001111},
|
||||
\href{http://seclists.org/oss-sec/2017/q3/476}{CVE-2017-14497}, и
|
||||
\href{http://seclists.org/fulldisclosure/2017/Oct/44}{еще одна}, на момент
|
||||
написания этих строк не~имеющая идентификатора CVE. Все они имеют схожую природу
|
||||
(повышение привилегий до root путем манипуляций с сокетами +AF_PACKET+)
|
||||
и успешно блокируются описанным в статье методом. Соответственно, был изменен и
|
||||
заголовок статьи (в оригинале речь шла только о CVE-2016-8655).}.
|
||||
|
||||
Начиная с версии 211, в systemd добавлена поддержка новой директивы
|
||||
для service-файлов~---
|
||||
\hreftt{https://www.freedesktop.org/software/systemd/man/systemd.exec.html\#RestrictAddressFamilies=}%
|
||||
{RestrictAddressFamilies=}, которая отбирает у службы возможность создавать
|
||||
сокеты определенного типа\footnote{Прим. перев.: Под <<типом сокета>> здесь
|
||||
подразумевается address family. Не~вполне корректно, зато кратко.}. Достаточно
|
||||
добавить в секцию +[Service]+ юнит-файла вашей службы строчку
|
||||
+RestrictAddressFamilies=~AF_PACKET+, и служба утратит возможность создавать
|
||||
сокеты типа +AF_PACKET+, в результате чего эксплуатация соответствующих
|
||||
уязвимостей будет исключена. Приведенный пример демонстрирует режим <<черного
|
||||
списка>>, когда указываются \emph{запрещенные} типы сокетов. Однако, более
|
||||
безопасным подходом является <<белый список>> \emph{разрешенных} типов. В
|
||||
отличие от черного, белый список указывается без символа +~+. Простой пример:
|
||||
\begin{Verbatim}
|
||||
...
|
||||
[Service]
|
||||
ExecStart=/usr/bin/mydaemon
|
||||
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
|
||||
...
|
||||
\end{Verbatim}
|
||||
Служба, настроенная таким образом, может использовать только сокеты типа
|
||||
+AF_INET+, +AF_INET6+ и +AF_UNIX+, что должно быть достаточно для большинства
|
||||
системных демонов (+AF_INET+~--- низкоуровневое название для IPv4,
|
||||
+AF_INET6+~--- для IPv6, а +AF_UNIX+ соответствует локальным UNIX-сокетам).
|
||||
|
||||
\href{https://github.com/systemd/systemd/blob/8e458bfe4e2aa36c939db62561b2a59206d78577/NEWS#L45}%
|
||||
{Начиная с systemd 232}, мы добавили директивы +RestrictAddressFamilies=+ в
|
||||
юнит-файлы всех служб, входящих в состав systemd, указав минимально
|
||||
необходимый набор типов сокетов для каждой службы.
|
||||
|
||||
С выходом systemd 233 мы
|
||||
\href{https://github.com/systemd/systemd/pull/4536}{добавили} еще один метод
|
||||
блокировки подобных уязвимостей. Директива
|
||||
\hreftt{https://www.freedesktop.org/software/systemd/man/systemd.exec.html\#RestrictNamespaces=}%
|
||||
{RestrictNamespaces=} позволяет ограничить перечень пространств имен
|
||||
(namespaces), которые может использовать служба\footnote{Прим. перев.:
|
||||
Пространства имен~--- специфичная для ядра Linux технология контейнерной
|
||||
изоляции, позволяющая группе процессов иметь свой собственный сетевой стек
|
||||
(network namespace), иерархию монтирования (mount namespace, также использовался
|
||||
термин filesystem namespace), иерархию контрольных групп (cgroup namespace),
|
||||
очереди сообщений POSIX и интерфейсы SysV IPC (IPC namespace), имя хоста (UTS
|
||||
namespace), независимые списки индентификаторов процессов (PID namespace) и
|
||||
пользователей/групп (user namespace). Лежат в основе систем контейнерной
|
||||
изоляции, таких как LXC и Docker. Также широко используются в systemd для
|
||||
обеспечения безопасности~--- см. главы \ref{sec:chroots} и
|
||||
\ref{sec:security}.}. В частности, +RestrictNamespaces=yes+ полностью отключает
|
||||
доступ к пространствам имен. Перечисление, например
|
||||
+RestrictNamespaces=net ipc+, позволяет задать список разрешенных к
|
||||
использованию пространств имен (в нашем случае это пространства имен для сети и
|
||||
IPC)\footnote{Прим. перев.: Как и в предыдущем случае, можно поменять белый
|
||||
список на черный, добавив перед ним символ +~+.}. Учитывая, что механизм
|
||||
пространства имен пользователей (user namespace) уже давно является перманентным
|
||||
источником опасных уязвимостей\footnote{Прим. перев.: В частности, для создания
|
||||
сокетов +AF_PACKET+ требуется наличие полномочий +CAP_NET_RAW+ (или прав рута),
|
||||
отсутствующих у большинства программ. Однако, если система разрешает
|
||||
непривилигерованным процессам создавать новое пространство имен
|
||||
пользователей (+sysctl kernel.unprivileged_userns_clone=1+), то злоумышленник
|
||||
может создать новое user namespace, в котором его процесс будет иметь
|
||||
полномочия рута и, соответственно, сможет создать новое сетевое пространство
|
||||
имен, и в нем сокет типа +AF_PACKET+, с помощью которого он попытается получить
|
||||
полномочия рута уже в основной системе.}, возможно, будет правильным
|
||||
заблокировать использование пространств имен для тех служб, которым они
|
||||
не~требуются (а таких служб большинство).
|
||||
|
||||
Хочется надеяться, что в будущем сопровождающие дистрибутивов и апстримные
|
||||
разработчики программ будут сами добавлять соответствующие ограничительные
|
||||
директивы в поставляемые по умолчанию юнит-файлы, так как эти люди лучше знают,
|
||||
какие именно привилегии минимально необходимы для функционирования их демонов.
|
||||
|
||||
\appendix
|
||||
|
||||
\section{FAQ (часто задаваемые вопросы)\sfnote{Перевод статьи
|
||||
|
||||
Reference in New Issue
Block a user