2010-05-07 5 views
3

La situation (hypothétique pour l'instant) est que l'utilisateur de mon système va recevoir un morceau de code C et a besoin de mon système pour le compiler et l'exécuter dans un sandbox chroot qui est généré à la volée et je veux le moins de fichiers possible dans la boîte. Je suis seulement prêt à jouer avec les paramètres du compilateur et de l'éditeur de liens (lien statique tout ce que je peux espérer trouver) et faire une restriction modérée sur ce que le code peut attendre (par exemple, ils ne peuvent pas utiliser de bibliothèques arbitraires).Combien de fichiers faut-il pour charger un programme sous Linux?

La question est de savoir comment je peux obtenir le bac à sable. Il est clair que j'ai besoin de l'exécutable, mais qu'en est-il d'un chargeur ELF et d'un .so pour les appels système? Est-ce que je peux jeter l'un ou l'autre et y a-t-il autre chose dont j'ai besoin?

Répondre

3

Vous n'avez pas besoin quoi que ce soit, sauf l'exécutable pour exécuter un monde bonjour lié statiquement. Vous, bien sûr, besoin de beaucoup plus de le compiler.

Vous pouvez tester ce assez facilement, je l'ai fait avec le code trivial C suivant:

#include <stdio.h> 
int main() { 
    puts("Hello, world\n"); 
    return 0; 
} 

compilez avec gcc -static. Ensuite, créez un nouveau répertoire (je l'ai appelé "chroot-dir"), déplacez la sortie ("hello") dedans. Donc, le seul fichier dans le chroot est maintenant l'exécutable. Ensuite, exécutez chroot chroot-dir ./hello, et vous obtiendrez Bonjour, monde.

Notez qu'il y a certaines choses qui ne peuvent pas être compilées statiquement. Par exemple, si votre programme effectue une authentification (via PAM), les modules PAM sont toujours chargés dynamiquement. Notez également que divers fichiers dans/etc sont nécessaires pour certains appels; l'une des fonctions getpw * et getgr *, les fonctions de résolution de noms de domaine, etc. nécessitent nsswitch.conf (et certains objets partagés, et peut-être plus de fichiers de configuration, et parfois même plus d'exécutables, selon les méthodes de recherche configurées). , et /etc/protocols sera probablement très utile pour tout réseau.

Un moyen facile de comprendre quels fichiers un programme utilise est de l'exécuter sous strace. Vous devez d'abord faire confiance au programme.

+0

Très belle réponse! Je me demande ce qu'il faudrait pour normaliser ce qui peut être utilisé dans tous les systèmes: seules les fonctions universellement accessibles sont toujours accessibles. – BCS

0

pas besoin de chargeur ELF. pour vérifier quelles bibliothèques dynamiques vous devez faire ldd <executable>. Si vous parvenez à tout compiler statiquement, il n'aura pas besoin de .so. Au-delà de cela, il s'agit uniquement de la structure de données et de répertoires dont votre programme pourrait avoir besoin.

Mais tout cela est seulement si vous utilisez la commande /usr/bin/chroot; Si vous faites votre programme appeler int chroot(const char *path); lui-même après vous être assuré que toutes les bibliothèques dynamiques sont chargées, vous n'aurez besoin de rien sur le sandbox de l'annuaire. pas même l'exécutable lui-même.

edit: Une autre idée:. L'utilisation TCC (ou plutôt, libtcc pour compiler, lien, charger et exécuter le bloc C donnée exécuter le processus à l'intérieur d'un environnement restreint « extérieur », chutant à un « intérieur » (vide) un juste avant l'exécution (bien sûr, exécutez dans un fork(), ou vous ne serez pas capable de sortir de la prison 'interne' vers la 'externe') .Vous pouvez également profiter de libtcc's lié de l'exécution vérifiée.

+1

Vous ** ne devez pas ** exécuter ldd sur un exécutable non fiable! ldd fait * exécuter l'exécutable *. – derobert

+0

Eh bien, ce n'est pas un exécutable, c'est le code source C qu'il compile lui-même. bien sûr, cela ne fait pas confiance; mais il pourrait insérer l'appel chroot() et compiler statiquement. toute source bien conduite devrait courir sans rien dans la prison; s'il a encore besoin de quelque chose, je ne l'appellerais pas sage. – Javier

+0

Je pensais que le programme serait chargé après chroot. – BCS