L'applicazione è collegata staticamente?
In caso contrario, puoi sovrascrivere alcuni simboli, ad esempio, ridefiniamo socket
:
int socket(int domain, int type, int protocol)
{
write(1,"Error\n",6);
return -1;
}
Quindi crea una libreria condivisa:
gcc -fPIC -shared test.c -o libtest.so
Corriamo:
nc -l -p 6000
Va bene.
E ora:
$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket
Cosa succede quando esegui con la variabile LD_PRELOAD=./libtest.so
? Sovrascrive i simboli definiti in libtest.so rispetto a quelli definiti nella libreria C.
Sembra che systrace faccia esattamente ciò di cui hai bisogno. Dalla pagina di Wikipedia:
Un'applicazione può effettuare solo le chiamate di sistema specificate come consentite nella policy. Se l'applicazione tenta di eseguire una chiamata di sistema che non è esplicitamente consentita, viene generato un allarme.
Questa è una possibile applicazione del sandboxing (in particolare, l'esecuzione basata su regole). Un'implementazione popolare è SELinux.
Dovrai scrivere la policy che corrisponde a ciò che vuoi permettere al processo di fare.