| felix | |Ramon| |
|---|---|
| krocz | ---------------- ATENTION ---------- comenzamos |
| felix | !jaime startlog |
| krocz | Bueno un gusto tenerlos por aqui nuevamente |
| krocz | para nosotros es muy satisfactorio hacer este tipo de charla |
| krocz | para ello en esta ocacion presentaremos a Andres L. Sclippa |
| krocz | colaborador Argentino, de la Universidad Tecnolsgica Nacional Facultad Regional Resistencia |
| krocz | el es analista de seguridad y pertenece a www.LinuxDevelopment.com.ar |
| krocz | el hace poco nos presento una conferencia sobre "WBEM en Linux" y para |
| krocz | esta ocacion ha preparado una charla relacionada con |
| krocz | "Unix Application Security Framework" |
| krocz | Tenemos la traduccion al ingles en el canal #redes y las preguntas y comentarios en el canal #qc |
| krocz | a si que le damos la bienvenida a Andres |
| krocz | adelante Andres |
| krocz | el canal es tuyo :) |
| feistel | ok gracias a todos por estar hoy aqui, y estoy muy a gusto colaborando con este noble proyecto |
| feistel | por favor conectensen a http://170.210.180.9/umeet |
| feistel | ahi encontraran |
| feistel | mirrors para las presentaciones |
| feistel | y un log para los que llegan tarde :) |
| feistel | las preguntas pueden hacer en #qc |
| feistel | yo las contesto aca |
| feistel | ok empecemos |
| feistel | de todos los ataques a los sistemas UNIX |
| feistel | a me olvidaba |
| feistel | voy a ir avisando cuando deben ir cambiando de filmina, ok |
| feistel | los del tipo DoS y buffer overflow son los mas populares y peligrosos |
| feistel | (diapositiva 2) |
| feistel | en esta charla me ocupare de como eliminar o mitigar el segundo tipo de ataque |
| feistel | en UNIX todo proceso corre con un identificador de usuario y de grupo (UID/GID) |
| feistel | esto limita el acceso de tal proceso a los recursos del SO |
| feistel | lamentablemente muchas aplicaciones requieren de privilegios root |
| feistel | en *NIX u otros privilegios |
| feistel | para funcionar correctamente (por ejemplo: cambiar la password, necesitan acceder a dispositivos |
| feistel | <krocz> feistel, te basaras en un SO en especial o es general? |
| feistel | en general |
| feistel | en bruto, a determinadas syscalls privilegiadas o a sistemas de archivos |
| feistel | como /etc) |
| feistel | entonces encontraremos que muchos procesos corren con privilegios de root |
| feistel | mientras estos procesos se comporten como fueron diseñados, ningun problema |
| feistel | me ocupare en general de UNIX :) |
| feistel | me piden que vaya mas lento por la traduccion |
| feistel | el problema aparece cuando un atacante logra controlar la ejecucion de tal |
| feistel | proceso y ejecutar codigo arbitrario con los privilegios del proceso |
| feistel | para limitar esto, las aplicaciones *NIX han utilizado por años |
| feistel | dos metodos, el SUID/SGID y el chroot jailing |
| feistel | la idea del primero es la siguiente |
| feistel | los procesos corren normalmente con un usuario no privilegiado pero |
| feistel | cuando requieren acceso privilegiado (como root por ej.) |
| feistel | ejecutan una syscall que cambia temporalmente el usuario del proceso |
| feistel | para ello el binario debe tener el bit S activado |
| feistel | <trulux> feistel, cuando dices en general chroot jailing deberías mencionar otro tipo de jaulas como las de freebsd, y no hablar de jaulas chroot en general en todos los Unices |
| feistel | si trulux tiene razon |
| feistel | en este caso me refieron al chroot jailing basico disponible en cualquier UNIX |
| feistel | para el caso de FreeBSD este es mucho mas funcional :-) |
| feistel | ------------------------ |
| feistel | # ls -aLF /usr/bin/passwd |
| feistel | -rwsr-xr-x 1 root root 44705 Jul 1 00:49 /usr/bin/passwd |
| feistel | ^ |
| feistel | ------------------------ |
| feistel | ahi ven un binario con el bit activado |
| feistel | finalizada la ejecucion privilegiada el proceso vuelve a correr con |
| feistel | los privilegios limitados del usuario original |
| feistel | el chroot jailing lo que hace es confinar al proceso en |
| feistel | un filesystem con lo cual si el proceso es hackeado, el atacante |
| feistel | no tiene acceso al resto de los filesystems |
| feistel | estas tecnicas ofrecen una seguridad muy limitada |
| feistel | el SUID/SGID y el chroot pueden cambiarse facilmente una vez que el |
| feistel | proceso ha sido comprometido |
| feistel | el stack-smashing attack o buffer overflow attack aparece cuando un |
| feistel | proceso |
| feistel | requiere que datos externos sean colocados en un bufer |
| feistel | (en realidad el buffer overflow es un tipo especial de stack-smashing, pero lo tomaremos |
| feistel | como sinonimos aqui para facilitar) |
| feistel | <trulux> feistel, el chroot puede comprometerse en tiempo de ejecución con varios tipos de "trucos", desde hacer un doble chroot hasta intentar matar procesos fuera de el |
| feistel | como dice trulux chroot es muy vulnerable |
| feistel | o variables |
| feistel | y la aplicacion vulnerable no controla correctamente |
| feistel | el tamaño de tales datos externos |
| feistel | esto hace que si tal dato tiene un tamaño mayor al del bufer que lo |
| feistel | almacenara, al momento de almacenarlo, partes contiguas de la memoria |
| feistel | al bufer son sobreescritas con el contenido sobrante de tal dato |
| feistel | el problema viene en la estructura que utiliza *NIX en la memoria de |
| feistel | cada proceso, entonces el area de memoria contigua a los bufers contiene |
| feistel | datos criticos del proceso que controlan el flujo de ejecucion del mismo |
| feistel | esto permite que atacantes puedan insertar codigo de maquina (shell codes) |
| feistel | en aplicaciones vulnerables al buffer overflow y realizar asi |
| feistel | operaciones no contempladas, con los mismos privilegios del proceso |
| feistel | (diapo 4) |
| feistel | en la figura superior vemos la estructura del area de memoria de todo |
| feistel | proceso |
| feistel | esta es la estructura tipica de la stack (area de la memoria del proceso |
| feistel | donde se almacena datos temporales) |
| feistel | todo funcion C usa la stack desde el stack pointer hacia arriba en la |
| feistel | figura (el stack pointer apunta al tope de la stack) |
| feistel | en el siguiente orden: bufers, variables locales, puntero al frame anterior |
| feistel | , la direccion de retorno (desde donde se llamo a esta funcion) y |
| feistel | finalmente los argumentos de la funcion |
| feistel | con lo cual si el codigo no controla el tamaño de los datos a escribir |
| feistel | en los buffers las areas siguientes de memoria (para arriba en la fig.) |
| feistel | pueden ser sobreescritas |
| feistel | la figura inferior muestra una tipica funcion C vulnerable a este ataque |
| feistel | la funcion strcpy() copia el contenido de la variable de entorno $HOME al |
| feistel | buffer de 128 bytes |
| feistel | como no hay control del tamaño de la variable $HOME |
| feistel | si esta posee mas de 128 bytes el resto del string sobreescribira las |
| feistel | areas contiguas de memoria |
| feistel | entonces un atacante en este caso podra introducir shell code en la |
| feistel | variable $HOME a partir del byte 129, y este shell code se ejecutara con los |
| feistel | privilegios del proceso |
| feistel | <krocz> una forma de evitar la ejecucion es dejando el stack, en estado "no execute" |
| feistel | si eso se conoce como W^X y lo veremos mas adelante |
| feistel | para eso el shell code sobreescribira la "return address" hacia el area |
| feistel | de memoria donde esta el codigo arbitrario inyectado, |
| feistel | y este sera ejecutado cuando la funcion vulnerable finalice y la ejecucion del proceso deba retornar al punto |
| feistel | desde donde fue llamada la funcion |
| feistel | segun que area del stack el atacante sobreescriba el stack-smashing puede |
| feistel | <trulux> feistel, no, W^X es de OpenBSD, hay más implementaciones: Stack Guard de Immunity, ExecShield y PaX por ejemplo |
| feistel | W^X es un concepto |
| feistel | no una implementacion |
| feistel | es una tecnica |
| feistel | clasificarse en: |
| feistel | * return address: se modifica la direccion de retorno |
| feistel | * variables locales o argumentos: se modifican tales variables |
| feistel | * previous frame pointer: se modifica el puntero al frame anterior |
| feistel | ahora bien |
| feistel | una solucion es auditar el codigo fuente de la aplicaciones |
| feistel | para detectar codigo vulnerable, es decir codigo que no controle el |
| feistel | tamaño de los strings |
| feistel | la serie de tecnicas y mecanismos presentados aqui formaran un framework |
| feistel | donde puedan correr sus aplicaciones *NIX con una seguridad proactiva |
| feistel | es decir, en caso de que ocurra un buffer overflow por una vulnerabilidad |
| feistel | no detectada |
| feistel | este ataque sera eliminado, confinado o a lo sumo limitado. |
| feistel | (diapo 6) |
| feistel | ok, la primera tecnica que conforma nuestro framework es una cuestion de diseño |
| feistel | es la tecnica de separacion de privilegios |
| feistel | la idea es separar el codigo del proceso en dos partes: |
| feistel | 1 - el proceso privilegiado: usara las syscall que requieran permisos privilegiados |
| feistel | 2 - el proceso no-privilegiado: accedera al resto de todas las syscall, las cuales no requieran de una cuenta |
| feistel | privilegiada |
| feistel | entonces cuando el proceso PRIVILEGIADO si inicia hace un fork de si |
| feistel | mismo |
| feistel | y su hijo pasa a ser el proceso NOPRIVILEGIADO |
| feistel | la idea es que la interaccion con el usuario o con procesos locales o remotos |
| feistel | lo haga el proceso hijo NOPRIVILEGIADO |
| feistel | con lo cual si este es comprometido |
| feistel | el atacante tendra limitado su accionar |
| feistel | para entender mejor la tecnica |
| feistel | a la derecha ven la arquitectura de una aplicacion famosa el OpenNTP |
| feistel | que utiliza esta tecnica |
| feistel | el proceso ntp engine es el proceso no privilegiado (que corre como _ntp) |
| feistel | el cual se comunica a traves de un socket UNIX-domain (no accesible |
| feistel | por TCP/IP) con su proceso padre el ntpd master (que corre como root) |
| feistel | el ntpd master solo usa dos syscall privilegiadas: IMSG_ADJTIME |
| feistel | y IMSG_HOST_DNS (setear la hora y llamar al resolver library) |
| feistel | ahora si un atacante inyecta por el UDP 123 shell code solo el proceso |
| feistel | ntp engine sera comprometido |
| feistel | ademas en este caso el proceso ntp engine corre en chroot en /var/empty |
| feistel | con lo cual el mismo queda confinado a ese directorio |
| feistel | (diaspo 7) |
| feistel | hasta ahora entonces nuestra aplicacion contiene: |
| feistel | * SUID/GUID bits |
| feistel | * chroot jailing |
| feistel | * privilege separation |
| feistel | veremos ahora un mecanismo para proteger la memoria |
| feistel | que algunos OS la implementan, de alguna forma u otra |
| feistel | el mecanismo W^X (lease W xor X) |
| feistel | la idea es que areas de memoria tenga un control de acceso |
| feistel | similar a los bits RWX del UNIX filesystem |
| feistel | entonces con W^X el OS define una politica por defecto en determinadas |
| feistel | areas de la memoria |
| feistel | de manera tal que tales areas sean de acceso de escritura o de ejecucion |
| feistel | pero nunca ambas |
| feistel | salvo que la aplicacion lo requiera explicitamente |
| feistel | el problema de implementar esto esta relacionado con la MMU de la |
| feistel | arquitectura subyacente |
| feistel | sparc, sparc64, alpha, amd64, ia64 y hppa tiene todas |
| feistel | MMU=memory management unit |
| feistel | un bit X en cada pagina de memoria |
| feistel | el OS solo debe activar o desactivar este bit y listo ya esta |
| feistel | pero i386 no tiene este bit |
| feistel | W^X puede emularse en esta arquitectura gracias al soporte |
| feistel | de memoria segmentada |
| feistel | la idea es que los procesos tengan dos segmentos un CODE (area baja) |
| feistel | y un DATA (area alta de la memoria) |
| feistel | al iniciar el proceso (todo el code esta en DATA) |
| feistel | el code es pasado al area baja CODE |
| feistel | mientras que los datos son pasados al area alta DATA |
| feistel | el OS entonces mantiene una politica W en DATA y X en CODE |
| feistel | es decir en i386 el W^X se emula por software |
| feistel | las tecnicas vistas hasta ahora no generan un overhead ni requieren tocar |
| feistel | el code |
| feistel | las dos siguientes generan overhead y una de ellas modifica el code |
| feistel | (diapositiva 8) |
| feistel | nuestra aplicacion ahora ya se ve mas segura: |
| feistel | * SUID/GUID bits |
| feistel | * chroot jailing |
| feistel | * privilege separation |
| feistel | * W^X (o algo parecido) |
| feistel | el problema en el ultimo caso es que dependemos exclusivamente del OS y de la |
| feistel | arquitectura subyacente |
| feistel | si bien la ejecucion de codigo esta limitada, la stack todavia puede ser alterado |
| feistel | el ProPolice o Stack Smashing Protector (SSP) es un desarrollo |
| feistel | de la division de investigacion en Tokio de IBM |
| feistel | este trabaja con gcc para transformar una |
| feistel | funcion C vulnerable en una funcion C no vulnerable |
| feistel | se obtiene un codigo cuyas funciones estan protegidas contra |
| feistel | corrupcion de la stack |
| feistel | para esto ProPolice realiza dos cosas |
| feistel | <trulux> feistel, hay varias implementaciones de SSP: http://wiki.debian-hardened.org/SSP/ProPolice_Implementations |
| feistel | la idea de la charla es trabajar con tecnologias independientes del OS |
| feistel | para varios flavors de Unix |
| feistel | <trulux> feistel, en realidad no se obtiene ningún codigo protegido, sigue sinedo vulenrable pero se llama a la función guard de SSP antes de ejecutar ningún tipo de operación extraña, en el inicio de la ejecución |
| feistel | SSP tambien ordena la memoria de la funcion, ademas del guard |
| feistel | el hecho de no puedas hacer un overflow lo hace invulnerable |
| feistel | 1. Reordena la stack |
| feistel | arriba ven la stack clasica |
| feistel | abajo la stack ordenada y modificada por ProPolice |
| feistel | las variables y los arreglos estan en orden opuesto |
| feistel | en la nueva disposicion de memoria |
| feistel | (A) no contiene arreglos ni variables punteros |
| feistel | (B) contiene arreglos y estructuras |
| feistel | (C) no contiene arreglos |
| feistel | en el unico lugar donde una destruccion de la stack puede comenzar es en (B) |
| feistel | lo anterior es la clave de ProPolice |
| feistel | 2. Y agrega codigo en el prologo y en el epilogo de la funcion |
| feistel | veamos como funciona esto |
| feistel | en el prologo de la funcion |
| feistel | (codigo que se ejecuta ni bien la funcion es llamada) |
| feistel | ProPolice genera un valor aleatorio, el "guard" |
| feistel | como veran el "guard" es lo primero que aparece en la stack |
| feistel | (recuerden que la stack crece para abajo) |
| feistel | es por eso que se lo genera en el prologo |
| feistel | una copia del "guard" es mantenida en un area protegida fuera del alcance de un overflow |
| feistel | ni bien la funcion finaliza, antes de retornar a la funcion que la llamo |
| feistel | se ejecuta el epilogo |
| feistel | el cual compara el "guard" original con el del stack |
| feistel | si estos son diferentes la ejecucion del proceso finaliza y se genera un log, asi todo shellcode inyectado no es ejecutado |
| feistel | por la ubicacion del return address |
| feistel | la unica forma de modificarlo es a traves de un overflow en los buffers |
| feistel | (B) |
| feistel | por la ubicaciones de las variables locales en (C) |
| feistel | estas estan protegidas por modificacion ya que la destruccion comienza en (B) |
| feistel | los argumentos (A) por otro lado estan protegidos por el "guard" |
| feistel | ProPolice tiene algunas excepciones que se deben tener en cuenta |
| feistel | que estan listadas en el sitio de ProPolice y es de |
| feistel | interes para programadores en C en UNIX que desean protegerse con ProPolice |
| feistel | (diapos 9) |
| feistel | <trulux> quizás quedaría más claro si cuentas algo sobre tipos de "canarios" |
| feistel | la conferencia abarca muchos temas y la idea es dar un puntapie para una investigacion mas profunda por |
| feistel | los interesados |
| feistel | no quieron entrar en la calificaciones de los canarios (otro nombre para el guard) |
| feistel | trulux, quiere colaborar con un ejemplo real |
| feistel | dice que tiene todo preparado, lo haremos al final de la charla |
| feistel | ademas de ProPolice existen otras implementaciones similares |
| feistel | pero todas ellas tienen limitaciones y debilidades |
| feistel | en la figura pueden ver una comparacion |
| feistel | -- aquellos interesados en el tema, pueden quedarse despues ;-) --- |
| feistel | un resumen de las alternativas |
| feistel | * libsafe: es una libreria que agrega un control sobre algunas |
| feistel | funciones de strings populares como strcpy() y gets() |
| feistel | funciona como un middleware que intercepta las llamadas a estas funciones |
| feistel | y realiza el control necesario |
| feistel | * StackGuard: utiliza el mismo concepto del "guard" que lo llama "canario" |
| feistel | genera un random y hace un XOR con el return address y eso es el "canario" |
| feistel | * StackShield: utiliza un metodo alternativo, mantiene una copia del return |
| feistel | address (durante el prologo, despues de los buffers) |
| feistel | el cual es verificada en el epilogo, no usa "guard" o "canarios" |
| feistel | tanto StackGuard y StackShield tiene famosas vulnerabilidades y ademas |
| feistel | generan mayor overhead que ProPolice |
| feistel | "Phrack Magazine - Volume 0xa Issue 0x38" |
| feistel | si bien ProPolice es bastante seguro y robusto |
| feistel | genera un overhead que hay que considerar a la hora |
| feistel | de decidir si proteger o no nuestro codigo con SSP |
| feistel | en las diapos 10 y 11 pueden ver algunos benchmark del equipo de desarrollo de ProPolice |
| feistel | (diapositiva 12) |
| feistel | nuestra aplicacion ahora ya se encuentra en un framework bastante confiable: |
| feistel | * SUID/GUID bits |
| feistel | * chroot jailing |
| feistel | * privilege separation |
| feistel | * W^X |
| feistel | * ProPolice |
| feistel | sin embargo... |
| feistel | supongamos que se detecta una vulnerabilidad en algunos de los |
| feistel | sistemas anteriores, por ejemplo en ProPolice |
| feistel | (como fue detectado antes en StackGuard y StackShield) |
| feistel | necesitamos de algo que incluso en esas circunstancias |
| feistel | nuestras aplicaciones UNIX no comprometan la seguridad del sistema |
| feistel | entero |
| feistel | el ultimo componente de nuestro framework es entonces: Systrace |
| feistel | Systrace es un mecanismo que corre en parte en userland y en |
| feistel | parte en el kernel |
| feistel | este mecanismo atrapa todas las syscalls que un proceso utiliza |
| feistel | y realiza un control de acceso con ellas como si de un firewall se tratase |
| feistel | es decir definimos politicas de control de acceso Systrace a |
| feistel | nivel de syscalls |
| feistel | por ejemplo, podemos limitar que un proceso se enlace (bind()) a determinados |
| feistel | puertos TCP y se deniegue el resto |
| feistel | o por ejemplo, impedir la escritura, limitando el uso de write() |
| feistel | o limitar el write() a especificados archivos o filesystems |
| feistel | imaginen ahora que un proceso es comprometido y un atacante escala |
| feistel | privilegios con el |
| feistel | como nosotros hemos limitado las syscalls que puede usar el proceso o en |
| feistel | el modo en que las usa, el ataque es confinada o limitado a lo que |
| feistel | la aplicacion fue desarrollada para hacer |
| feistel | como se ven en la figura las aplicaciones con Systrace corren en un |
| feistel | sandbox controlado, donde ellas solo pueden hacer lo que nosotros |
| feistel | les dejamos hacer |
| feistel | en el kernel el "System Call Gateway" captura todas las llamadas |
| feistel | a syscalls de la aplicacion sandboxeada, como si fuese un Proxy |
| feistel | esta se encarga de ejecutar las verdaderas syscalls y de devolver el |
| feistel | resultado a la aplicaciones |
| feistel | como esto es transparante, la aplicacion no se entera de la presencia |
| feistel | del syscall gateway |
| feistel | pero antes el syscall gateway debe determinar si las politicas permiten |
| feistel | la ejecucion de tal syscall |
| feistel | para eso el modulo de Systrace en el kernel se encarga de comunicarse |
| feistel | con el modulo del userland, el cual revisando las politicas determina |
| feistel | si la syscall debe permitirse o negarse |
| feistel | si la politica decia "permitir" entonces la syscall se ejecuta normalmente |
| feistel | de lo contrario, no, y la aplicacion recibe un codigo de error (<0) |
| feistel | Systrace tambien funciona como un IDS (Intrusion Detection System) |
| feistel | ya puede generar alarmas o notificaciones para el caso en las que syscall |
| feistel | se denieguen |
| feistel | por ejemplo una entrada en syslog ser veria algo asi: |
| feistel | ------------------------------------ |
| feistel | Dec 2 01:31:11 openbsdtest systrace: deny user: _identd, \ |
| feistel | prog: /usr/libexec/identd, pid: 27046(1)[12989], \ |
| feistel | policy: /usr/libexec/identd, filters: 24, syscall: native-fsread(5), \ |
| feistel | filename: /etc/spwd.db |
| feistel | Dec 2 01:31:11 openbsdtest identd[27046]: /etc/pwd.db: Operation not permitted |
| feistel | Dec 2 01:31:11 openbsdtest identd[27046]: \ |
| feistel | getpwuid() could not map uid (25) to name |
| feistel | -------------------------------------- |
| feistel | es importante recalcar que Systrace funciona si en el kernel hay soporte |
| feistel | para el trace de las aplicaciones, es decir poder seguir el rastro |
| feistel | de las syscalls que un proceso utiliza |
| feistel | <krocz> feistel, systrace en que status esta en linux?? |
| feistel | esta terminado el patch |
| feistel | <krocz> feistel eso de ACL a las syscall viene implementado en el parche de grsec |
| feistel | <trulux> krocz, en la mayoría de sistemas MAC suele venir, RBAC, RSBAC, SELinux, etc |
| feistel | si es correcto |
| feistel | pero mi idea es presentar un framework para UNIX, |
| feistel | ademas a mi me gusta mas Systrace :-) |
| feistel | despues cada uno elige como armar su framework ;-) |
| feistel | (diapos 13) |
| feistel | como se ve una politica Systrace? |
| feistel | ------------------------------ |
| feistel | Policy: /bin/ls, Emulation: native |
| feistel | native-munmap: permit |
| feistel | [...] |
| feistel | native-stat: permit |
| feistel | native-fsread: filename match "/usr/*" then permit |
| feistel | native-fsread: filename eq "/tmp" then permit |
| feistel | native-fsread: filename eq "/etc" then deny[enotdir] |
| feistel | native-fchdir: permit |
| feistel | native-fstat: permit |
| feistel | native-fcntl: permit |
| feistel | [...] |
| feistel | native-close: permit |
| feistel | native-write: permit |
| feistel | native-exit: permit |
| feistel | ---------------------------------- |
| feistel | luego como en toda ACL, hay una expresion a evaluar y una accion a tomar |
| feistel | en este caso permit o deny |
| feistel | vean que este caso /bin/ls solo tiene acceso de lectura al filesystem |
| feistel | (fsread) /usr/ y al directorio /tmp |
| feistel | Systrace trae algunas herramientas utiles |
| feistel | primero un generador de politicas |
| feistel | que monitorea la aplicaciones a sandboxear y genera una politica |
| feistel | con todas las syscalls que usan, con accion permit |
| feistel | durante el monitoreo |
| feistel | usas la aplicaciones como en la produccion |
| feistel | todas las syscall llamadas son registradas |
| feistel | y asi se genera las politicas |
| feistel | con todas "permit" en tu home |
| feistel | una vez que tienes la politica la aplicas con algo como |
| feistel | # systrace -a /usr/sbin/inetd |
| feistel | y listo! /usr/sbin/inetd ya esta en su sandbox!! |
| feistel | una herramienta grafica (ver la figura) |
| feistel | te puede asistir en la confeccion de las politicas tambien |
| feistel | otra caracteristica que me gusta de Systrace es el soporte |
| feistel | para escalada de privilegios, lo cual elimina la necesidad de usar |
| feistel | los peligrosos SUID/GUID |
| feistel | estas politicas se ven algo asi: |
| feistel | ------------------------------------------- |
| feistel | native-socket: sockdom eq "AF_INET" and socktype eq "SOCK_RAW" then permit as root |
| feistel | native-bind: sockaddr eq "inet-[0.0.0.0]:22" then permit as root |
| feistel | native-fsread: filename eq "/dev/kmem" then permit as :kmem |
| feistel | ------------------------------------------- |
| Session Time: Thu Dec 16 00:00:00 2004 | |
| feistel | (diapos 15) |
| feistel | finalmente que hay del costo de overhead de Systrace |
| feistel | pues depende de la aplicacion, ahi pueden ver algunos benchmarks |
| feistel | ahora si tenemos un buen framework! |
| feistel | * (sacamos los peligrosos SUID/GUID gracias a Systrace) |
| feistel | * chroot jailing: confinamos la aplicacion a un filesystem |
| feistel | * privilege separation: ocultamos el modulo con acceso privilegiado de los clientes |
| feistel | * W^X: establecemos politicas a las areas de memoria vulnerables |
| feistel | * ProPolice: protegemos nuestra aplicacion contra un stack-smashing attack |
| feistel | * Systrace: confinamos a la aplicacion en un sandbox controlado |
| feistel | --fin--- |
| feistel | bueno este es mi framework, espero que les guste y que lo prueben... |
| krocz | CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP |
| techi | clap clap clap clap clapclap clap clap clap clap |
| krocz | feistel increible |
| JulHer | plas plas plas plas |
| JulHer | plas plas plas plas |
| overflow_ | Clap |
| JulHer | plas plas plas plas |
| overflow_ | Clap |
| overflow_ | Clap |
| JulHer | plas plas plas plas |
| overflow_ | Clap |
| funky | clap clap clap clap clap clap |
| PedroJ | clap,clap,clap,clap,clap |
| funky | clap clap clap clap clap clap |
| overflow_ | FELICITACIONES! |
| krocz | CLAP CLAP CLAP CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP CLAP CLAP CLAP |
| felix | bravo! |
| feistel | bueno gracias, es un gusto colaborar con estos proyectos |
| PedroJ | clap,clap,clap,clap,clap,clap |
| trulux | ;D |
| felix | !unlog |
| krocz | feistel conferencia muy buena, de alta calidad :) |
| trulux | bueno, pues voy a intentar enseñar más o menos el concepto de seguridad proactiva |
| felix | !date |
| jaime | felix: Wed Dec 15 22:55:39 2004 |
| felix | !startlog |
| jaime | felix: Estoy logueando el canal #linux en [http://felix.zapto.org/jaime/linux.html] |
| felix | fucking jaime! :( |
| feistel | krocz: gracias, lo menos que podia hacer para la UMEET |
| trulux | y demostrando como funciona ProPolice , en la práctica real |
| trulux | krocz, ahi va |
| trulux | bien, tenemos una aplicación que gestiona los datos de una empresa, en concreto la base de datos de empleados |
| trulux | es simple, usa una base de datos en plano, y añade salarios, edades, nombres y apellidos y notas |
| trulux | tiene autenticación |
| trulux | para asegurar que nadie puede modificar los datos |
| trulux | y el bit setuid para poder leer y escribir la .employee2.dbs |
| trulux | veamos como funciona: |
| trulux | lorenzo@estila:~/LIBSSP/tests/employee-0.1$ ./employee2 |
| trulux | - No password provided for authentication. |
| trulux | nos pide contraseña, bien |
| trulux | si fuesemos el "jefe", simplemente haríamos lo siguiente: |
| trulux | lorenzo@estila:~/LIBSSP/tests/employee-0.1$ ./employee2 l33t_b0ss |
| trulux | (!) Logged in. |
| trulux | ===========ACME Inc. Employees============= |
| trulux | A: Add an employee to the database |
| trulux | D: Display employee information |
| trulux | L: List employees |
| trulux | M: Load Database |
| trulux | R: Raise the salary of an employee |
| trulux | S: Save Database |
| trulux | X: Exit |
| trulux | Your choice: |
| trulux | bien, es simple |
| trulux | uno de los empleados está enfadado, y mucho |
| trulux | es el típico pisateclas que anda de un lado para otro solucionando problemas al resto de personal |
| trulux | alguien le ha filtrado que el programa tiene un fallo |
| trulux | sabe que es un desbordamiento de buffer, no comoce los detalles pero lo único que puede afectar al programa es el argumento que se pasa como contraseña |
| trulux | este buen hombre empieza a investigar: |
| trulux | haciendo un strings ve que hay un hash extraño: 6a3649f2caa1602c52252f336c43a6cc , parece md5, y lo es |
| trulux | le da igual, no busca eso |
| trulux | se da cuenta de que tiene el bit setuid: |
| trulux | -rwsr-sr-x 1 root root 24515 2004-12-14 22:53 employee2 |
| trulux | y sabiendo que el problema reside en el control de la longitud y copiado en memoria de los parámetros dados por el usuario... |
| trulux | se pone a investigar y se da cuenta de que el buffer está limitado a 512 bytes |
| trulux | sin mayores dificultades, busca una forma fácil de explotar ese fallo |
| trulux | después de una ardua lectura del art?iulo de Aleph1, Smashing the stack for fun and profit, descubre una forma sencilla: |
| trulux | un programa al que le da como parámetros el tamaño del buffer a desbordar y el offset/dirección dónde preparar los datos a ejecutar |
| trulux | en este caso un "shell code" |
| trulux | que arrancará una shell pseudo-interactiva con privilegios de root |
| trulux | arranca una sesión de depuración |
| trulux | gdb employee2 |
| trulux | disassemble main |
| trulux | ... |
| trulux | revisa el código y encuentra el punto donde se llama a strcpy |
| trulux | que copia argven el buffer vulnerable |
| trulux | (...) |
| trulux | 0x00000a99 <main+21>: and $0xfffffff0,%esp |
| trulux | (...) |
| trulux | 0x00000aa3 <main+31>: lea 0xfffff3b8(%ebx),%eax |
| trulux | 0x00000aa9 <main+37>: mov %eax,0xfffffd50(%ebp) |
| trulux | 0x00000aaf <main+43>: cmpl $0x1,0x8(%ebp) |
| trulux | 0x00000ab3 <main+47>: jle 0xbc1 <main+317> |
| trulux | ahi lo tenemos, 317 |
| trulux | previamente ha habilitado el correspondiente espacio de memoria |
| trulux | y ahi copia nuestro registro |
| trulux | el chico ya sabe lo que debe hacer: |
| trulux | :~/project1/$ ./breakfast 612 317 |
| trulux | + Using address: 0xbffff09b |
| trulux | + Entering a subshell... |
| trulux | deadbeef@acme:~/project1/$ employee2 $EGG |
| trulux | - Wrong password! |
| trulux | sh-2.05b# id && whoami |
| trulux | uid=1000(deadbeef) gid=1000(deadbeef) euid=0(root) groups=1000(deadbeef) |
| trulux | root |
| trulux | como veis, ha obtenido privilegios de root, asunto concluido, sin necesidad de excesivos conocimientos consigue poner en serio compromiso datos relevantes de su empresa |
| trulux | y ahora veamos que ocurre si employee2 fue compilado con un gcc usando la extensión SSP/ProPolice |
| trulux | repite basicamente el mismo proceso |
| trulux | pero el encargado de administrar y desarrollar employee2 ha hecho lo siguiente: |
| trulux | pr@acme:~/em/$ gcc employee2.c -fPIE -fstack-protector -lssp -o employee2 -lm md5.c |
| trulux | pr@acme:~/em/$ sudo mv employee2 /usr/bin/ && sudo chown root.root /usr/bin/empl* |
| trulux | pr@acme:~/em/$ sudo chmod u+s+x+r-w /usr/bin/employee2 |
| trulux | ha usado una biblioteca, la libssp (implementación de SSP como biblioteca independiente de la Glibc o la libgcc) |
| trulux | que contiene las rutinas de protección del SSP |
| trulux | y los demás pasos son idénticos a los que realizó cuando no usó el SSP |
| trulux | deadbeef (nuestro empleado "cabreado") lo reintenta y... |
| trulux | deadbeef@acme:~$ ./employee2 $EGG |
| trulux | - Wrong password! |
| trulux | employee2: stack smashing attack in function main() |
| trulux | ---- |
| trulux | main=0x80002828 __guard_setup=0x4001daf0 __guard=0x5fcc95a9 |
| trulux | ppid=15801 pid=15819 uid=1000 euid=1000 gid=1000 egid=1000 |
| trulux | ---- |
| trulux | Aborted |
| trulux | el programa lanza un SIGABRT y finaliza sin compromiso alguno |
| trulux | por supuesto el evento ha sido registrado |
| trulux | y deadbeef no tendrá que enfadarse nunca más con su empresa porque no volverá a trabajr con ellos |
| trulux | se acabó |
| overflow_ | CLAP CLAP CLAP CLAP |
| overflow_ | CLAP CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP CLAP |
| krocz | CLAP CLAP CLAP CLAP |
| p4ch0 | CLAP CLAP CLAP CLAP |
| p4ch0 | CLAP CLAP CLAP CLAP |
| trulux | ahora veamos que diferencias hay en el employee2 y las comentaremos entre todos para ver como trabaja de verdad el SSP |
| trulux | ;D |
| xtinAWAY | CLAP CLAP CLAP CLAP |
| xtinAWAY | CLAP CLAP CLAP CLAP |
| trulux | bueno, que quede claro que deadbeef es una persona fictia *srugh* |
| trulux | he colgado unas diapositivas aún no acabadas que podeís ver en http://www.debian-hardened.org/papers/hardened-debian-2005-en.pdf |
| trulux | la explicación es más larga y lamento no haber dado de sí mucho más pero aquí es tarde (24:24) y suelo madrugar ;P |
| krocz | bueno trulux ofrecera una charla el dia 19 de diciembre |
| krocz | a las 20 GMT |
| krocz | explicando en extenso :) |
| krocz | esto solo fue un avance |
| trulux | tengo preparadas un par de sorpresas, alguna que otra herramienta no publicada que será de interés |
| damage | :O! |
| krocz | bueno te esperamos el dia 19 |
The Organizing Comittee