2011-01-26 5 views
2

Ainsi, je fais une application en ligne que l'utilisateur peut soumettre le code et la sortie sera montrée à l'utilisateur. J'ai fait de la sécurité une priorité absolue et ont pris les mesures suivantes pour vous assurer que le code fonctionne correctement:Exécuter C++ dans VM, en toute sécurité

  • Exécution du code sur une machine virtuelle, sur un VPS qui est utilisé seulement pour exécuter ces machines virtuelles. Ces machines virtuelles n'autorisent aucun réseau ou accès au fichier après le répertoire de travail.
  • En utilisant les G ++ suivants drapeaux:

    -O -std=c++98 -pedantic-errors -Wfatal-errors -Werror -Wall -Wextra -Wno-missing-field-initializers -Wwrite-strings -Wno-deprecated -Wno-unused -Wno-non-virtual-dtor -Wno-variadic-macros -fmessage-length=0 -ftemplate-depth-128 -fno-merge-constants -fno-nonansi-builtins -fno-gnu-keywords -fno-elide-constructors -fstrict-aliasing -fstack-protector-all -Winvalid-pch 
    

Ma question je pense est vraiment comment puis-je faire cela plus sûr? Avez-vous personnellement des problèmes avec cette approche?

+1

Il n'y a vraiment aucune raison d'empêcher C++ 03. C++ 0x * peut-être * car sa bibliothèque standard inclut des threads, mais il n'y a rien de mal avec C++ 03. – Puppy

Répondre

9

Les indicateurs du compilateur n'ont pas vraiment d'importance. Un programme C++ avec ces indicateurs peut faire la même chose qu'un programme C++ compilé avec n'importe quel autre ensemble d'indicateurs. En particulier, il existe des dizaines de façons de retirer un comportement indéfini et, oui, d'exploiter potentiellement les failles de sécurité qui peuvent exister dans le système d'exploitation.

Vous exécutez un code non fiable, la fin de l'histoire. Vous pouvez espérer que le système d'exploitation ne sera pas compromis, que le code ne sera pas en mesure d'obtenir de nouvelles autorisations ou même de s'exécuter en tant que root, ou encore de perturber le système.

Et vous pouvez espérer que si cela se produit, il sera toujours contenu dans la machine virtuelle et ne sera pas en mesure d'affecter l'hôte.

Mais c'est toujours un code non fiable, et il peut faire n'importe quoi que le code non fiable pourrait faire. Le mieux que vous puissiez faire est de vous assurer qu'il fonctionne avec un minimum de privilèges, et que le système d'exploitation et le logiciel de virtualisation sont tous deux corrigés à 100%.

Bien sûr, avec les restrictions que vous mentionnez, ma première question est: «Y a-t-il quelque chose qui m'empêche de remplir le disque dur avec de la camelote? Ok, je ne peux pas écrire en dehors du répertoire de travail, mais je peux toujours faire en sorte que le disque manque d'espace. Ou y a-t-il un quota de disque ou quelque chose d'appliqué? Que diriez-vous de limiter la quantité de temps processeur que j'utilise? Serai-je capable d'utiliser toutes les ressources sur la machine, le rendant non-sensible?

+0

+1 pour les bons conseils. –

+0

La seule bonne réponse. Étonnamment, ce concept semble être perdu sur des tas de personnes qui signalent des problèmes de sécurité. [Il n'est pas surprenant que vous puissiez exécuter du code] (http: //blogs.msdn.com/b/oldnewthing/archive/2010/12/08/10101773.aspx);) –

+0

plus généralement, je pense que, en dehors des exploits, toute forme de déni de service devrait être considérée. Cela inclut également la mémoire en passant :) –

0

Si vous utilisez Linux pour exécuter le code que vous pouvez améliorer la sécurité de votre VM en redéfinissant certaines fonctions potentiellement dangereuses comme: open(...), fopen(...), socket(...), et ainsi de suite à l'aide LD_PRELOAD.

+1

Le problème est qu'il y a toujours la possibilité que vous manquiez l'une des fonctions dites potentiellement dangereuses. –

+0

Oui, c'est possible. Mais j'ai dit que cela ne ferait qu'améliorer la sécurité, pas la sécuriser totalement. Et il sera capable de surveiller si quelqu'un va essayer d'utiliser des fonctions définies et de bloquer des comptes. – Elalfer

+0

Ceci est un exemple d'une technique appelée "défense en profondeur". Il est destiné à limiter les dégâts, et doit toujours être combiné avec des méthodes pour éviter les dommages. Utiliser une machine virtuelle jetable est une telle prévention (sa perte est attendue, pas de dommage) – MSalters

0

AnVous pouvez utiliser la sécurité au niveau de l'utilisateur. Vous exécutez du code natif, ce qui signifie que votre code peut faire tout ce que l'utilisateur peut faire. Donc, limiter ce que l'utilisateur peut faire. Ajoutez la restriction "pas de réseau, pas d'accès aux fichiers en dehors du répertoire de travail" à la restriction des utilisateurs. Vous garderiez toujours la règle de VM, bien sûr, mais vous préféreriez attraper ces choses tôt.

Puisque vous parlez de GNU, je suppose un système Linux. Vous voudriez alors une machine virtuelle SELinux. Tout ce que vous ajoutez à la machine virtuelle pourrait être compromis, alors ignorez-le. Il n'y a probablement pas besoin d'installer un serveur X, etc.

Questions connexes