我正在构建一个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将沙盒命令与非沙盒命令相同,需要发生什么?