51 views

软件沙箱技术2 – chroot

 

image

题图From Here.

 

chroot的属于Unix系统中的初级虚拟化技术,虚拟的是文件系统的目录结构,用于隔离。参照【3】,chroot也是最早出现的这类技术,1982就有应用了。后来者如FreeBSD的Jail和Linux的LXC都是chroot的增强,最终还无意间引出了docker技术。

 

实现原理

【1】每个进程对象都有一个root directory的数据项,保存root目录的位置。Chroot系统调用做的事情就是修改这进程这个目录到其它位置。

 

使用方式

假定应用执行时需要以来下面这些公共目录

/
/bin
/lib
/usr/lib
/usr/local
/home
/sbin
/usr/bin

在某一特定的目录下,建立同样的目录层次:

上图中是/vz/root/001下。

 

应用对于/vz/root/001目录执行chroot(PATH),则应用今后的运行是以/vz/root/001为root目录,对文件系统的访问会限定于/vz/root/001之内。chroot之后的产物叫做chroot jail。

可以结合bind mount【4】,引入外部目录,使chroot jail的使用更简洁一些。

 

权限控制

chroot不是外部强制应用的,而是应用程序主动执行的,其执行必须使用root权限,执行后应用程序应该主动放弃root权限,否则有可能被脱狱。

【1】中演示了如果有root权限,如何脱离chroot的代码,代码比较古老是99年的,不知道现在是否可用。其原理是:

1.得到root权限

2.在chroot jail中创建子目录。

3.打开chroot根目录,维持文件句柄

这一部是关键,需要编码实现。这样要求chroot内必须有开发工具,例如C编译器等。

4.chroot刚创建的子目录

5.使用维持的旧chroot根目录的句柄,不断执行“cd ..”直到真是的根目录。

6.再次调用chroot当前目录,则回到了真实的根目录。

作为防范措施

1.应该在chroot后,应用主动根据最小权限原则“least privilage”降级,只需要权限足够chroot jail应用运行即可。

2.chroot jail之中不应该留有不必要的工具,例如编译环境,特殊command等。

 

即便脱狱漏洞被堵上,root权限仍有其它隐患,会影响文件系统外的其它资源,网络, CPU等。chroot后降低权限是必须的。

 

Chroot用途

设备需要向外提供功能的模块,例如FTP, HTTP server必须要在chroot jail中运行。原因是,只要对外提供网络应用服务,就有可能被攻陷,如果没有chroot。被攻陷后,hacker可以操作整个系统。chroot jail可以缓解。

Wiki【2】中列举了chroot的一些应用场景。

例如,有些软件使用不同的ABI,依赖的库放到chroot jail才可以正常运行等。

 

Chroot的缺陷

从chroot的实现就可看出来,它的作用仅仅是隔离,隔离的也仅是文件系统,对于其它系统资源,例如进程、网络等并不能起到保护作用。

 

【参考】

1.How to break out of a chroot() jail,http://www.bpfh.net/simes/computing/chroot-break.html

2.chroot,https://en.wikipedia.org/wiki/Chroot

3.Operating-system-level virtualization,https://en.wikipedia.org/wiki/Operating-system-level_virtualization

4.What is a bind mount?,http://unix.stackexchange.com/questions/198590/what-is-a-bind-mount

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">