2013-05-14 30 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 }; 

在此之後,該應用程序正常工作,沙箱的限制範圍內。