2008-10-08 5 views
3

Je voudrais pouvoir lancer un processus Linux qui aurait seulement accès à stdin, stdout et stderr (rien de plus et rien de moins). Puis-je faire cela au niveau du processus lui-même? Je déclare implicitement (oxymoron) que je ne veux pas que le processus engendré soit capable de changer la «chose» à laquelle l'autre extrémité du flux pointe.Est-il possible de limiter les flux standards disponibles à Linux au niveau du processus?

Métaphoriquement:

  • le processus a un tuyau d'entrée qui vient de quelque part, il ne peut pas changer l'endroit où le tuyau commence à partir, donc il ne peut pas contrôler où l'entrée vient.
  • Le processus a des canaux de sortie et d'erreur qui vont quelque part, il ne peut pas changer où l'autre extrémité des tuyaux de sortie pointe, de sorte qu'il ne peut pas contrôler où la sortie va.
  • il ne peut pas créer de nouveaux tuyaux.

Je suis également à la recherche de SElinux. Cela me permettrait-il de créer un processus qui n'aurait accès qu'à ces trois volets? Je vous remercie.

Répondre

2

Comme indiqué dans une autre réponse SELinux dispose de diverses autorisations qui permettent de verrouiller n'importe quel processus. Le noyau gère l'accès à certains objets (avec un ensemble d'autorisations associé), par exemple un fichier est un objet, un répertoire est un objet, un socket datagramme unix est un objet et bien d'autres.

probablement la chose la plus facile à faire est d'écrire une petite politique. Heureusement, SELinux est refusé par défaut alors lancez votre programme et regardez les logs pour les dénégations de SELinux et n'autorisez que votre programme à faire ce que vous voulez. En d'autres termes, vous évitez d'ajouter des permissions qui impliquent des classes d'objets comme msg (messages dans une file d'attente de messages systemV), msgq (file d'attente de messages SystemV), sem (sémaphores), shm (mémoire partagée) et probablement d'autres.

Je propose la première fois que vous ne l'ont SELinux sur mais permissive (voir setenforce 0)

Je suggère également des outils pour vous aider à construire une politique, il peut être un peu écrasante pour écrire M4 essentiellement brute

1

Si vous êtes root, vous pouvez chrooter dans un répertoire, supprimer les privilèges pour ne plus avoir d'accès en écriture au système de fichiers, puis exec. Cela empêchera un programme de créer de nouveaux fichiers. Mais il n'y a aucun moyen d'empêcher un programme de créer des pipes et des sockets (bien, no-sockets est possible avec SELinux), et il n'y a aucun moyen d'empêcher un programme de réarranger et de fermer ses descripteurs de fichiers. Eh bien, je suppose que vous pouvez utiliser ptrace pour intercepter tous les appels système, et ne permettre que ceux que vous approuvez, alors quand je dis "il n'y a pas moyen" je veux dire "il n'y a pas de moyen facile". Cela entraîne des frais généraux notables, mais si vous êtes assez prudent, vous pouvez le sécuriser. Les projets strace ou UMview peuvent être de bons points de départ si vous décidez de suivre cette voie.

1

SELinux pouvait faire le travail; Vous pouvez attribuer des autorisations à certains programmes pour utiliser certains appels système. En refusant l'accès à open, pipe, et autres, vous devriez être capable de faire exactement ce que vous décrivez. Un deuxième chemin possible consiste à utiliser la fonction LD_PRELOAD et à fournir votre propre canal ouvert, etc. les fonctions. Ceci n'est pas sécurisé à 100%, car le programme peut toujours accéder plus directement aux appels système (en supposant qu'il s'agit d'un programme potentiellement hostile)

+0

Comment limiter les appels système individuels avec SELinux? Il y a des permissions pour restreindre les classes de syscalls sur les classes d'objets, mais je ne vois aucune limitation sur 'pipe',' close', 'dup', etc. – ephemient

2

Cela ressemble beaucoup à what is described this LWN article qui bloque tous les appels système sauf lire, écrire et quitter .

+0

Oh, c'est vrai, j'avais oublié CONFIG_SECCOMP. Mais tous les noyaux de distro ne le permettent pas, et c'est assez limité: vous ne pouvez pas exécuter un autre programme sous seccomp. – ephemient

Questions connexes