2010-02-28 10 views
1

Eh bien, c'est une sorte de serveur web.C++: N'importe quel moyen de «prison»?

Je charge des fichiers .dll (.a) et les utilise comme modules de programme.

Je parcours récursivement les répertoires et place les foncteurs '_main' de ces bibliothèques dans std :: map sous le nom, qui est membre des fichiers spéciaux '.m'.

Le répertoire principal a peu de répertoires pour chaque hôte.

Le problème est que je dois empêcher l'utilisation de 'fopen' ou de toute autre fonction de système de fichiers fonctionnant avec un répertoire en dehors de ce répertoire hôte.

La seule façon que je peux voir pour cela - écrire une chaîne pour stdio.h (je veux dire, écrire s_stdio.h qui a une vérification de nom de fichier).

Peut-être que ce pourrait être un démon, attraper les appels système et identifier quelque chose?

ajouter

Eh bien, et qu'en est-ce genre de situation: je télécharger seulement souses puis compiler directement sur mon serveur après avoir vérifié jusqu'à? Eh bien, c'est la seule façon que j'ai trouvée (avoir tout à l'intérieur d'un espace d'adresse toujours).

+0

@Tronic, merci pour 'sandboxing', mais qu'en est-il de 'winapi' - il est souhaitable d'être multi-plateforme (je comprends que le démon ne peut pas être cr-p, donc j'utiliserais peu de réalisation dans ce cas pour chaque Plate-forme). –

+3

J'exécuterais chaque _module_ dans son propre processus ayant chacun un compte d'utilisateur différent. Jetez également un coup d'oeil à chroot(). –

+0

Alexandre Jasmin, c'est la première chose qui me vient à l'esprit. Mais il devrait être à l'intérieur d'un espace d'adresse. C'est ce que j'essaie de viser. –

Répondre

3

Comme C++ est un langage de bas niveau et que les DLL sont compilées en code machine, ils peuvent tout faire. Même si vous encapsulez les fonctions de bibliothèque standard, le code peut effectuer directement les appels système, réimplémentant la fonctionnalité que vous avez enveloppée. La seule façon de mettre efficacement en place une telle DLL est probablement une sorte de virtualisation, donc le code n'est pas exécuté directement mais sur une machine virtuelle.

La solution la plus simple consiste à utiliser un langage de niveau supérieur pour les modules chargeables qui doivent être mis en sandbox. Certains langages de haut niveau sont meilleurs dans le sandboxing (Lua, Java), d'autres ne le sont pas (par exemple, AFAIK actuellement, il n'y a pas d'environnement restreint officiel implémenté pour Python).

+1

Un exemple classique de contournement des fonctions standard de la bibliothèque (extrait du Concours International C Code Obfuscated): http://www1.us.ioccc.org/1984/mullender.c http://www1.us.ioccc.org/1984 /mullender.hint – bk1e

+0

Je ne suis pas sûr, j'ai compris écrire le dernier commentaire. (E. n'est pas ma langue maternelle). @ bk1e, voici des exemples de contourner le filtre 'mauvaises fonctions'? Qu'est-ce qui le relie à l'obfuscation? –

+0

Un filtre "mauvaises fonctions" n'attraperait pas un tableau d'octets qui seraient exécutés comme code machine. – bk1e

1

Si vous chargez le module, vous pouvez effectuer une analyse statique sur le code pour vérifier quelles API il appelle et refuser de le lier s'il ne vérifie pas (c'est-à-dire s'il devient suspect) appel du tout). Cela dit, c'est beaucoup de travail pour ce faire, et pas très portable.

+0

Vous devez interdire les tableaux, ou au moins trouver un moyen fiable de vérifier les dépassements de tampon. – bk1e