L'application est-elle liée de manière statique ?
Sinon, vous pouvez remplacer certains symboles, par exemple, redéfinissons socket
:
int socket(int domain, int type, int protocol)
{
write(1,"Error\n",6);
return -1;
}
Créez ensuite une bibliothèque partagée :
gcc -fPIC -shared test.c -o libtest.so
Courons :
nc -l -p 6000
D'accord.
Et maintenant :
$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket
Que se passe-t-il lorsque vous exécutez avec la variable LD_PRELOAD=./libtest.so
? Il remplace les symboles définis dans libtest.so par rapport à ceux définis dans la bibliothèque C.
Il semble que systrace fasse exactement ce dont vous avez besoin. De la page Wikipédia :
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 est déclenchée.
Il s'agit d'une application possible du sandboxing (en particulier, l'exécution basée sur des règles). Une implémentation populaire est SELinux.
Vous devrez écrire la politique qui correspond à ce que vous voulez autoriser le processus à faire.