预计阅读本页时间:-
9.8.4 囚禁
一个古老的俄国谚语说:“相信但需要验证。”很明显地,古代的俄国人在头脑中就已经清楚地有了软件的概念。即使一个软件已经被签名了,一个好的态度是去核实它是否都能正常运行。做这件事情的一种技术是囚禁(jailing),如图9-35所示。

如图9-35,一个新被接受的程序会作为一个标有“囚犯”的标签的进程来运行。这个“狱卒”是一个可信任的(系统的)进程,可以监管囚犯进程的行为。当一个被监禁的进程作出一个系统调用的时候,系统调用不会被执行,而是把控制移交给狱卒进程(通过一个内核陷阱)并把系统调用号和参数传递给它。这个狱卒进程会判断是否这个系统调用被允许。例如,如果被监禁的进程试图和一个狱卒进程不知道的远程主机建立一个网络连接,这个系统调用会被拒绝然后该囚犯进程被结束。如果这个系统调用是可以接受的,那么狱卒进程会通知内核,由内核来执行该系统调用。通过使用这种方法,不正确的行为会在它引起麻烦之前被捕捉到。
囚禁有很多的实现方法。有一种方法可以在不需要修改内核的情况下,在几乎任何一个UNIX系统上实现,这种方法是Van't Noordende等人在2007年提出的。在nutshell中,这个方法使用普通的UNIX调试功能,让狱卒进程作为调试者而囚犯进程作为被调试者。这种情况下,调试者可以指示内核把被调试者封装起来,然后把被调试者的所有系统调用都传递给自己来监视。