Предотвращение сброса setuid пользовательских привилегий setcap (VirtualBox)

Я пытаюсь запустить веб-сервер от безголового гостя в VirtualBox. VirtualBox необходимо привязать к порту 80, но единственный способ сделать это - запустить VirtualBox от имени пользователя root. Чтобы обойти это, я попытался использовать setcap, но процесс VirtualBox является корневым SUID, то есть он отбрасывает все пользовательские привилегии, включая настройки setcap.

Поскольку VirtualBox работает с рутом SUID, почему пользователи без полномочий root не могут с ним связываться с привилегированными портами?

Гость не может быть соединен мостом, он должен использовать NAT. Перенаправление трафика с iptables или запуск VirtualBox от имени root также, к сожалению, не вариант, но мне, возможно, придется согласиться, если других вариантов нет.

Виртуальный поток, демонстрирующий эту функцию.

РЕДАКТИРОВАТЬ: мой kern.log также подтверждает это:

warning: /usr/lib/virtualbox/VBoxHeadless' has both setuid-root and effective capabilities. Therefore not raising all capabilities.

РЕДАКТИРОВАТЬ: man-страницу возможностей также касается этого:

If the effective user ID is changed from 0 to nonzero, then all capabilities are cleared from the effective set.

Есть идеи?

1 ответ

Решение

Я нашел источник проблемы. Корневые программы SUID на самом деле могут связываться с привилегированными портами, но VirtualBox специально отбрасывает привилегии SUID вскоре после запуска, делая невозможным предоставление ему соответствующих разрешений без серьезных изменений. SUID фактически совместим с setcap, как указано на странице справки по возможностям. Перекомпиляция VirtualBox из исходного кода - единственный вариант.

РЕДАКТИРОВАТЬ: Настройка export VBOX_HARD_CAP_NET_BIND_SERVICE=1 перед сборкой VirtualBox включает эту функцию.

РЕДАКТИРОВАТЬ: я наконец получил полностью работать путем компиляции усиленной сборки VirtualBox из SVN:

# Prerequisites:
#   - Satisfy all dependencies listed in the VirtualBox build instructions
#   - You may need to install additional packages:
#       texlive-latex-extra
#       yasm

export VBOX_HARD_CAP_NET_BIND_SERVICE=1
cd ~

# Download VirtualBox source code from SVN
svn co http://www.virtualbox.org/svn/vbox/trunk vbox
cd vbox

# Configure build. I encountered Java errors so I disabled Java support
./configure --disable-java
source ./env.sh
kmk all

# Build kernel module. The below path may vary!
cd ~/vbox/out/linux.amd64/release/bin/src
make
sudo make install

# Build hardened executable
cd ~/vbox/src/VBox
kmk packing

# Install VirtualBox
cd ~/vbox/out/linux.amd64/release/bin
sudo ./VirtualBox-4.2.51_OSE-r44262.run install

Некоторые из приведенных выше шагов могут потребовать создания символических ссылок. Следуйте инструкциям сборки Linux для деталей.

Другие вопросы по тегам