2013-05-14 347 views
2

我正在构建一个Node.JS应用程序,它涉及将用户输入重定向到服务器端命令。当然,这对安全来说可能是灾难性的,所以我希望在SELinux sandbox内运行子命令。 (我不想在沙箱内运行整个应用程序,因为我希望最终用户在服务器上各自都有自己的工作区。)SELinux Sandbox内的Node.JS产卵器

例如,请考虑命令cowsay。为了运行沙箱,您只需要sandbox cowsay。除了幕后的安全差异之外,sandbox cowsay的界面应该与普通cowsay的界面相同。

但是,Node.JS对这两种方法的反应不同。考虑代码:

var spawn = require('child_process').spawn;      
var cmd = spawn("cowsay", ["hello"]); // line A (no sandbox) 
var cmd = spawn("sandbox", ["cowsay", "hello"]); // line B (with sandbox) 
cmd.stdout.on("data", function(data){ 
    console.log("stdout: "+data); 
}); 
cmd.stderr.on("data", function(data){ 
    console.log("stderr: "+data); 
}); 
cmd.on("exit", function(err){ 
    console.log("exit: "+err); 
}); 

下面是该版本的输出与A线:

$ node run.js 
stdout: _______ 
<hello> 
------- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

exit: 0 

但这里是与线B版本的输出,而不是:

$ node run.js 
exit: 0 

在换句话说,Node.JS似乎没有从沙盒的子进程读取流。

该测试可以使用任何命令执行。例如,假设我们使用了python命令解释器。这里发生的情况是,非沙箱化的python等待从Node.JS将一些内容输入到stdin,但沙箱python仅存在于代码0中,无需等待。

只有当SELinux处于“执行”模式时才会显示此行为。当SELinux处于“宽容”(非强制)模式时,沙盒版本可以正常工作。

为使Node.JS将沙盒命令与非沙盒命令相同,需要发生什么?

回答

4

在玩了几个星期之后,我们找到了一种使沙箱按预期工作的方法。

该问题似乎涉及SELinux停止读取和写入UNIX流套接字的libuv(Node的基础),这当然是Node非阻塞I/O所必需的。这个需要很长时间才能找到的原因之一是,通过dontaudit规则,SELinux的审计隐藏了这个错误。

我们开始通过执行以下操作:

# semodule -DB ## turns off dontaudit rules 
# tail -f /var/log/audit/audit.log 

然后在不同的终端,运行应用程序。 SELinux的审计一束出现,但最显著,一个说:

type=AVC msg=audit(1370065734.791:5038): avc: denied { read write } for pid=8887 comm="my_command" path="socket:[1258916]" dev=sockfs ino=1258916 scontext=unconfined_u:unconfined_r:sandbox_t:s0:c98,c807 tcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tclass=unix_stream_socket 

使成一个政策,我们做了以下内容:

# grep "type=AVC msg=audit(1370065734.791:5038)" /var/log/audit/audit.log | audit2allow -M unixsocketsandbox 
# semodule -i unixsocketsandbox.pp 

其中unixsocketsandbox是一个独特的名字为政策。该政策(通过cat unixsocketsandbox.te)内容如下:

allow sandbox_t unconfined_t:unix_stream_socket { read write }; 

在此之后,该应用程序正常工作,沙箱的限制范围内。