Vorrei implementare una sandbox tramite ptrace()
un processo che inizio e tutti i suoi figli creerebbero (compresi i nipoti ecc.). Il processo genitore ptrace()
, ovvero il supervisore. sarebbe un semplice programma C o Python e concettualmente limiterebbe l'accesso al file system (in base al nome del percorso e alla direzione di accesso (lettura o scrittura) e al socket (ad esempio non consentendo la creazione di socket)Come può Linux ptrace essere pericoloso o contenere una condizione di competizione?
Cosa dovrei prestare attenzione in modo che il processo ptrace()
d ei suoi figli (in modo ricorsivo) non siano in grado di bypassare la sandbox? C'è qualcosa di speciale che il supervisore dovrebbe fare al tempo fork()
per evitare condizioni di gara? È possibile leggere gli argomenti del nome file di es. rename()
? dal processo figlio, senza una condizione di competizione
Ecco quello che ho già programmato di fare:
PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE
da evitare (alcuni) coditions gara quandofork()
ing- respingere tutte le chiamate di sistema di default, e comporre una whitelist di sistema ha permesso chiama
- assicurarsi che le
*at()
varianti chiamate di sistema (come ad esempioopenat
) sono correttamente protected
A che altro dovrei prestare attenzione?
Quindi in pratica si sta tentando di replicare il backend basato su ptrace di Systrace (http://www.systrace.org/)? – thkala
Sì, il mio supervisore avrebbe funzionato in modo simile a systrace. Sfortunatamente, systrace sembra non essere mantenuto, non si compila in modo pulito, e sembra anche essere bacato (impiccato indefinitamente quando ho usato GCC sandbox con GNU come). – pts