6
votes

Limiter SysCall Access pour une application Linux

assumer un binaire Linux foobar qui a deux modes de fonctionnement différents:

  • mode A: un mode bien élevé dans lequel SysCalls A , B et C sont utilisés.
  • Mode B: Un mode de choses-gars-mal dans lequel SysCalls A , B , C et d sont utilisés.

    syscalls A , b et c sont inoffensifs, alors que SysCall d est potentiellement dangereux et pourrait causer une instabilité à la machine.

    suppose d'autres que les deux modes exécutés par l'application sont aléatoires: l'application fonctionne en mode A avec probabilité de 95% et en mode B avec probabilité de 5%. L'application est livrée sans code source afin qu'elle ne puisse pas être modifiée, fonctionne uniquement comme.

    Je veux m'assurer que l'application ne peut pas exécuter syscall d . Lors de l'exécution de SYSCALL D Le résultat doit être un noop ou une résiliation immédiate de l'application.

    Comment puis-je réaliser cela dans un environnement Linux?


2 commentaires

Pourriez-vous peut-être clarifier le sens de la "probabilité" dans votre question au cas où il y a quelque chose à mal comprendre là-bas?


Pascal: Bien sûr! Post édité avec une clarification. Aux fins de ces questions, le "choix de mode" est aléatoire.


4 Réponses :


4
votes

Il s'agit d'une application possible de Sandboxing (spécifiquement, exécution basée sur des règles ). Une implémentation populaire est SELINUX .

Vous devrez devoir écrire la politique qui correspond à ce que vous voulez permettre le processus de faire.


2 commentaires

C'est certainement l'affaire d'utilisation pour SELINUX. D'autres technologies de sandboxing sont disponibles.


@stsquad j'ai incorporé votre commentaire. Vous étiez peut-être en partie en partie aux "revendications" de la version précédente ... je l'ai formellement formulée à cause d'avoir entendu certaines personnes Selinux n'est pas si utilisable dans la pratique, précisément à cause de la nécessité de politiques adéquates. Ne pas l'avoir essayé, je n'ai pas d'opinion d'une manière ou d'une autre, alors peut-être que la nouvelle version est meilleure de ce point de vue.



8
votes

L'application est-elle liée statiquement?

Si non, vous pouvez remplacer certains symboles, par exemple, redéfinissons la prise code>: p> xxx pré>

puis construire une bibliothèque partagée: p > xxx pré>

exécutons: p>

$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket


1 commentaires

Cela ne remplit pas les exigences de sécurité? Il est assez facile d'obtenir du code pour charger un numéro SYSCALL approprié dans eAx ou quelles que soient les conventions de la CPU, ce soit, puis transférez le contrôle à la fin de "A", "B", ou "C" Syscalls . La modification d'une table SYSCALL par processus et les modifications de chargeur (comme SELINUX) sont le seul moyen d'arrêter la corruption de l'espace utilisateur. Voir par exemple ROP chez Wikipedia . Au moins cette réponse suppose que plusieurs choses dans le système sont au-delà de la compromission.



7
votes

Il semble que SysStrace fait exactement ce dont vous avez besoin. De la page Wikipedia :

Une application est autorisée à effectuer uniquement les appels système spécifiés comme autorisés dans la stratégie. Si l'application tente d'exécuter un appel système qui n'est pas explicitement autorisé une alarme relevée.


0 commentaires

3
votes

C'est exactement ce que SECCOMP-BPF est pour. Voir un exemple Comment restreindre l'accès à SysCalls .


0 commentaires