Je aplikace propojena staticky?
Pokud ne, můžete některé symboly přepsat, například předefinujme socket
:
int socket(int domain, int type, int protocol)
{
write(1,"Error\n",6);
return -1;
}
Poté vytvořte sdílenou knihovnu:
gcc -fPIC -shared test.c -o libtest.so
Pojďme běžet:
nc -l -p 6000
Dobře.
A teď:
$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket
Co se stane, když spustíte s proměnnou LD_PRELOAD=./libtest.so
? Přepíše se symboly definovanými v libtest.so nad symboly definovanými v knihovně C.
Zdá se, že systrace dělá přesně to, co potřebujete. Ze stránky Wikipedie:
Aplikace může provádět pouze ta systémová volání, která jsou v zásadě povolena. Pokud se aplikace pokusí provést systémové volání, které není výslovně povoleno, spustí se alarm.
Toto je jedna z možných aplikací sandboxingu (konkrétně spouštění na základě pravidel). Jednou z populárních implementací je SELinux.
Budete muset napsat politiku, která odpovídá tomu, co chcete procesu povolit.