在线虚拟机中安全地评估perl代码

gid*_*eon 10 linux virtualization perl amazon-ec2

更新2:我得到了这个工作,它的生活:)

更新:请检查评论,@ urggami答案是否正常但有轻微问题.我可能正在做一些非常简单的错误.


我最近决定我必须学习Linux/Perl,然后我开始构建这个www.tryperl.com作为学习项目.它是各种各样的云IDE.

(自从我第一次接触perl,linux,bash,osx以来仅仅几个月,所以请放轻松我)

目前我使用Safe.pm评估代码,但我的游戏计划是:

一个单独的Amazon EC2 VM,它将评估不安全的 perl代码并返回结果.VM将被阻止从互联网和负载平衡.然后,我可以偶尔从快照重置此计算机.

主要是我将用于评估服务器上的perl代码的代码,我使用Time :: Out进行超时管理:

my $code = ..
my $arg = ..

#create a file with random name
my $filename = rand().".pl";
open(FILE,">$filename")
print FILE $code;
close(FILE);

#use Time::Out to timeout after 10 secs

my $ret = timeout 10 => sub {
  #run the file just created with $arg as an argument. << This is IMP 
  my $r = `perl $filename $arg`;
  return $r;
};
if ($@){
    return $@;
}   
return $ret;
Run Code Online (Sandbox Code Playgroud)

我的问题

  1. 我可以以某种方式避免物理文件创建使用$ arg管道$ code 吗?喜欢open(FILE,"perl <some_magic> | ").可能听起来很愚蠢,但我不得不问:(.这已经在评论中由@ikegami解决了.

  2. 我似乎无法使用Capture :: Tiny.我尝试在超时块中执行此操作:
    my ($stdout, $stderr, $count) = capture { system('echo Hello') };
    但我一直得到空字符串!:(是因为它在超时内吗?(虽然我不太关心这个)

  3. 我还没有看到任何其他安全漏洞吗?我应该做叉限制吗?我应该怎么做呢?(链接和一些指针会很好)

  4. http://www.perltuts.com的作者在本文中说他使用qemu和debian图像来运行他的代码.除了限制叉,他的方法在语义上与我的相似吗?(再次请原谅我的无知,记得我几个月前才碰过一个linux盒子)

我的开发盒是OSX 10.8,生产服务器是RHEL用于前端,Ubuntu用于Perl eval机器.我在EC2上运行.在此处查看完整堆栈详细信息.

任何详细的答案将得到赞赏和奖励与rep和独角兽​​尘埃:)

gid*_*eon 5

经过13天的努力,我终于做到了!

我探索了FreeBSD Jails,我缺乏网络经验以及我不得不多次重建操作系统驱使我离开的事实.FreeBSD真的很酷!! 我很快就会回来.

我在OpenVZ看起来很惨淡,然后感谢@ewwhite我重新访问了Linux Containers并给了它一个合适的镜头.

文档并不好,但这篇文章真的对一切都有帮助.

  • 我在负载均衡器下设置了多个容器:HAProxy.
  • 我在每个容器内部都安装了一个perl,并带有我需要的cpan模块.
  • 我的PerlExecutor应用程序是一个在Starman上运行的Dancer应用程序,它由一个有限用户拥有,该用户拥有较少的权限并且在limits.conf中有限制.
  • 容器被禁止上网.

一个限制:我对网络知之甚少,所以我通过在主机上禁用端口转发来阻止来自互联网的监狱.但是,jail仍然需要在网络上供主机与之通信,因此,您仍然可以在jail中执行ping操作,这将解析域但不会响应.因此任何内部Web请求都会失败.我也做了一个字符串扫描Ping并阻止它.

任何建议或改进都将非常受欢迎!

我要感谢@JakeFeasel @ikegami @ewwhite @ chris-s以及ubuntu.SE和unix.SE的帮助:

这就是它的样子:

TryPerl架构图