防止 setuid 放弃 setcap 用户权限(VirtualBox)

防止 setuid 放弃 setcap 用户权限(VirtualBox)

我正在尝试从无头、NAT 的 VirtualBox 客户机运行 Web 服务器。VirtualBox 需要绑定到端口 80,但唯一的方法是以 root 身份运行 VirtualBox。为了解决这个问题,我尝试使用setcap,但 VirtualBox 进程是 SUID root,这意味着它会放弃所有用户权限,包括 setcap 设置。

既然 VirtualBox 以 SUID root 运行,为什么非 root 用户不能使用它绑定到特权端口?

客户机无法桥接,必须使用 NAT。不幸的是,使用 iptables 重新路由流量或以 root 身份运行 VirtualBox 也不是一种选择,但如果没有其他选择,我可能不得不接受。

VirtualBox 线程演示了此功能。

编辑:我kern.log也证实了这一点:

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

编辑:能力manpage 也涉及到这一点:

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 之前的设置可启用此功能。

编辑:我最终通过从 SVN 编译强化的 VirtualBox 版本使其完全正常工作:

# 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 构建说明了解详情。

相关内容