Security for FreeBSD and kernel debugging

1,399 views

Published on

Disertación qué di en el mes de Mayo de 2009, en el BSDDay organizado por OpenBSDeros, en Ciudad Universitaria (UBA) de Buenos Aires. A esta misma disertación la di en las I Jornadas del Sur, en la ciudad de Bahia Blanca - Universidad del Sur.

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,399
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Security for FreeBSD and kernel debugging

  1. 1. Security for FreeBSD and Kernel Debugging Jornadas del Sur – Bahia Blanca , Argentina
  2. 2. $: WHOAMI /* * * Name  : Facundo M. de la Cruz → _tty0 @ Freenode * E­Mail: fmdlc <at> code4life.com.ar * Blog  : http://www.codigounix.com.ar/ * * 0x41) Consultor en IT && Seg. Informática  * 0x42) Coordinador de SanLuiX * */  
  3. 3. Disassemble main
  4. 4. Seguridad Conjunto de medidas adoptadas para proteger y  asegurar el conjunto de recursos y sistemas  informáticos y de información de una  organización. →   Información Es el objeto de mayor valor para una organización, el  objetivo es el resguardo de la información. →   Equipos que la soportan. Software, hardware y organización. →    Usuarios Individuos que utilizan la estructura tecnológica y de   comunicaciones que manejan la información.
  5. 5. Seguridad FreeBSD proporciona un variado arsenal de  FreeBSD utilidades y mecanismos para asegurar la  integridad y la seguridad de su sistema y  red. Para así lograr:  →  Integridad →  Confidencialidad →  Disponibilidad →  No repudio (irrefutabilidad) 
  6. 6. ¿De que nos protegemos? Los problemas de seguridad pueden dividirse en    diferentes categorías: →  Ataques de denegación de servicio (DoS/DDoS) →  Comprometer cuentas de usuarios →  Comprometer root a través de servidores accesibles →  Comprometer root desde cuentas de usuario →  Creación de puertas traseras (“Backdoors”) →  Obtener información sensible
  7. 7. Etapas de un ataque Descubrimiento Exploración Intrusión
  8. 8. Medidas de seguridad Se implementan en un modelo  multicapa   y se pueden  categorizar en:  → Asegurar root y cuentas administrativas → Asegurar los servers que ejecuten como root binarios suid/sgid → Asegurar cuentas de usuario → Asegurar el archivo de contraseñas → Asegurar el kernel, los dispositivos y filesystem → Detección rápida de cambios hechos al sistema → Paranoia
  9. 9. Usuarios
  10. 10. Alguién dijo problemas? →  Errores de empleados  50% →  Empleados deshonestos  15% →  Empleados descuidados  15% →  Intrusos ajenos a la empresa  10% →  Integridad física en las instalaciones 10% Se puede notar que el 80% de los problemas  relacionados a la seguridad informática son producido  por los empleados de dicha organización.   Y esto se podría tipificar en tres grandes grupos: →  Problemas por ignorancia →  Problemas por haraganería  →  Problemas por malicia
  11. 11. Tipos de cuentas Como en todos los Unix­Like en FreeBSD existen tres tipos de  usuarios: → Daemons (httpd, nobody, etc) → Superusuario (root) → Usuarios regulares (beastie, puff, tux) Es importante que los demonios corran bajo usuarios no  privilegiados,  y que estos no tengan la posibilidad de loguearse en una shell. Nobody es el usuario de sistema sin privilegios. Nobody Mientras mas servicios usen nobody, mas archivos y procesos  tendrá y por consecuencia mas privilegios tendra. 
  12. 12. Capacidades Para lograr una administración segura, es importante que  las cuentas de usuarios tengan ciertos límites y  capacidades, para ello podemos utilizar el archivo: /etc/login.conf → A cada usuario se le asigna una clase de login  → Cada clase tiene capacidades asociadas → nombre=valor
  13. 13. Limites Existen dos tipos de límites: → Blando  Blando → Puede ser ajustado por el usuario o una app. → Duro → Idém, pero el usuario puede unicamente    disminuirlo. Algunos límites comúnes: → Coredumpsize → Tamaño del core → CPUTime → Tiempo maxímo de CPU → Filesize → Tamaño máximo de un archivo → Maxproc  Maxproc → Número maximo de procesos por usuario → StackSize → Tamaño máximo del stack → SBSize → Tamaño máximo de memoria de red fue creado    para evitar DoS/DDoS ya que estos creaban   muchos sockets
  14. 14. Asegurar root En ciertas ocasiones puede resultar adecuado no permitir  el login de root desde cierta terminales que no sean  seguras. ttyv1 "/usr/libexec/getty Pc"    cons25l2 on  secure ttyv2 "/usr/libexec/getty Pc"    cons25l2 on  secure ttyv3 "/usr/libexec/getty Pc"    cons25l2 on  secure ttyv4 "/usr/libexec/getty Pc"    cons25l2 on  secure El grupo wheel: Contiene los usuarios aturizados a ejecutar su.  su Esta no es siempre la opción más segura. ksu. ksu Y en /etc/ssh/sshd_config: PermitRootLogin No → Evitar binarios con SUID mas de lo necesario. → Correr solo los servicios necesarios
  15. 15. Autenticación Tipos de autenticación posibles: En algo conocido: Contraseñas (passwords) En algo conocido: Passprhase (PGP) En algo poseído: Tarjeta inteligente En algo poseído: Dispositivo USB Características Físicas: Retina, huellas dactilares, etc.c.
  16. 16. Cifrado de contraseñas → Para los usuarios de FreeBSD en U.S.A. Se usa 3DES → Para los usuarios de FreeBSD en el resto del mundo SHA­1 Esto es debido a que la ley norteamericana prohibe la  importación de algoritmos criptografícos. El formato de contraseñas a utilizar se encuentra  en  /etc/login.conf  mediante  passwd_format .
  17. 17. Contraseñas de un solo uso → OPIE (One­time Passwords In Everything) → Por defecto hash Md5 → Contraseña usada únicamente para generar llaves → Conceptos de Semilla o Llave → 2 Letras y 5 Digitos → Cuenta de iterancion → Entero de 1 a 100 → Autentificación mediante PAM → Configuración en /etc/opieaccess  Se genera concatenando la semilla y la contraseña  secreta, aplica el hash MD5 tantas veces como  especifique la cuenta de iteración y convierte el  resultado en seis palabras cortas en inglés. Estas  seis palabras en inglés son su contraseña de un solo  uso.
  18. 18. ACL ' s En FreeBSD es posible incorporar ACL's para  manejar el acceso a los archivos   → Options UFS_ACL   Esta opción debe estar compilada en el kernel.   Viene incluida en GENERIC → Flag en el montaje  Flag en el montaje   Se administran mediante un flag (acls) en el montaje /etc/fstab. → No puede cambiarse con un remontaje   Si con umount y mount  →  Se puede usar tunefs para hacerlo de forma automática    tunefs es una herramienta diseñada para cambiar dinámicamente    Paramétros del filesystem →  Se identifican por un signo + en sus permisos  drwx­­­­­­  2 robert  robert  512 Dec 27 11:54 private drwxrwx­­­+ 2 robert  robert  512 Dec 23 10:57 directorio1 drwxrwx­­­+ 2 robert  robert  512 Dec 22 10:20 directorio2 drwxrwx­­­+ 2 robert  robert  512 Dec 27 11:57 directorio3 drwxr­xr­x  2 robert  robert  512 Nov 10 11:54 public_html   
  19. 19. ACL ' s Para comprobar las ACL's de un archivo podemos  utilizar: % getfacl archivo.txt     #file:test     #owner:1001     #group:1001     user::rw­     group::r­­     other::r­­ Para eliminar las ACL's de un archivo utilizamos: % setfacl ­k  Para configurar ACL's a un archivo: % setfacl ­m u:trhodes:rwx,group:web:r­­,o::­­­ test
  20. 20. Contabilidad de procesos Es una forma adecuada de auditar el sistema y a sus  usuarios. % touch /var/account/acct % accton /var/account/acct % echo 'accounting_enable="YES"' >> /etc/rc.conf Todos los logs de contabilidad están en un formato ilegible  para humanos, pero accesibles para  sa
  21. 21. Denegaciones de Servicio → Limitar forks del servidor:   provocar que el servidor consuma procesos, descriptores de fichero    y memoria hasta tirar la máquina. → Limitación de ataques springboard    (ICMP Reply, broadcast)   El kernel de FreeBSD tiene una opción de compilación llamada     ICMP_BANDLIM, que limita la efectividad de este tipo de ataques.  ICMP_BANDLIM → Caché rutas del kernel   Los ataques con paquetes falsificados pueden utilizarse también    para sobrecargar la caché de rutas del kernel.  → sysctl net.inet.ip.rtexpire  → El kernel puede reducirla  → sysctl net.inet.ip.rtminexpire  → El kernel no puede reducirla  → sysctl net.inet.ip.rtmaxcache → El kernel no puede reducirla    Esto puede provocar:  → Que el kernel no reaccione con suficiente rapides  → Que el kernel no sobreviva a un ataque sostenido
  22. 22. FreeBSD Security Officer Como muchos sistemas operativos con calidad de  producción  FreeBSD publica  Security Advisories, que  FreeBSD Security Advisories se suelen recibir por E­Mail. Los advisories se envían a las siguientes listas de  distribución de FreeBSD: >> FreeBSD­security­notifications@FreeBSD.org → Seg. en FreeBSD >> FreeBSD­security@FreeBSD.org → Seg. en general  >> FreeBSD­announce@FreeBSD.org → Notificaciones seguridad (moderada) Se firman siempre usando la clave PGP del  FreeBSD Security  Officer y se archivan, junto con los patches asociados, en el  Officer repositorio FTP CERT.  ftp://ftp.freebsd.org/pub/FreeBSD/CERT/index.html
  23. 23. Security Advisory ============================================================================= FreeBSD-SA-XX:XX.UTIL Security Advisory The FreeBSD Project Topic: denial of service → El problema Category: core → Parte afectada: Core / Contrib / Ports Module: sys → Ubicación del componente Announced: 2009-01-23 → Fecha de anuncio Credits: Person@EMAIL-ADDRESS → Créditos de quien descubrio Affects: All releases of FreeBSD → Versiones FreeBSD afectadas FreeBSD 4-STABLE prior to the correction date Corrected: 2009-02-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE) 2009-02-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6) 2009-02-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39) FreeBSD only: NO → Afecta solo a FreeBSD? For general information regarding FreeBSD Security Advisories, including descriptions of the fields above, security branches, and the following sections, please visit http://www.FreeBSD.org/security/. I. Background → Sobre app. Afectada (por que existe, qué es) II. Problem Description → Descripcion del problema III. Impact → Tipo de impacto IV. Workaround → Solución temporal V. Solution → Solución para parchear VI. Correction details → Despliega la rama del CVS VII. References → Fuentes adicionales
  24. 24. Portaudit Una forma de mitigar las vulnerabilidades de las  aplicaciones y advertir sobre los problemas de  seguridad a medida que se detectan. # cd /usr/ports/security/portaudit && make install clean # portaudit ­F → Actualiza la database /var/db/portaudit # portaudit ­a → Comprobamos... Affected package: cups­base­1.1.22.0_1 Type of problem: cups­base ­­ HPGL buffer overflow vulnerability. Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2­6809­11d9­a9e7­ 0001020eed82.html> 1 problem(s) in your installed packages found. You are advised to update or deinstall the  affected package(s) immediately. WTF? A small problem...  Portaudit + Portupgrade 
  25. 25. CHROOT FreeBSD Dispone de CHROOT desde hace muuuucho tiempo.  Este permite restringir el directorio raiz de un  conjunto de procesos, creando un entorno seguro y  separado del resto del sistema. Los procesos creados dentro de un entorno chroot no pueden  acceder a ficheros o recursos ubicados fuera del mismo. Por  esta razón, si un atacante logra comprometer un servicio que  se ejecuta en un entorno chroot no debería automáticamente  poder acceder al resto del sistema.  Chroot Proceso
  26. 26. JAILS Las jaulas extienden a chroot virtualizando no  solamente el acceso al sistema de ficheros, sino al  conjunto de usuarios, al subsistema de red del kernel  de FreeBSD y unas cuantas cosas más. LAS JAULAS POSEEN: → “Subarbol” de directorios → Un hostname → Una dirección IP (generalmente un alias de NIC) → La ruta del ejecutable dentro del JAIL → Puede tener sus propios usuarios (inclusive su root)
  27. 27. Jails (creando una) # setenv D /aquí/está/la/jaula # mkdir ­p $D  # cd /usr/src # make world DESTDIR=$D (1) # cd etc/  # make distribution DESTDIR=$D (2) # mount_devfs devfs $D/dev  (1) → Creamos el entorno para la jaula (bin, lib) (2) → Instala todo los ficheros de config necesairos
  28. 28. Iniciando un JAIL jail_enable="YES" #Lista de nombres de jaulas separados por espacios jail_list="www"  jail_www_rootdir="/usr/jail/www"     # directorio raiz de la jaula jail_www_hostname="www.example.org"  # nombre de máquina de la jaula jail_www_ip="192.168.0.10"           # dirección IP de la jaula jail_www_devfs_enable="YES"          # montar devfs en la jaula jail_www_devfs_ruleset="www_ruleset" # reglas a aplicar a devfs Para Iniciar: # /etc/rc.d/jail start www Para Detener: # /etc/rc.d/jail stop www   jls / jexec
  29. 29. Kernel debugging
  30. 30. Debugging Bajo ciertas circunstancias puede suceder que nuestro  querido kernel entre en Panic!! o se produce un crash.  OMFG!!  WTF????   → Necesitamos suficiente SWAP → No se soportan dumps que no sean a SWAP → Configurar DUMPDEV en rc.conf utilizado Device de /etc/fstab → Kernel configurado con ­g. Para depura vithe! → dumpon /dev/ad4s1b → Mi SWAP
  31. 31. GDB GDB es el  GNU Debugger , es un depurador escrito por la  FSF, como parte del proyecto GNU. Tiene la posibiliad  de depurar codigo objeto en  C,   C++  y otros. → Posibilidad de establecer breakpoints o puntos de ruptura → Detener ejecución en rupturas por condiciones (watchpoints) → Detener ejecución al recibir señal externa (catchpoints) → Puede obtener información de los coredumps
  32. 32. KGDB El término KGDB se refiere a GDB corriendo en: KERNEL DEBUGGING MODE % gdb ­k  % kgdb ← Enlazandolo Una vez que el kernel fue compilado hacemos una copia del  mismo, y luego hacemos strip ­g para que la tabla de  simbolos no aumente demasiado ya que el kernel se carga  en memoria y no puede intercambiarse a disco luego.
  33. 33. Debug | more La receta!:   →  iniciamos monousuario con otro kernel →  savecore ­N /kernel.panicked /var/crash Esto hace que savecore  use otro kernel  para la  extracción de los nombres de simbolos. → Vamos a /sys/compile/WHATEVER Y en KGDB: → symbol­file kernel.debug → exec­file /var/crash/kernel.0 → core­file /var/crash/vmcore.0
  34. 34. Depurando con DDD DDD es un frontend de GDB, es un depurador que  corre sobre X y esta bueno! Agreguamos la opción ­k a la línea de comando del  ddd que usaría normalmente. Por ejemplo; # ddd ­k /var/crash/kernel.0 /var/crash/vmcore.0 De esta manera usted debería poder analizar el  crash dump usando la interfaz gráfica del ddd. 
  35. 35. Analisís POST-MORTEM Que pasa si el kernel hace un dump en la memoria y  este no estaba compilado usando config ­g?. Do Not Panic!!! → /usr/src/sys/arq/conf  → makeoptions DEBUG=­g    #Build kernel with gdb symbols → Recompilamos el kernel → Verificamos el tamaño del kernel, que sea igual al anterior. En computacion y sistemas operativos un trap es un tipo de  interrupcion sincronizada causada por una condicion  exponencial (ejemplo division por cero o acceso a memoria  invalido).
  36. 36. Depuramos? # cd /sys/compile/KERNEL # kgdb kernel /var/crash/vmcore.1 1: Reading symbol data from /usr/src/sys/compile/URIAH/kernel. done. 2: IdlePTD 1f3000 3: panic: because you said to! Línea 3: Este es un dump, a partir del comentario del panic ``because you said  to!'', y un listado de la  pila bastante largo; la razón incial para  depurar fue un trap de falta de página.  
  37. 37. Depuramos? 7:  current pcb at 1e3f70 8:  Reading in symbols for ../../i386/i386/machdep.c...done. 9: (kgdb) where 10: #0 boot (arghowto=256) (../../i386/i386/machdep.c line 767) 11: #1 0xf0115159 in panic () 12: #2 0xf01955bd in diediedie () (../i386/i386/machdep.c line 698) 13: #3 0xf010185e in db_fncall () 14: #4 0xf0101586 in db_command (­266509132, ­266509516, ­267381073) 15: #5 0xf0101711 in db_command_loop () 20:#10 0xf019cb2f in trap (…) Línea 20: Esta es la ubicación de la función trap() en el listado de la stack.  
  38. 38. Depuramos? 34:  ss = ­266427884}) (../../i386/i386/trap.c line 283) 35:  283 (void) trap_pfault(&frame, FALSE); 36:  (kgdb) frame frame­>tf_ebp frame­>tf_eip 37:  Reading in symbols for  ../../i386/isa/pcvt/pcvt_drv.c...done. Línea 36: Se fuerza el uso de un nuevo marco de pila, que debe apuntar a la  localización correcta (o se supone). Posibilidad de que el puntero tp sea erroneo, o el acceso este fuera  de sus límites.
  39. 39. Depuramos? 52:  (kgdb) print tp 53:  Reading in symbols for ../../i386/i386/cons.c...done. 54:  $1 = (struct tty *) 0x1bae 55:  (kgdb) print tp­>t_line 56:  $2 = 1767990816 Línea 52: El puntero se ve sospechozo pero contiene una dirección válida En la línea 56 vemos que el puntero aputna a basura, $2 debe ser un  entero pequeño, lo que nos muestra que el puntero esta fuera de sus  límites!.
  40. 40. Algunos links útiles CodigoUnix →  http://www.codigounix.com.ar/  FreeBSD → http://www.freebsd.org/es/ OpenBSDeros → http://www.openbsderos.org/
  41. 41. Preguntas?

×