6

虽然我确实知道系统调用和安全性不能齐头并进,但有一个项目我确实需要它。我正在编写一个小型代码检查器,我需要编译和执行用户提交的代码来测试我的测试用例。

基本上我想在沙箱中运行代码,这样它就不能触及临时目录之外的任何文件,并且它创建的任何文件都不能被外界访问。最近我遇到了一个漏洞利用,用户可以利用它创建一个文件,比如shell.php包含以下内容。

<?php
  echo system($_GET['x']);
?>

这给了攻击者一个远程shell,并且由于文件的所有者是apache,攻击者基本上可以在我/var/www存储mysql密码和其他配置信息的地方移动。

虽然我知道 SQL 注入等威胁,并在涉及数据库的任何操作之前清理了用户输入,但我不知道如何设置沙箱。我可以使用哪些技术来禁用系统调用(现在我正在用户提交的代码中搜索“系统”这个词,而不是在找到它的地方执行那些片段)并限制对用户文件的访问提交的代码创建。

到目前为止,我的代码检查器仅适用于 C,并且我计划在保护它之后添加对 C++、Java、Ruby 和 Python 等其他语言的支持。此外,我想了解更多关于我遇到的这个问题的信息,因此我也可以在其中了解更多关于网络安全的信息。

我的开发机器正在运行 Mac OS Lion,而部署机器是一台 linux 服务器,所以如果一个解决方案是跨平台的,将不胜感激,但只处理 linux 机器的解决方案也可以。

4

5 回答 5

5

您可能想要做的是将 chroot 设置到文件系统上的某个随机临时目录,供运行脚本的用户使用。这是一些关于设置 chroot 的阅读,以及一些安全知识

我建议您还为 Apache 安装一个安全模块,例如 suExec 或MPM-iTK。然后,在您的 Apache 的 VirtualHost 中(如果您没有运行虚拟主机,请这样做!),分配一个特定的 UserID 来处理对这个特定 VirtualHost 的请求。这将请求与 Apache 默认用户分开,并增加了一点安全性。

    AssignUserID nonprivilegeduser nonprivilegeduser 

然后,通过设置以下 PHP 选项来稍微强化 PHP,以便用户无法访问特定目录之外的文件,tmp_dirsession_save_path在此目录中移动您的和。这将阻止用户访问其基本目录之外的内容。

    php_admin_value open_basedir /var/www/
    php_admin_value upload_tmp_dir /var/www/tmp
    php_admin_value session.save_path /var/www/tmp

随着 PHP 的行,防止访问特定的函数,并阅读PHP 的安全说明。

另外,我会让您查看该用户,禁用对sudoand的访问su,以防止脚本尝试访问 root 权限。了解更多,在这里

总而言之,你说得很好,很清楚。如果用户愿意,没有办法完全阻止他们访问您的系统。诀窍是让它尽可能困难,并尽可能让他们感到困惑。

于 2012-08-28T14:51:00.773 回答
1

以下是我建议做的事情。

php.ini1.在with中禁用系统类和函数

disable_functions="system,curl_init,fopen..."
disable_classes="DirectoryIterator,SplFileObject..."

2. 在只读环境中运行,不存储重要数据。万一有人进入您的服务器,您不希望他们访问任何内容。一个很好的方法是购买一个Amazon AWS EC2并使用一个被监禁的用户来运行你的服务器和 PHP。

3. 要求人们打破它。找到您不知道的缺陷和漏洞的唯一方法是找到它们。如有必要,请获取一个带有“测试”应用程序的临时服务器,该应用程序可以复制与您的“生产”环境相同类型的应用程序。

这里有一些有用的资源。

于 2012-08-27T22:37:08.553 回答
1

没有办法在跨平台的基础上进行这项工作。沙盒本质上是高度系统特定的。

在 Mac OS X 上,有沙盒工具。它的文档很少,但非常有效(谷歌浏览器严重依赖它)。一些有进取心的人已经记录了其中的一部分。但是,它仅在 Mac OS X 上可用,因此可能会排除它。

在 Linux 上,您的选项开发得相当少。一些内核支持seccomp机制,以防止进程使用除少量“安全”系统调用之外的任何系统调用;但是,并非所有人都这样做。此外,该“安全”子集不包括您可能需要的一些调用,这些调用可能在尚未专门编写以在 seccomp 下运行的代码中 - 例如,mmap并且sbrk是不允许的,因此您无法分配内存。不过,像seccomp-nurse这样的辅助工具可能会让您有所收获。

于 2012-08-21T17:28:33.207 回答
1

我认为您正在寻找的是强制访问控制。在 Linux 中,它可以通过 SeLinux 获得。使用它可以限制谁可以执行什么命令。在您的情况下,您可以限制 php 用户(Apache)仅执行有限的命令,如 gcc 等。还可以查看AppArmor

另外,查看runkit php虚拟环境

于 2012-08-28T00:41:14.547 回答
0

您可以尝试在非常轻量级的 VM 容器(docker)中运行用户提交的代码。他们在不到一秒钟的时间内开始。

于 2015-08-23T08:02:11.153 回答