gpt4 book ai didi

SELinux 沙箱中的 Node.JS Spawn

转载 作者:搜寻专家 更新时间:2023-11-01 00:33:32 24 4
gpt4 key购买 nike

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

例如,考虑命令cowsay。为了运行沙盒 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 将某些内容输入其标准输入,但沙盒 python 仅存在代码 0,无需等待.

此行为仅在 SELinux 处于“强制”模式时出现。当 SELinux 处于“宽松”(非强制)模式时,沙盒版本可以正常工作。

为了让 Node.JS 将沙盒命令与非沙盒命令一样对待,需要发生什么?

最佳答案

在尝试了几周之后,我们找到了一种让沙箱按预期工作的方法。

问题似乎涉及 SELinux 阻止 libuv(Node 的基础)读写 UNIX 流套接字,这当然是 N​​ode 的非阻塞 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 };

在此之后,应用程序在沙箱的限制内按预期工作。

关于SELinux 沙箱中的 Node.JS Spawn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com