Question évaluer le code Perl en toute sécurité dans une machine virtuelle en ligne


mise à jour 2: J'ai ce travail et c'est en direct :)

mettre à jour: S'il vous plaît vérifier les commentaires, réponse @ikegami fonctionne mais avec un léger problème. Je fais peut-être quelque chose de très simple.


J'ai récemment décidé de bien apprendre Linux / Perl, puis j'ai commencé à construire www.tryperl.com comme projet d'apprentissage. C'est un Cloud IDE de toutes sortes.

(Cela fait seulement quelques mois que j'ai mis la main sur perl, linux, bash, osx, alors allez-y doucement)

Actuellement, j'évalue le code avec Safe.pm, mais mon plan de match est le suivant:

Une VM Amazon EC2 distincte qui évaluera peu sûr Perl code et retourne le résultat. La VM sera bloquée depuis Internet et équilibrée. Je peux alors réinitialiser cette machine à partir d'un instantané de temps en temps.

C'est la plupart le code que je vais utiliser pour évaluer le code perl sur le serveur, j'utilise Temps libre pour la gestion du 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 ($@){
    return $@;
}   
return $ret;

ma Problèmes 

  1. Puis-je en quelque sorte éviter la création de fichiers physiques et diriger le code $ avec le $ arg? Comme open(FILE,"perl <some_magic> | "). Cela pourrait sembler stupide mais je devais demander :(. Cela a été résolu par @ikegami dans les commentaires.

  2. Je n'arrive pas à utiliser Capture :: Minuscule. J'ai essayé de le faire à l'intérieur du bloc de temporisation:
    my ($stdout, $stderr, $count) = capture { system('echo Hello') };
    Mais j'ai continué à avoir des chaînes vides! :( Est-ce parce que c'est à l'intérieur du délai d'attente? (Je ne me soucie pas trop à ce sujet)

  3. Y a-t-il d'autres failles de sécurité que je ne vois pas? Devrais-je faire un limite de fourche? Comment devrais-je commencer à faire ça? (Les liens et quelques pointeurs seraient sympas)

  4. L'auteur de http://www.perltuts.com dit dans Cet article il utilise qemu et une image debian pour exécuter son code. En dehors de la limitation de fourche, Son approche est-elle sémantiquement similaire à la mienne? (Pardonnez mon ignorance ici encore, rappelez-vous que j'ai touché une boîte Linux il y a quelques mois seulement)

Ma boîte de développement est OSX 10.8, le serveur de production est RHEL pour le frontal et Ubuntu pour la machine Perl eval. Je cours sur EC2. Voir la pile complète détails ici.

Toute réponse détaillée sera appréciée et récompensée par de la poussière de représentant et de licorne :)


10
2018-02-13 19:30


origine


Réponses:


Après 13 jours de dur labeur, je l'ai finalement fait !!

J'ai exploré Jails FreeBSD, mon manque de réseautage l'expérience et le fait que j'ai dû reconstruire le système d'exploitation à plusieurs reprises m'ont conduit à FreeBSD est vraiment cool !! Je vais y revenir bientôt.

J'ai regardé sombre OpenVZ et puis grâce à @ewwhite J'ai revisité Conteneurs Linux et lui a donné un coup approprié.

Les docs ne sont pas géniaux mais Cet article vraiment aidé avec tout.

  • Je configure plusieurs conteneurs sous un équilibreur de charge: HAProxy.
  • J'ai une installation de perl dans chaque conteneur avec les modules de cpan dont j'ai besoin.
  • ma PerlExecutor l'application est une application Dancer qui s'exécute sur Homme d'étoiles, il fonctionne sous la propriété d'un utilisateur limité qui a moins de privilèges et a des limites dans limits.conf
  • Le conteneur est bloqué depuis Internet.

Une limitation : Je ne sais pas grand chose sur la mise en réseau, j'ai donc bloqué les jails d'Internet en désactivant le transfert de port sur l'hôte. Cependant, les jails doivent toujours être sur le réseau pour que l’hôte puisse communiquer avec lui. Par conséquent, vous pouvez toujours faire une ping à l'intérieur de la prison qui va résoudre le domaine, mais il ne répondra pas. Ainsi, toutes les requêtes Web internes échouent. Je fais aussi un scan de chaîne pour Ping et le bloquer.

Toute suggestion ou amélioration sera la bienvenue!

Je voudrais remercier @JakeFeasel  @ikegami  @ewwhite  @ chris-s et les gars de ubuntu.SE et unix.SE pour leur aide:

Voici à quoi ça ressemble:

TryPerl Architecture Diagram


5
2018-02-28 08:37