ecifique Linux (ni POSIX, ni SUS, ni BSD) Introduit dans le 2.6.23 (2005) Par Andrea Arcanlegi Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 3/23
via prctl() Quatre appels syst` emes autoris´ es read() write() sigreturn() exit() Tout ´ ecart m` ene au SIGKILL Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 4/23
Fail safe Surface d’attaque tr` es limit´ ee Tellement sˆ ur qu’inutile. . . . . .sauf s’il est aid´ e ! Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 6/23
dans SECCOMP Solution #1 Binaire compil´ e avec la GNU Libc ELF entry point : routine start call libc start main@plt main() Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 9/23
dans SECCOMP Solution #1 Binaire compil´ e avec la GNU Libc ELF entry point : routine start call libc start main@plt main() LD PRELOAD permet de surcharger des symboles Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 9/23
dans SECCOMP Solution #1 : Probl` emes Ne supporte pas les binaires statiques Ne supporte que les binaires compil´ es avec la GNU Libc Hypoth` ese d’usage : grid computing Nous ne ciblons pas l’ex´ ecution de programmes malveillants. Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 10/23
dans SECCOMP Solution #2 : LD AUDIT $ man rtld-audit The GNU dynamic linker (run-time linker) provides an auditing API that allows an application to be notified when various dynamic linking events occur. 1 Cr´ eation d’une biblioth` eque d’audit 2 /lib/ld-linux.so.2 --audit ./sandbox.so /bin/ls Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 11/23
dans SECCOMP Solution #2 : LD AUDIT $ man rtld-audit 1 Cr´ eation d’une biblioth` eque d’audit 2 /lib/ld-linux.so.2 --audit ./sandbox.so /bin/ls Fonctionnalit´ e inconnue Un seul client connu de l’interface Gestion d´ elicate du Thread Local Storage Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 11/23
´ Eviter les appels syst` eme interdits Sans ptrace() Sans surcharge de toutes les fonctions la Libc Sans recompilation Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 12/23
Comment fonctionnent les appels syst` emes ? Sur x86, les appels syst` emes ne sont plus fait ` a base de int 0x80 inlin´ es Il faut d´ esormais appeller une fonction disponible dans la VDSO qui utilisera la meilleur impl´ ementation call *gs :$0x10 (C’est ce qu’apporte le paquet libc6-686) Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 13/23
registres sont envoy´ es au helper Aucune intelligence, il ne fait que suivre les ordres : ´ Ecrire/Lire ` a une adresse m´ emoire ´ Emuler la valeur de retour du syscall Se terminer proprement (via exit()) Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 14/23
´ emul´ e dans l’autre processus Lourd avec la sensation de r´ e´ ecrire le noyau en Python :) Performance : Double copie des donn´ ees lors de read()/write() Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 15/23
Thread Thread SECCOMP M´ emoire partag´ ee (lecture seule) M´ emoire partag´ ee (lecture/´ ecriture) S´ egr´ egation kernel Processus non trust´ e Processus helper sockets UNIX Toujours deux processus Dans le processus non-trust´ e, deux threads : Un trust´ e Un non-trust´ e, sous SECCOMP Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 16/23
Probl´ ematique Les threads partagent tout ! ⇒ Toute action d’un thread impacte l’autre Le thread trust´ e n’a qu’une seule tˆ ache : ex´ ecuter les syscalls que le processus helper lui ordonne de faire. Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 17/23
e open close access getcwd getpgrp getpid gettimeofday exit lseek llseek readlink stat64 fstat64 mmap2 mmap brk ugetrlimit munmap time times Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 19/23
faire Toutes les v´ erifications de s´ ecurit´ e c l a s s S e c u r i t y : def open ( s e l f , filename , perms , mode) : path = os . path . r e a l p a t h ( filename ) # Bug #990669 i f not path . s t a r t s w i t h ( s e l f . chroot ) : return False . . . return True Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 20/23
Linux glibc r´ ecente (> 2005) compil´ ee pour 686 Ne supportera jamais ces syscalls : clone() : thread ou fork impossible execve() Nicolas Bareil seccomp-nurse : Environnement de cloisonnement 22/23