使用php安全系统调用在线代码检查器

时间:2012-08-12 07:25:46

标签: php security

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

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

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

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

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

截至目前,我的代码检查程序仅适用于C,我计划在保护它之后添加对其他语言(如C ++,Java,Ruby和Python)的支持。另外,我想了解更多关于我遇到的这个问题,以便了解我可以了解更多关于网络安全的地方。

我的开发机器运行的是Mac OS Lion,部署机器是linux服务器,所以如果一个解决方案,那就是跨平台,我会非常感激,但是那个只处理linux机器的解决方案也会这样做。

5 个答案:

答案 0 :(得分:5)

您可能想要做的是为运行脚本的用户在文件系统上的某个随机临时目录中设置chroot。以下是对setting up a chroot的一些解读,以及一些security to-know's

我建议您为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行之外,还要阻止访问特定的functionsclasses,并阅读PHP's security write-up

另外,我会让您考虑该用户,禁止访问sudosu,以防止脚本尝试访问root权限。了解详情,here

总而言之,你说得很清楚。如果用户有意愿,则无法完全阻止用户访问您的系统。诀窍是让它尽可能地困难,并尽可能让它们混淆。

答案 1 :(得分:1)

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

在Mac OS X上,有Sandbox工具。它记录很少,但非常有效(谷歌Chrome很大程度上依赖它)。 Some enterprising souls have documented parts of it.但是,它仅适用于Mac OS X,因此可能会将其排除在外。

在Linux上,您的选择相当不发达。一些内核支持seccomp机制,以防止进程使用除“小”“安全”系统调用之外的任何进程;然而,并非所有人都这么做此外,该“安全”子集不包括您在代码中可能需要的一些调用,这些调用尚未专门编写为在seccomp下运行 - 例如,mmapsbrk不是允许,所以你不能分配内存。像seccomp-nurse这样的助手工具可能会让你到达某个地方。

答案 2 :(得分:1)

以下是我建议做的事情。

1。 使用

禁用php.ini中的系统类和函数
disable_functions="system,curl_init,fopen..."
disable_classes="DirectoryIterator,SplFileObject..."

2。 在只读环境中运行,但不会存储重要数据。如果有人进入你的服务器,你不希望他们访问任何东西。执行此操作的一个好方法是购买Amazon AWS EC2并使用被监禁的用户来运行您的服务器和PHP。

3。 让人们打破它。你可以找到你不知道的缺陷和环孔的唯一方法就是找到它们。如有必要,请使用“test”应用程序获取临时服务器,该应用程序将复制“生产”环境所使用的相同类型的应用程序。

以下是一些有用的资源。

答案 3 :(得分:1)

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

另外,请查看runkit php虚拟环境

答案 4 :(得分:0)

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