¿La aplicación está vinculada estáticamente?
Si no, puede anular algunos símbolos, por ejemplo, redefinamos socket
:
int socket(int domain, int type, int protocol)
{
write(1,"Error\n",6);
return -1;
}
Luego crea una biblioteca compartida:
gcc -fPIC -shared test.c -o libtest.so
Vamos a ejecutar:
nc -l -p 6000
Está bien.
Y ahora:
$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket
Qué sucede cuando ejecutas con la variable LD_PRELOAD=./libtest.so
? Anula los símbolos definidos en libtest.so sobre los definidos en la biblioteca C.
Parece que systrace hace exactamente lo que necesitas. De la página de Wikipedia:
Una aplicación puede realizar solo aquellas llamadas al sistema especificadas como permitidas en la política. Si la aplicación intenta ejecutar una llamada al sistema que no está explícitamente permitida, se genera una alarma.
Esta es una posible aplicación de sandboxing (específicamente, ejecución basada en reglas). Una implementación popular es SELinux.
Deberá escribir la política que corresponda a lo que desea permitir que haga el proceso.