- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在构建一个涉及将用户输入重定向到服务器端命令的 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 流套接字,这当然是 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 };
在此之后,应用程序在沙箱的限制内按预期工作。
关于SELinux 沙箱中的 Node.JS Spawn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542068/
是否可以通过覆盖alert、window.location 和eval 等各种函数来对用户提交的 Javascript 进行沙箱处理? 我不是在寻找完美的解决方案。我敢肯定,有些人仍然会找到一种方法来
我想让开发人员用 Javascript 为网站编写一些自定义应用程序,但我想将其沙盒化,这样他们就不能做任何调皮的事情,比如重定向用户、将正文显示设置为无等等。我有一个命名空间Javascript,其
所以我使用一个程序,我在 lua 中编写 mods,lua 处于沙箱状态,这意味着大多数功能都被阻止,如 IO 和 OS,我什至不能使用 REQUIRE 添加库。我需要一个功能来解压缩我的一个 mod
我编写了一个简单的 RMI 服务器,并为其指定了默认的 RMISecurityManager: System.setSecurityManager (new RMISecurityManager())
我希望允许用户定义自己的函数以在程序中使用,但是,我不希望他们破坏东西 - 理想情况下我想将其限制为核心语言函数,也许是 数学模块 自定义函数将是这样的(在 user_function.py 中定义,
我需要在第一次运行我的应用程序时将一些 png 从主包复制到文档文件夹。我需要它,因为我必须将这些图像的文件路径保存在核心数据实体中。 我试过了,但是不行,有人知道为什么吗? // to copy i
我在使用 Paypal Sandbox 时遇到货币问题。 我正在使用沙盒测试我网站的定期付款(数字商品,快速结账) 一切都按预期工作。 用户点击支付。 用户被转移到paypal express che
我们正在尝试使用 StoreKit 实现简单的应用内购买(不确定它是否与它有任何关系)并且到目前为止一切顺利,但是我们面临一个特定问题:当我们退出应用时, iOS 永久要求我们登录: 只有在使用沙盒或
这个问题在这里已经有了答案: How can I sandbox Python in pure Python? (7 个回答) 关闭9年前。 我想创建一个网站,人们可以上传他们的 Python 脚本。
不是开发人员,而是想弄清楚如何生成一个 revolut 业务 api,以在 woocommerce 上设置一个沙盒 revolut 支付网关。我按照 open ssl instructions 生成
current documentation cabal 显示 sandbox子命令。 respective page on github不再包含有关沙箱的部分。 我使用的是 cabal 版本 3.2.
我有兴趣了解 extjs 沙箱,但无法在网络上找到太多相关信息。有人可以告诉或指出一些有关 extjs 沙箱是什么以及它是如何工作的相关资源。提前致谢! 最佳答案 Ext JS 沙箱只是顶级命名空间上
我有一个沙盒 Cocoa 应用程序。它有一个单窗口、多选项卡用户界面。我不使用 NSDocument,但它是一个可以编辑多个“文档”的应用程序。当应用程序关闭时,我保存打开文档的列表。当我重新启动应用
有人可以向我解释一件事吗?是否可以像在 Salesforce(开发者组织)中那样为开发者获得免费的 NetSuite 沙盒帐户? 最佳答案 您可以成为社区开发者,并获得一个免费的 Netsuite 帐
我正在尝试创建到 Revolut 的客户端连接。我正在关注他们的 tutorial ,但是我被困在 交易所授权码 . 到目前为止我做了什么: 在他们的 sanbox 上创建了企业帐户 在此处添加了我的
因此,Lua 似乎是在我的应用程序中实现安全“用户脚本”的理想选择。 但是,大多数嵌入lua的示例似乎都包含加载所有标准库,包括“io”和“package”。 所以我可以从解释器中排除这些库,但即使是
因此,我尝试使用插件包从源文件动态加载 haskell 函数。源文件依赖于带有模块 Foo.Bar 的包 foo。我正在 Cabal 沙箱中运行我的项目,其中安装了 foo。我的主程序和我使用插件加载
我正在使用 Pipeline Pilot 进行一些工作,并注意到所有内置的 HTML 组件都可以执行某些操作,例如可折叠面板、选项卡或任何其他可能具有我无法访问的 javascript 的内容,从而导
我今天获得了 Instagram api 并实时添加了我的网站,我看到写: 客户端状态:沙盒模式上线 为什么我无法点击“上线”按钮? 最佳答案 不过,您需要开始提交以获得批准才能上线: 网站的 Fee
我有一些代码正在尝试使用这样的结构进行测试(根据 Cleaning up sinon stubs easily ): function test1() { // manually create
我是一名优秀的程序员,十分优秀!