aggiornamento 2: Ho ottenuto questo lavoro ed è vivo :)valutare codice Perl in modo sicuro in una macchina virtuale online
aggiornamento: Si prega di verificare i commenti, la risposta @ikegami sta lavorando, ma con un piccolo problema. Potrei fare qualcosa di abbastanza semplice sbagliato.
di recente ho deciso che dovevo imparare Linux/Perl davvero bene, e poi ho iniziato a costruire questo www.tryperl.com come un progetto di apprendimento. È un Cloud IDE di sorta.
(è stato solo pochi mesi da quando le mani ho messo prima a Perl, Linux, bash, osx, quindi si prega di andare facile su di me)
Attualmente mi eval codice con Safe.pm, ma il mio piano di gioco è :
Un VM Amazon EC2 separato che eval porterà codice perl non valido e restituirà il risultato. La VM verrà bloccata da Internet e caricata in modo bilanciato. Posso quindi resettare questa macchina da un'istantanea di tanto in tanto.
Questo è principalmente il codice Userò a eval codice Perl sul server, io uso Time::Out per la gestione del timeout:
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 ([email protected]){
return [email protected];
}
return $ret;
mio Problemi
Posso in qualche modo evitare la creazione di file fisici e inserire il codice $ con $ arg? ComeQuesto è stato risolto da @ikegami nei commentiopen(FILE,"perl <some_magic> | ")
. .. Potrebbe sembrare stupido, ma ho dovuto chiedere :(io non riesco a utilizzare Capture::Tiny Ho provato a fare questo all'interno del blocco timeout:.
my ($stdout, $stderr, $count) = capture { system('echo Hello') };
Ma ho continuato a ottenere le stringhe vuote! :(E 'perché è dentro il timeout? (non mi interessa troppo di questo comunque)ci sono altri problemi di sicurezza non sto vedendo? Devo fare un limite di forcella ? Come dovrei iniziare a farlo? (Link e alcuni indicatori sarebbero carini)
L'autore di http://www.perltuts.com dice in this article utilizza qemu e un'immagine di debian per eseguire il suo codice. A parte la limitazione della forcella, Il suo approccio è semanticamente simile al mio? (Perdonate la mia ignoranza di nuovo qui, ricordate ho toccato una macchina Linux solo pochi mesi fa)
mia macchina dev è OSX 10.8, server di produzione è RHEL per front-end e Ubuntu per l'eval macchina Perl. Corro su EC2. Vedi lo stack completo details here.
Qualsiasi risposta dettagliata sarà sarà apprezzato e ricompensato con rep e polvere unicorno :)
Take a guarda anche a Linux Containers. Ciò consente di eseguire i processi in un ambiente molto limitato. http://nigel.mcnie.name/blog/a-five-minute-guide-to-linux-containers-for-debian – Dave
+1 Ohh grazie mille @Dave questo è molto interessante. Pensi che io possa eseguire uno di quelli su EC2 però? L'istanza di ec2 è una macchina virtuale stessa. Mi occuperò io :) – gideon
Perl leggerà il codice da STDIN, quindi 'aprirò (my $ fh, '| -', 'perl', '-', @args_for_script)'. – ikegami