繁体   English   中英

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

[英]Secure system calls with php for an online Code Checker

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

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

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

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

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

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

我的开发机器运行的是Mac OS Lion,部署机器是linux服务器,所以如果是跨平台的解决方案将是最受欢迎的,但只涉及linux机器的解决方案也会这样做。

您可能想要做的是为运行脚本的用户在文件系统上的某个随机临时目录中设置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的安全性写入

此外,我会让你考虑该用户,禁止访问sudosu ,以防止脚本尝试访问root权限。 在这里了解更多。

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

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

在Mac OS X上,有Sandbox工具。 它记录很少,但非常有效(谷歌Chrome很大程度上依赖它)。 一些有进取心的人已经记录了它的一部分。 但是,它仅适用于Mac OS X,因此可能会将其排除在外。

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

以下是我建议做的事情。

1.使用php.ini禁用系统类和函数

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

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

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

这是一些有用的资源。

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

另外,查看runkit php虚拟环境

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM