ptrace
sembra essere lo strumento più ovvio ma a parte questo…
util-linux[-ng] ha un comando unshare
, che utilizza il clone
del kernel /unshare
interfacce. Se esegui il nuovo processo attraverso unshare -n
(o clone(CLONE_NEWNET)
), tutti i socket di rete che crea si trovano in uno spazio dei nomi diverso. Ciò non risolve il problema delle risorse del kernel, ma esegue il sandboxing del processo.
Il kernel di Linux supporta anche seccomp, una modalità inserita con prctl(PR_SET_SECCOMP, 1)
che impedisce al processo (beh, thread, in realtà) di chiamare qualsiasi chiamata di sistema diversa da read
, write
, exit
e sigreturn
. È una sandbox piuttosto efficace ma difficile da usare con codice non modificato.
Puoi definire un dominio SELinux che non consente socket
/bind
/eccetera. chiamate ed eseguire una transizione dinamica in quel tipo. Questo (ovviamente) richiede un sistema con una policy SELinux attiva. (Forse cose simili sono possibili con AppArmor e TOMOYO, ma non ne ho molta familiarità.)
Dai un'occhiata a systrace, non limitato ai socket, ma a un generico generatore/applicatore di policy syscall. Citazione:
Il porting GNU/Linux è terminato e la patch del kernel è mantenuta attivamente da Marius Eriksen. Può essere eseguito senza modifiche al kernel utilizzando il backend ptrace.
Disclaimer - Non l'ho mai provato su Linux.