Interdire l'E / S de file pour un process, à l'exception des FIFO

Comment lancer un process qui ne peut pas faire d' IO de file (ouvrir / fermer des files, créer / supprimer des files, lire / écrire des files, etc.), sauf pour lire et écrire des FIFO pré-créés?

( chroot ne fonctionnera pas parce que le process peut en sortir, mais perturber / modifier le kernel et ainsi de suite)

BTW: Je ne peux pas modifier les programmes en cours d'exécution

Si

  1. le programme peut être modifié pour faire un appel système de votre choix avant tout code non fiable (cela peut être fait via LD_PRELOAD ), et
  2. le programme n'a pas besoin de faire d'appels système au-delà de exit() , sigreturn() , read() et write()

alors vous pouvez utiliser seccomp (article de Wikipedia). Pour plus d'informations sur ces appels système, il existe seccomp-bpf, qui utilise Berkeley Packet Filter pour déterminer les appels système à autoriser. La bibliothèque libseccomp simplifie donc seccomp-bpf (par exemple) si vous vouliez autoriser l'appel système close() :

 seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0); 

Ou pour quelque chose de similaire à chroot , mais qui ne peut pas être brisé, vous pourriez essayer des conteneurs Linux , OpenVZ ou Linux VServer .

Votre meilleur pari est d'exécuter le problème en tant qu'user non privilégié. Donner les permissions correctes à la FIFO.

Cela dit, l'user non privilégié aura access à tous les files que tout autre user non privilégié aura.

Pour faire plus alors que vous auriez à sérieusement modifier les choses sur le système de files. mais:

chmod o-rwx / -R

Va certainement verrouiller les choses. Mais encore une fois, les autres users ne pourront rien lire non plus.

Je suppose que les questions les plus importantes à se poser sont: "Pourquoi ai-je besoin de cette ressortingction?" Peut-être y a-t-il une meilleure façon d'atteindre vos objectives?

Un process ne peut pas sortir d'un chroot si vous faites les choses correctement, à savoir, exécutez le process sous son propre ID user (c'est-à-dire qu'il ne doit pas y avoir de process en cours d'exécution en dehors du chroot).

Chroot le process à un directory que le process ne peut pas écrire et qui ne contient que des FIFO. Vous devrez soit mettre l'exécutable et les bibliothèques et les files de données dont il a besoin dans ce chroot, soit démarrer le process en tant que root, puis chroot, puis modifier l'ID user.

Si vous ne pouvez pas utiliser root, vous pouvez utiliser un espace de noms , mais vous avez besoin d'un kernel récent (≥3.8). Créez d'abord un espace de noms d'user , puis à l'intérieur de celui-ci, et changez en un ID user dans l'espace de noms avec l'absence requirejse de privilèges.

Autrement, cela peut être fait (avec la coopération de root) par le biais de frameworks de security tels que SELinux ou AppArmor: désactiver tous les syscalls liés au système de files sauf open , read , write , close et lseek et restreindre l' open au directory contenant les FIFO. Assurez-vous également de désactiver ptrace .