V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
publicID321
V2EX  ›  问与答

关于在服务端程序执行任意用户输入的安全问题

  •  
  •   publicID321 · 2015-09-08 14:03:10 +08:00 · 2264 次点击
    这是一个创建于 3365 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想做一个类似 http://www.udebug.com/ 的网站,简单来说就是获取用户输入,在服务端 C/C++程序中运行,再返回输出给用户。

    网站是用 php 写的,目前直接用 apache 用户执行,并且用 ulimit 限制时间内存,在 C/C++代码中加入数据有效性验证,相关代码如下:

    $fh = fopen ($filename, "w");
    fwrite ($fh,$_POST['userinput']);
    fclose ($fh );
    exec ("ulimit -m 128000 -t 10;./$program<$filename>$outputfile");

    其中$filename 和$outputfile 是随机生成的字符串。程序就放在网站目录中,用.htaccess 拒绝访问请求。

    因为验证数据有效性又麻烦又很难考虑周全,目前想对运行的程序进行进一步降权,然后不做数据有效性验证了,就进行资源限制,然后数组访问越界之类由于数据产生的问题都不管了。

    目前大致想到两个解决方案:
    1.新建一个用户,拒绝其文件系统大部分的访问权(用 ACL ?),然后 apache 加入 sudoer 中, apache 用新建的用户身份执行程序。
    2.不新建用户,用 nobody 执行?

    不知道这么做会不会带来什么新的安全隐患,以及这个网站安全方面还有什么要注意的地方?

    10 条回复    2015-09-09 17:04:05 +08:00
    kslr
        1
    kslr  
       2015-09-08 14:25:17 +08:00
    我觉得这很适合 Docker ,任何破坏都无所谓了
    wy315700
        2
    wy315700  
       2015-09-08 14:33:51 +08:00
    ptrace ,参考 OJ 的做法
    virusdefender
        3
    virusdefender  
       2015-09-08 15:11:48 +08:00 via Android
    ptrace 效率太低,我们最近也在做一个 oj ,用的是 docker 和 lrun

    github 上去搜 lrun
    virusdefender
        4
    virusdefender  
       2015-09-08 15:12:24 +08:00 via Android
    oj 再过几天会开源,你到时候也可以看看我们的
    virusdefender
        5
    virusdefender  
       2015-09-08 15:15:33 +08:00 via Android
    wy315700
        6
    wy315700  
       2015-09-08 15:21:23 +08:00
    @virusdefender 你们对于超时是怎么处理的
    virusdefender
        7
    virusdefender  
       2015-09-08 15:52:06 +08:00
    @wy315700 看 lrun
    invite
        8
    invite  
       2015-09-09 08:40:53 +08:00
    以后应该搞个虚拟机,直接运行应用并进行相互隔离。
    publicID321
        9
    publicID321  
    OP
       2015-09-09 17:00:22 +08:00
    首先谢谢楼上各位的回复。
    @kslr 自己 vps 上搞的,不知道 docker 适不适合,过两天看看。

    @wy315700 OJ 是降了权然后还用 ptrace 限制吗?

    @virusdefender 你们是在 docker 里还用 lrun 限制权限和资源吗?这个地址收藏了,等你们发布的时候学习下。

    @invite QAQ 如果是做成产品的话我应该会用的,目前就是在自己 vps 上弄着玩玩……
    wy315700
        10
    wy315700  
       2015-09-09 17:04:05 +08:00
    @publicID321 chroot 改变执行环境,然后用 Ptrace 监控系统调用,阻止一切除标准输入输出以外的所有调用,然后还可以限制内存,执行时间什么的。
    本校的 OJ 代码,,,
    https://github.com/wy315700/ecustoj
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1127 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 89ms · UTC 18:20 · PVG 02:20 · LAX 10:20 · JFK 13:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.