assumer un binaire Linux syscalls 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. P>
Je veux m'assurer que l'application ne peut pas exécuter syscall Comment puis-je réaliser cela dans un environnement Linux? P> foobar code> qui a deux modes de fonctionnement différents: p>
A code>,
B code> et
C code> sont utilisés. li>
A code>,
B code>,
C code> et
d code > sont utilisés. li>
ul>
A code>,
b code> et
c code> sont inoffensifs, alors que SysCall
d code> est potentiellement dangereux et pourrait causer une instabilité à la machine. p>
d code>. Lors de l'exécution de SYSCALL
D CODE> Le résultat doit être un noop ou une résiliation immédiate de l'application. P>
4 Réponses :
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 . P>
Vous devrez devoir écrire la politique qui correspond à ce que vous voulez permettre le processus de faire. P>
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.
L'application est-elle liée statiquement?
Si non, vous pouvez remplacer certains symboles, par exemple, redéfinissons la prise puis construire une bibliothèque partagée: p > exécutons: p> code>: p>
$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket
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 code> 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.
Il semble que SysStrace fait exactement ce dont vous avez besoin. De la page Wikipedia : p>
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. P> blockQuote>
C'est exactement ce que SECCOMP-BPF est pour. Voir un exemple Comment restreindre l'accès à SysCalls . P>
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.