Setuid Sandbox主要基于Linux Kernel所提供的安全机制来实现。简单地说,就是利用 random uid/gid + chroot() + capability 来达到限制不可信进程的访问权限。Setuid Sandbox的设计主要考虑以下几方面:
1. Setuid
Linux中每个进程都会有一个uid,uid=0则为root用户进程(privileged),uid>0则为普通用户进程(unprivileged)。不同uid进程之间(不包括root进程)是相互隔离的,各自都有自己独立的权限,互不干扰。而root进程具有特权,它能干任何事情。Linux uid/gid机制主要是用于进程的权限隔离。如果你打算执行不可信的程序,那么你可以在启动该程序时为其分配一个random uid。一个可能的执行流程如下:
fork() -> setuid() -> {设置相关的进程资源限制, eg, RLIMIT_NPROC (0,0)} -> execve()
注意,setuid()只能由root权限(或拥有 CAP_SETUID capability的普通用户权限)才能成功调用,所以这个执行流程需要借助某个拥有root权限的helper程序。比如,将helper程序设置为setuid root。
2. Chroot
Chroot是Linux kernel提供的另一个安全功能,它用于修改进程的根目录。比如执行