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

前端之家收集整理的这篇文章主要介绍了linux – 在线虚拟机中安全地评估perl代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
更新2:我得到这个工作,它是活的:)

更新:请检查评论,@ikegami答案正在工作,但有一个小问题.我可能会做一些很简单的事情.

我最近决定我不得不学习Linux / Perl,然后我开始构建这个www.tryperl.com作为一个学习项目.这是一个Cloud IDE.

(自从我第一次在Perl,linux,bash,osx手中开始只有几个月,所以请轻松一点)

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

一个单独的Amazon EC2 VM,它将评估不安全的perl代码并返回结果.虚拟机将被阻止从互联网和负载均衡.然后,我可以从快照重新设置这台机器.

这主要是我将使用代码来评估服务器上的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;

我的问题

>我可以以某种方式避免物理文件创建,并使用$arg管道$代码
像打开(FILE,“perl< some_magic> |”).可能听起来很愚蠢,但我不得不问:(.
这在@ikegami的评论中已经解决了.
>我似乎不能使用Capture::Tiny.我尝试这样做在超时块内:
我的($stdout,$stderr,$count)= capture {system(‘echo Hello’)};
但是我一直没有空字符串! (是因为它在超时之内吗?(我不太在意这个)
>我没有看到任何其他安全漏洞?我应该做一个叉限制吗?我该怎么开始这样做? (链接和一些指针会很好)
> http://www.perltuts.com的作者在this article年表示,他使用qemu和一个debian图像来运行他的代码.他的做法与我的语义相似吗? (原谅我的无知在这里,记住我几个月前碰到一个linux盒)

我的开发框是OSX 10.8,生产服务器是前端的RHEL和Perl eval Machine的Ubuntu.我跑EC2.查看完整的堆栈details here.

任何详细的答案将会赞赏和奖励代表和独角兽尘土:)

解决方法

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

我探索了FreeBSD Jails,我的lack of networking经验和事实,我不得不重建操作系统多次驱使我离开. FreeBSD真的很酷!我会很快回来

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

文档不是很好,但this article真的帮助了一切.

>我在一个负载均衡器下安装了多个容器:HAProxy.
>我有一个perl安装在每个容器与我需要的cpan模块.
>我的PerlExecutor应用程序是一个运行于Starman的Dancer应用程序,它运行在一个有限的用户拥有,具有较少的权限,并在limits.conf有限制
>容器被从互联网封锁.

一个限制:我不太了解网络,所以我通过禁用主机端口转发来阻止互联网上的监狱.然而,监狱仍然需要在网络上,以便主机与之通信,因此,您仍然可以在监狱内执行ping,以解决域,但不会响应.所以任何web请求都会失败.我还对Ping进行字符串扫描并阻止它.

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

我想感谢@JakeFeasel @ikegami @ewwhite @chris-s和ubuntu.SE和unix.SE的人们的帮助:

这是它的样子:

猜你在找的Linux相关文章