Уязвимость в LXC, позволяющая получить доступ к файлам вне контейнера
В инструментарии управления изолированными контейнерами LXC выявлена уязвимость (CVE-2016-8649), позволяющая при наличии прав root внутри непривилегированного контейнера (работающего в отдельном user namespace) получить доступ к файлам хост-системы и выполнить свой код вне изолированного окружения.
Атака может быть совершена при запуске в контейнере процессов при помощи утилиты lxc-attach. Пользователь root в контейнере имеет возможность влиять на работу утилиты lxc-attach, что, в сочетании с достаточно просто достигаемым состоянием гонки при выполнении lxc-attach, может привести к отключению ограничений и получению доступа к хост-системе. Уязвимость охватывает две проблемы: использование в lxc-attach данных из источников, подконтрольных пользователю контейнера, и возможность применения вызова ptrace для экземпляров lxc-attach, созданных в другом пространстве пользователей (root из контейнера может получить доступ к процессу, созданному во внешнем user namespace).
В частности, lxc-attach оставляет открытым файловый дескриптор к одному из файлов /proc на стороне хост-системы, что позволяет атакующему получить чего него доступ к остальным частям файловой системы, используя системные вызовы семейства openat(). В том числе через файловый дескриптор могут быть записаны данные в файлы /proc/PID/attr/current или /proc/PID/attr/exec на стороне хост-системы для установки меток AppArmor и SELinux к прикрепленному процессу, что дает возможность отключить сброс привилегий для процесса, запускаемого при помощи lxc-attach.
Уязвимость уже устранена в Ubuntu Linux и ожидает исправления в Debian, RHEL/CentOS, Fedora, Fedora EPEL и SUSE/openSUSE. Патч для блокирования уязвимости принят в дерево исходных текстов LXC, но для полного устранения возможных альтернативных векторов атаки также требуется внесение исправлений в ядро Linux для реализации проверки прав доступа к ptrace с учетом user namespace.