我们有一个 Node 应用程序作为 C++ 沙盒工具的前端,它使用 gcc 编译代码并将结果输出到浏览器。
例如
exec("gcc -o /tmp/test /tmp/test.cpp",
function (error, stdout, stderr) {
if(!stderr) {
execFile('/tmp/test', function(error, stdout, stderr) {});
}
}
);
这很好用。
然而,你可以想象,如果将其公开,这将是一场安全噩梦——所以我考虑了两个选项来保护我的堆栈:
- CHROOT 监狱 - 但这本身不足以阻止目录遍历/文件访问。
- AppArmor?
所以我的问题是,我怎样才能保护我的堆栈免受可能来自以下方面的影响:
A)使用 gcc 编译未知代码
B)执行编译后的代码
答案1
这完全取决于风险有多大以及你愿意为确保它而牺牲什么。
chroot jail 可能只能提供较低级别的保护,尤其会让潜在攻击者可以访问网络和主机的所有计算资源,以及提升本地权限提升漏洞的能力(这种漏洞在各种软件包中经常被发现,甚至包括 Linux 内核)。
MAC 解决方案(SELinux、AppArmor、TOMOYO)可以实现更精细的控制,尤其是包括网络访问,但是MAC 并非牢不可破。
另一个级别的沙盒将包括拦截所有系统调用 - 几乎就是你所看到的赛康普。但显然,在这里创建一个有用的个人资料将是一项艰巨的工作。
您甚至可以更进一步,为执行的代码的每个实例分离一个虚拟机或容器 - 在这里您可能对资源使用和与主机数据的分离拥有最高级别的控制 - 但这可能会变得昂贵,除了只有少数用户的简单情况。