Je voudrais implémenter un sandbox par ptrace()
dans un processus que je démarre et que tous ses enfants créeraient (y compris les petits-enfants etc.). Le processus parent ptrace()
, c'est-à-dire le superviseur. conceptuellement, cela limiterait l'accès au système de fichiers (en fonction du nom du chemin et de la direction d'accès (lecture ou écriture) et de l'accès au socket (par exemple, interdire la création de socket)Comment Linux Ptrace peut-il être dangereux ou contenir une condition de concurrence?
Que dois-je faire attention pour que le processus ptrace()
d et ses enfants (récursivement) ne sera pas en mesure de contourner le bac à sable? Y at-il quelque chose de spécial le superviseur devrait faire à fork()
temps pour éviter les conditions de course? Est-il possible de lire les arguments du nom de rename()
? du processus enfant sans condition de course
Voici ce que je l'ai déjà prévu de faire:
PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE
à éviter (certains) coditions de course quandfork()
ing- interdire tous les appels système par défaut, et cadrez une liste blanche du système a permis appels
- assurez-vous que les variantes d'appel du système
*at()
(tels queopenat
) sont correctement protégé
À quoi d'autre devrais-je faire attention?
Donc, fondamentalement, vous essayez de répliquer le backend basé sur ptrace de Systrace (http://www.systrace.org/)? – thkala
Oui, mon superviseur fonctionnerait de la même manière que systrace. Malheureusement, systrace semble être non maintenu, il ne compile pas proprement, et il semble aussi être bogué (il a pendu indéfiniment quand j'ai mis en sandbox GCC fonctionnant sous GNU as). – pts