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)
我的问题
我可以以某种方式避免物理文件创建并使用$ arg管道$ code 吗?喜欢.这已经在评论中由@ikegami解决了.open(FILE,"perl <some_magic> | ").可能听起来很愚蠢,但我不得不问:(
我似乎无法使用Capture :: Tiny.我尝试在超时块中执行此操作:
my ($stdout, $stderr, $count) = capture { system('echo Hello') };
但我一直得到空字符串!:(是因为它在超时内吗?(虽然我不太关心这个)
我还没有看到任何其他安全漏洞吗?我应该做叉限制吗?我应该怎么做呢?(链接和一些指针会很好)
http://www.perltuts.com的作者在本文中说他使用qemu和debian图像来运行他的代码.除了限制叉,他的方法在语义上与我的相似吗?(再次请原谅我的无知,记得我几个月前才碰过一个linux盒子)
我的开发盒是OSX 10.8,生产服务器是RHEL用于前端,Ubuntu用于Perl eval机器.我在EC2上运行.在此处查看完整堆栈详细信息.
任何详细的答案将得到赞赏和奖励与rep和独角兽尘埃:)
经过13天的努力,我终于做到了!
我探索了FreeBSD Jails,我缺乏网络经验以及我不得不多次重建操作系统驱使我离开的事实.FreeBSD真的很酷!! 我很快就会回来.
我在OpenVZ看起来很惨淡,然后感谢@ewwhite我重新访问了Linux Containers并给了它一个合适的镜头.
文档并不好,但这篇文章真的对一切都有帮助.
一个限制:我对网络知之甚少,所以我通过在主机上禁用端口转发来阻止来自互联网的监狱.但是,jail仍然需要在网络上供主机与之通信,因此,您仍然可以在jail中执行ping操作,这将解析域但不会响应.因此任何内部Web请求都会失败.我也做了一个字符串扫描Ping并阻止它.
任何建议或改进都将非常受欢迎!
我要感谢@JakeFeasel @ikegami @ewwhite @ chris-s以及ubuntu.SE和unix.SE的帮助:
这就是它的样子:
