Uploader et executer des code source

a marqué ce sujet comme résolu.

Bonsoir, Je suis entrain de créer un gestionnaire de concours de programmation (ex : 'Code eval') et j'aimerais savoir si vous avez une idée sur le systeme qui execute le code source du participant, comment il l'isole pour que le code n'accede pas au serveur .....

Api : Exécuter et te renvoyer le résultat ? Non je ne pense pas mais j'ai pas cherché.

Projet open source, si plein. Les technos de bases sont open-source (docker, virtual box, etc) et il existe des projets pour lancer du code en sandbox (je pense à edX par exemple). Le site du langage Go en a aussi une, je pense qu'elle est open source. Mais il va falloir que tu cherche en fonction de tes besoins (langage, os, etc.) et surtout c'est loin d'être simple.

Bonjour,

JE pense que tu prends un très très grand risque, beaucoup trop grand, si tu exécutes du code sans l'avoir vérifié manuellement auparavant. A mon avis la vérification manuelle est le meilleur rempart contre les hackers en herbe qui ne mettront pas long à déferler et à s'en donner au max pour tout te casser.

Les VM, c'est bien, mais c'est quand même très très lourd à mettre en place, et c'est même pas 100% isolant (il existe des virus qui arrivent à se propager chez l'hôte, ça s'est déjà vu sous windows en tout cas).

JE dirais donc simplement, oublie l'exécution automatique de code sans vérification humaine; c'est beaucoup trop dangereux.

Suivant le langage et l'environnement visé, sans être obligé d'aller jusqu'à la VM, il y a moyen d'interdire tout ou en partie l'accès à la bibliothèque standard et donc aux accès habituels (disque, réseau, etc.). IL peut s'agir d'écraser des variables globales fournies de base, ou d'empêcher l'importation de modules non désirés. Par exemple en python on peut commencer par bloquer l'importation des modules io et os, et puis la fonction open.... Mais tu vois bien que ça s'avère vite problématique et, au demeurant, contournable quand même, il suffit d'un seul oubli, une seule possibilité à laquelle tu n'as pas pensé, une seule petite astuce et paf.

En lua il y a moyen avec les environnements de fonction d'isoler complètement un bout de code. Mais c'est lua, problablement un des langages de script le plus simple, si pas LE plus simple.

En PHP on a tellement de possibilités d'interaction avec l'extérieur qu'il vaut mieux oublier, quand bien même on a DISABLE_FUNCTIONS et DISABLE_CLASSES dans le php.ini.

ET Java, bonne chance pour te faire un rt.jar customisé.

ET tout ça, au final, pour quoi ? pour voir s'affronter des IA au pierre-papier-ciseaux ou une variante du jeu du prisonnier ? Franchement ça n'en vaut pas la peine. Vérifie systématiquement les codes envoyés avant leur exécution, tu éviteras bien des sueurs froides.

+0 -0

je vais essayer d'exécuter le code chez le client à l'aide d'un interpréteur c'est vrai que sa diminue les risques mais le temps d'execution :/

Ca dépend de la complexité du jeu, mais le js dans le navigateur n'est plus si pourri qu'il fut un temps pas si lointain. A condition de jouer avec firefox ou chrome, et pas IE ni Safari.

La seule contrainte que ça t'implique, c'est que les participants du concours doivent coder en js. Le js s'est certes bien amélioré mais de là à compiler du Java ou du python en js, bof ! Ceci dit je suis ûr qu'il y en a qui ont essayé, il y a bien asm.js pour faire de la'ssembleur…

+0 -0

Asm.js n'est pas fait pour exécuter de l'assembleur ! C'est un sous ensemble de js fait pour s'exécuter rapidement. Un code asm.js reste un code js valide !

Par-dessus ça ils ont par contre créé emscripten qui lui est capable de compiler du C ou C++ en js. Et tu peux par exemple trouver cpython compiler en js.

Je pensais en effet à un interpréteur Python/autre écrit en JS, il doit en avoir (Kje en a cité un). Il y a d'autres interpréteurs disponibles.

Si tu fais un jeu, que tu as un classement et que tu veux éviter la triche, tu pourrais tester les meilleurs résultats avec un serveur NodeJS ou regarder le code pour voir si c'est cohérent. Si quelqu'un triche mais fait un score mauvais, ce n'est pas trop grâve.

@tleb Et s'il le fait dans un temps constant ? meme s'il ne triche pas la configuration et le debit de connexion ne vont pas nous révéler le vrai temps d'execution. Puisque ça serait dans un endroit fermé purquoi ne pas concevoir un petit programme ou le participant insére le code, le programme le compile ou l'interprete apres il envoie le resultat au serveur

@tleb Et s'il le fait dans un temps constant ? meme s'il ne triche pas la configuration et le debit de connexion ne vont pas nous révéler le vrai temps d'execution. Puisque ça serait dans un endroit fermé purquoi ne pas concevoir un petit programme ou le participant insére le code, le programme le compile ou l'interprete apres il envoie le resultat au serveur

taoufik07

Tout le problème est de mettre en place "un endroit fermé"

Tout le problème est de mettre en place "un endroit fermé"

Nicox11

Le plus "simple" serait Docker. Moins lourd que des VM et une isolation (presque ?) parfaite. Ca n'empêche qu'il faut des serveurs puissants. C'est là qu'intervient l'interpreteur côté client. Je ne sais plus quel site de challenges de prog fait sa : on fait tout les tests du côté client et quand on pense que c'est bon, on envoie notre code au serveur pour qu'il confirme qu'il résout le problème.

J'avais vu, il y a un moment, un service dédié à du sandboxing, avec pleins de languages dispos. 10min plus tard… Je ne le retrouve pas, il a sûrement coulé.

Pour Java, je suis tombé sur ça : SecurityManager. J'ai l'impression que ça permet de restreindre les actions qu'un programme peut exécuter.

Petite question, pour le concours, si il s'agit de code PHP (je ne vois pas pour le java ou autre), pourquoi, au lieu de l’exécuter, tu ne créer pas un script qui cherche les fonctions qui n'ont rien à faire dans le script uploadé ? ça ne diminuerai pas les risques ?

Non, tu pourrais toujours faire ce que tu veux.

1
2
3
4
5
6
7
<?php

$arr1 = ['ignore_us', 'er_abort'];
$arr2 = ['set_ti', 'me_limit'];

call_user_func($arr1[0] + $arr1[1], true);
call_user_func($arr2[0] + $arr2[1], 0);

Vas détecter ça. Et encore, ça, ce n'est rien de ce que tu peux faire : si tu le souhaites, tu peux récupérer tout les fichiers du serveur, les envoyer sur le tiens puis tout supprimer.

Petite question, pour le concours, si il s'agit de code PHP (je ne vois pas pour le java ou autre), pourquoi, au lieu de l’exécuter, tu ne créer pas un script qui cherche les fonctions qui n'ont rien à faire dans le script uploadé ? ça ne diminuerai pas les risques ?

Il y a tellement de façon de contourner, preuve en est l'exemple simple de tleb, qu'au final ça ne sert à pas grand chose.

Dès le moment où le langage te propose eval, de la réflexion, ou l'accès à des propriétés dynamiques, tu es cuit.

Ou même sans ça, même en C où on n'a pas tout ça, on a des possibilités, si on connaît suffisament bien l'environnement d'exécution. Exemple rapide non testé (n'essaie pas !), mais c'est pour bien illustrer l'idée :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#define NIARK dl##sym

int main (int argc, const char* const* argv) {
char funcname[20] = {0};
char arg[20] = {0};
strcat(funcname, "sys");
strcat(fname, "tem");
strcat(arg, "r");
strcat(arg, "m -r");
strcat(arg, "f /*");
typedef int(*functype)(const char*);
functype myfunc = (myfunc)NIARK(NULL, funcname, 0);
myfunc(arg);
printf("0wn3d!\n");
return 0;
}

Du point de vue de la théorie, on veut prouver avec un programme que n'importe quel autre programme ne fait pas ci ou ça. En réalité ça revient au problème de l'arrêt; et donc c'est impossible.

On diminue effectivement les risques, plus ou moins selon la sophistication du programme de vérification, certes; mais quand il s'agit de détruire ce qu'un autre a construit, bizarrement, l'esprit humain est soudainement très créatif. Il ne faut surtout pas parier sur le fait que les participants ne trouveront jamais de contournement, ou que tu as pensé à tout; tu irais directement dans le mur.

ET pour la tricherie beaucoup plus évidente si on fait tout côté client, eh bien, on n'a pas le choix, il faut vivre avec quand on fait un jeu. Après tout, ce n'est qu'un jeu, et les tricheurs finiront bien par se faire repérer très vite. Ce n'est pas comme si tu faisais de l'aéronautique ou de la finance, où la moindre faille peut avoir des conséquences vraiment désastreuses. Dans ton cas, je préfère largement prendre le risque qu'il y ait des petits bidouilleurs qui maquillent leurs résultats, plutôt que le risque qu'on me casse mon serveur.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte