我正在構建一個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將沙盒命令與非沙盒命令相同,需要發生什麼?