2012-11-12 12 views
9

Sto scrivendo un programma che genera processi figli. Per motivi di sicurezza, voglio limitare ciò che questi processi possono fare. Conosco misure di sicurezza esterne al programma come chroot o ulimit, ma voglio fare qualcosa di più. Voglio limitare le chiamate di sistema fatte dal processo figlio (ad esempio impedendo le chiamate verso open(), fork() e cose del genere). C'è un modo per farlo? In modo ottimale, le chiamate di sistema bloccate dovrebbero tornare con un errore, ma se ciò non è possibile, uccidere il processo è anche un bene.Prevenire i processi per eseguire alcune chiamate di sistema

Immagino che si possa fare wuth ptrace() ma dalla pagina man non capisco davvero come usarlo per questo scopo.

+3

Probabilmente vuoi SELinux http://en.wikipedia.org/wiki/Security-Enhanced_Linux Non sono sicuro al 100%, ma dovrebbe avere un'API programmabile. –

+4

[ 'prctl (PR_SET_SECCOMP, ...)'] (http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html) può essere quello che vuoi. È così vicino a "non consentire le syscalls" come puoi ottenere. – Damon

+1

Il problema con 'prctl (PR_SET_SECCOMP, ...)' è che si blocca anche il 'exec()' chiamata, quindi è inutilizzabile per me. – petersohn

risposta

5

Se si vuole farlo nel modo ptrace, avete alcune opzioni (e alcune sono davvero semplici). Prima di tutto, ti consiglio di seguire il tutorial explained here. Con esso puoi imparare come sapere quali chiamate di sistema vengono chiamate e anche le conoscenze di base dello ptrace (non preoccuparti, è un tutorial molto breve). Le opzioni (che io sappia) che hai sono i seguenti:

  • La più semplice sarebbe quella di uccidere il bambino, che è this exact code here.
  • In secondo luogo si può far fallire il figlio, semplicemente cambiando i registri con PTRACE_SETREGS, inserendo valori errati in essi, e si può anche cambiare il valore di ritorno della chiamata di sistema se si desidera (di nuovo, con PTRACE_SETREGS).
  • Infine, è possibile saltare la chiamata di sistema. Ma per questo dovresti conoscere l'indirizzo dopo la chiamata di sistema, fare in modo che il registro di intruction punti lì e impostarlo (di nuovo, con PTRACE_SETREGS).
+2

Nota che ci sono alcuni [grossi avvertimenti] (http://stackoverflow.com/a/4421762/134633) usando ptrace per sandboxing. – caf

6

suona come SECCOMP_FILTER, aggiunto nella versione del kernel 3.5, è quello che stai cercando. Il libseccomp library fornisce un'API facile da usare per questa funzionalità.

A proposito, chroot() e setrlimit() sono entrambe le chiamate di sistema che possono essere chiamati all'interno del programma - si sarebbe probabilmente desidera utilizzare uno o entrambi questi in aggiunta a seccomp filtraggio.

+0

Sembra buono, ma sto usando il kernel 2.6.32. – petersohn

Problemi correlati