Apakah aplikasi ditautkan secara statis?
Jika tidak, Anda dapat mengganti beberapa simbol, misalnya, mari kita definisikan ulang socket
:
int socket(int domain, int type, int protocol)
{
write(1,"Error\n",6);
return -1;
}
Kemudian buat perpustakaan bersama:
gcc -fPIC -shared test.c -o libtest.so
Ayo lari:
nc -l -p 6000
Oke.
Dan sekarang:
$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket
Apa yang terjadi ketika Anda menjalankan dengan variabel LD_PRELOAD=./libtest.so
? Simbol ini menggantikan simbol yang ditentukan di libtest.so daripada yang ditentukan di pustaka C.
Tampaknya systrace melakukan apa yang Anda butuhkan. Dari halaman Wikipedia:
Aplikasi hanya diizinkan untuk membuat panggilan sistem yang ditentukan sebagaimana diizinkan dalam kebijakan. Jika aplikasi mencoba mengeksekusi panggilan sistem yang tidak diizinkan secara eksplisit, alarm akan dibunyikan.
Ini adalah salah satu kemungkinan penerapan kotak pasir (khususnya, Eksekusi Berbasis Aturan). Salah satu implementasi yang populer adalah SELinux.
Anda harus menulis kebijakan yang sesuai dengan apa yang ingin Anda izinkan untuk dilakukan proses tersebut.