Security for FreeBSD and kernel debugging
-
Upload
facundo-de-la-cruz -
Category
Documents
-
view
1.184 -
download
2
description
Transcript of Security for FreeBSD and kernel debugging
Security for FreeBSD and Kernel Debugging
Jornadas del Sur Bahia Blanca , Argentina–
$: WHOAMI$: WHOAMI /*** Name : Facundo M. de la Cruz _tty0 @ Freenode→* EMail: fmdlc <at> code4life.com.ar* Blog : http://www.codigounix.com.ar/** 0x41) Consultor en IT && Seg. Informática * 0x42) Coordinador de SanLuiX**/
Disassemble main
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ónInformaciónEs el objeto de mayor valor para una organización, el objetivo es el resguardo de la información.
→ → Equipos que la soportan.Equipos que la soportan.Software, hardware y organización.
→ → UsuariosUsuariosIndividuos que utilizan la estructura tecnológica y de comunicaciones que manejan la información.
Seguridad FreeBSDFreeBSD proporciona un variado arsenal de utilidades y mecanismos para asegurar la integridad y la seguridad de su sistema y red. Para así lograr:
→ IntegridadIntegridad
→ → ConfidencialidadConfidencialidad
Disponibilidad→ Disponibilidad→
→ → No repudio (irrefutabilidad)No repudio (irrefutabilidad)
¿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
Descubrimiento
Etapas de un ataque
Exploración
Intrusión
Medidas de seguridadSe implementan en un modelo multicapamulticapa y se pueden categorizar en:
→ Asegurar root y cuentas administrativasAsegurar root y cuentas administrativas
→ → Asegurar los servers que ejecuten como root binarios suid/sgidAsegurar los servers que ejecuten como root binarios suid/sgid
→ → Asegurar cuentas de usuarioAsegurar cuentas de usuario
→ → Asegurar el archivo de contraseñasAsegurar el archivo de contraseñas
→ → Asegurar el kernel, los dispositivos y filesystemAsegurar el kernel, los dispositivos y filesystem
→ → Detección rápida de cambios hechos al sistemaDetección rápida de cambios hechos al sistema
→ → ParanoiaParanoia
Usuarios
→ 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 Se puede notar que el 80% de los problemas relacionados a la seguridad informática son producido relacionados a la seguridad informática son producido por los empleados de dicha organización.por los empleados de dicha organización. Y esto se podría tipificar en tres grandes grupos:Y esto se podría tipificar en tres grandes grupos:
→ Problemas por ignorancia → Problemas por haraganería → Problemas por malicia
Alguién dijo problemas?
Tipos de cuentasComo en todos los UnixLike 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.
NobodyNobody es el usuario de sistema sin privilegios.
Mientras mas servicios usen nobody, mas archivos y procesos tendrá y por consecuencia mas privilegios tendra.
CapacidadesPara lograr una administración segura, es importante que Para lograr una administración segura, es importante que las cuentas de usuarios tengan ciertos límites y las cuentas de usuarios tengan ciertos límites y capacidades, para ello podemos utilizar el archivo:capacidades, para ello podemos utilizar el archivo:
/etc/login.conf/etc/login.conf
A cada usuario se le asigna una clase de login → A cada usuario se le asigna una clase de login → Cada clase tiene capacidades asociadas → → Cada clase tiene capacidades asociadas → → nombre=valor
LimitesExisten dos tipos de límites:Existen dos tipos de límites:
→ BlandoBlando Puede ser ajustado por el usuario o una app.→ → DuroDuro Idém, pero el usuario puede unicamente →
disminuirlo.
Algunos límites comúnes:Algunos límites comúnes:
→ CoredumpsizeCoredumpsize Tamaño del core→ → CPUTimeCPUTime Tiempo maxímo de CPU→ → FilesizeFilesize Tamaño máximo de un archivo→ → MaxprocMaxproc Número maximo de procesos por usuario→ → StackSizeStackSize Tamaño máximo del stack→ → SBSizeSBSize Tamaño máximo de memoria de red fue creado →
para evitar DoS/DDoS ya que estos creaban muchos sockets
Asegurar rootEn ciertas ocasiones puede resultar adecuado no permitir En ciertas ocasiones puede resultar adecuado no permitir el login de root desde cierta terminales que no sean el login de root desde cierta terminales que no sean seguras.seguras.
ttyv1 "/usr/libexec/getty Pc" cons25l2 on securesecurettyv2 "/usr/libexec/getty Pc" cons25l2 on securesecurettyv3 "/usr/libexec/getty Pc" cons25l2 on securesecurettyv4 "/usr/libexec/getty Pc" cons25l2 on securesecure
El grupo wheel:
Contiene los usuarios aturizados a ejecutar susu. Esta no es siempre la opción más segura. ksuksu.
Y en /etc/ssh/sshd_config:
PermitRootLogin No
Evitar binarios con SUID mas de lo necesario.→ Correr solo los servicios necesarios→
Tipos de autenticación posibles:
En algo conocido: Contraseñas (passwords) En algo conocido: Passprhase (PGP)En algo poseído: Tarjeta inteligenteEn algo poseído: Dispositivo USBCaracterísticas Físicas: Retina, huellas dactilares, etc.c.
Autenticación
Cifrado de contraseñas → → Para los usuarios de FreeBSD en U.S.A. Se usa 3DESPara los usuarios de FreeBSD en U.S.A. Se usa 3DES
Para los usuarios de FreeBSD en el resto del mundo SHA1→ Para los usuarios de FreeBSD en el resto del mundo SHA1→
Esto es debido a que la ley norteamericana prohibe la Esto es debido a que la ley norteamericana prohibe la importación de algoritmos criptografícos.importación de algoritmos criptografícos.
El formato de contraseñas a utilizar se encuentra El formato de contraseñas a utilizar se encuentra en en /etc/login.conf /etc/login.conf mediantemediante passwd_format passwd_format..
Contraseñas de un solo uso → → OPIE (Onetime Passwords In Everything)OPIE (Onetime Passwords In Everything) Por defecto hash Md5→ Por defecto hash Md5→ Contraseña usada únicamente para generar llaves→ Contraseña usada únicamente para generar llaves→ Conceptos de Semilla o Llave 2 Letras y 5 Digitos→ → Conceptos de Semilla o Llave 2 Letras y 5 Digitos→ → Cuenta de iterancion Entero de 1 a 100→ → Cuenta de iterancion Entero de 1 a 100→ → Autentificación mediante PAM→ Autentificación mediante PAM→ Configuración en /etc/opieaccess → 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.
ACL ' sEn 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 montajeFlag 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 privatedrwxrwx+ 2 robert robert 512 Dec 23 10:57 directorio1drwxrwx+ 2 robert robert 512 Dec 22 10:20 directorio2drwxrwx+ 2 robert robert 512 Dec 27 11:57 directorio3drwxrxrx 2 robert robert 512 Nov 10 11:54 public_html
ACL ' sPara comprobar las ACL's de un archivo podemos Para comprobar las ACL's de un archivo podemos utilizar:utilizar:
% getfacl archivo.txt% getfacl archivo.txt #file:test #file:test #owner:1001#owner:1001 #group:1001#group:1001 user::rwuser::rw group::rgroup::r other::rother::r
Para eliminar las ACL's de un archivo utilizamos:Para eliminar las ACL's de un archivo utilizamos:
% setfacl k % setfacl k
Para configurar ACL's a un archivo:Para configurar ACL's a un archivo:
% setfacl m u:trhodes:rwx,group:web:r,o:: test% setfacl m u:trhodes:rwx,group:web:r,o:: test
Contabilidad de procesosEs 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 sasa
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_BANDLIMICMP_BANDLIM, que limita la efectividad de este tipo de ataques.
→ 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→
FreeBSD Security OfficerComo muchos sistemas operativos con calidad de producción FreeBSDFreeBSD publica Security AdvisoriesSecurity Advisories, que se suelen recibir por EMail.
Los advisories se envían a las siguientes listas de distribución de FreeBSD:
>> FreeBSDsecurity[email protected] Seg. en FreeBSD→>> FreeBSD[email protected] Seg. en general →>> FreeBSD[email protected] Notificaciones seguridad (moderada)→
Se firman siempre usando la clave PGP del FreeBSD Security FreeBSD Security OfficerOfficer y se archivan, junto con los patches asociados, en el repositorio FTP CERT.
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/index.html
=============================================================================FreeBSD-SA-XX:XX.UTIL Security Advisory The FreeBSD ProjectTopic: denial of service → El problemaCategory: core → Parte afectada: Core / Contrib / PortsModule: sys → Ubicación del componente Announced: 2009-01-23 → Fecha de anuncioCredits: Person@EMAIL-ADDRESS → Créditos de quien descubrioAffects: All releases of FreeBSD → Versiones FreeBSD afectadas FreeBSD 4-STABLE prior to the correction dateCorrected: 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 thefollowing sections, please visithttp://www.FreeBSD.org/security/.I. Background → Sobre app. Afectada (por que existe, qué es)II. Problem Description → Descripcion del problemaIII. Impact → Tipo de impactoIV. Workaround → Solución temporalV. Solution → Solución para parchear VI. Correction details → Despliega la rama del CVSVII. References → Fuentes adicionales
Security Advisory
PortauditUna 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# cd /usr/ports/security/portaudit && make install clean
# portaudit F # portaudit F Actualiza la database /var/db/portaudit→ Actualiza la database /var/db/portaudit→
# portaudit a # portaudit a Comprobamos...→ Comprobamos...→
Affected package: cupsbase1.1.22.0_1Affected package: cupsbase1.1.22.0_1Type of problem: cupsbase HPGL buffer overflow vulnerability.Type of problem: cupsbase HPGL buffer overflow vulnerability.Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2680911d9a9e7Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2680911d9a9e70001020eed82.html>0001020eed82.html>
1 problem(s) in your installed packages found.1 problem(s) in your installed packages found.
You are advised to update or deinstall the You are advised to update or deinstall the affected package(s) immediately.affected package(s) immediately.
WTF? A small problem... WTF? A small problem...
Portaudit + Portupgrade Portaudit + Portupgrade
CHROOTFreeBSD 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.
Proceso
Chroot
JAILSLas 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: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)→
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→
Iniciando un JAILjail_enable="YES"jail_enable="YES"
#Lista de nombres de jaulas separados por espacios#Lista de nombres de jaulas separados por espaciosjail_list="www" jail_list="www"
jail_www_rootdir="/usr/jail/www" # directorio raiz de la jaulajail_www_rootdir="/usr/jail/www" # directorio raiz de la jaulajail_www_hostname="www.example.org" # nombre de máquina de la jaulajail_www_hostname="www.example.org" # nombre de máquina de la jaulajail_www_ip="192.168.0.10" # dirección IP de la jaulajail_www_ip="192.168.0.10" # dirección IP de la jaulajail_www_devfs_enable="YES" # montar devfs en la jaulajail_www_devfs_enable="YES" # montar devfs en la jaulajail_www_devfs_ruleset="www_ruleset" # reglas a aplicar a devfsjail_www_devfs_ruleset="www_ruleset" # reglas a aplicar a devfs
Para Iniciar:Para Iniciar:
# /etc/rc.d/jail start www
Para Detener:Para Detener:
# /etc/rc.d/jail stop www
jls / jexecjls / jexec
Kernel debugging
DebuggingBajo ciertas circunstancias puede suceder que nuestro Bajo ciertas circunstancias puede suceder que nuestro querido kernel entre en Panic!! o se produce un crash. querido kernel entre en Panic!! o se produce un crash. OMFG!! WTF????OMFG!! WTF????
Necesitamos suficiente SWAP→ Necesitamos suficiente SWAP→
No se soportan dumps que no sean a SWAP→ No se soportan dumps que no sean a SWAP→
Configurar DUMPDEV en rc.conf utilizado Device de /etc/fstab→ Configurar DUMPDEV en rc.conf utilizado Device de /etc/fstab→
→ → Kernel configurado con g. Kernel configurado con g. Para depura vithe!Para depura vithe!
dumpon /dev/ad4s1b Mi SWAP→ → dumpon /dev/ad4s1b Mi SWAP→ →
GDBGDB es el GDB es el GNU DebuggerGNU Debugger, es un depurador escrito por la , es un depurador escrito por la FSF, como parte del proyecto GNU. Tiene la posibiliad FSF, como parte del proyecto GNU. Tiene la posibiliad de depurar codigo objeto ende depurar codigo objeto en C, C, C++ C++ y otros.y otros.
Posibilidad de establecer breakpoints o puntos de ruptura→ Posibilidad de establecer breakpoints o puntos de ruptura→
→ → Detener ejecución en rupturas por condiciones (watchpoints)Detener ejecución en rupturas por condiciones (watchpoints)
→ → Detener ejecución al recibir señal externa (catchpoints)Detener ejecución al recibir señal externa (catchpoints)
Puede obtener información de los coredumps→ Puede obtener información de los coredumps→
KGDBEl término KGDB se refiere a GDB corriendo en:El término KGDB se refiere a GDB corriendo en:KERNEL DEBUGGING MODEKERNEL 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.
Debug | moreLa receta!:La receta!: → → iniciamos monousuario con otro kerneliniciamos monousuario con otro kernel
→ → savecore N /kernel.panicked /var/crashsavecore N /kernel.panicked /var/crash
Esto hace que savecore Esto hace que savecore use otro kerneluse otro kernel para la para la extracción de los nombres de simbolos.extracción de los nombres de simbolos. Vamos a /sys/compile/WHATEVER→ Vamos a /sys/compile/WHATEVER→
Y en KGDB:Y en KGDB:
symbolfile kernel.debug→ symbolfile kernel.debug→
→ → execfile /var/crash/kernel.0execfile /var/crash/kernel.0
→ → corefile /var/crash/vmcore.0corefile /var/crash/vmcore.0
Depurando con DDDDDD 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.
Analisís POST-MORTEMQue pasa si el kernel hace un dump en la memoria y este no estaba compilado usando config g?.Do Not Panic!!!Do Not Panic!!!
/usr/src/sys/arq/conf → /usr/src/sys/arq/conf →
makeoptions DEBUG=g #Build kernel with gdb symbols→ makeoptions DEBUG=g #Build kernel with gdb symbols→
Recompilamos el kernel→ Recompilamos el kernel→
Verificamos el tamaño del kernel, que sea igual al anterior.→ Verificamos el tamaño del kernel, que sea igual al anterior.→
En computacion y sistemas operativos un trap es un tipo de En computacion y sistemas operativos un trap es un tipo de interrupcion sincronizada causada por una condicion interrupcion sincronizada causada por una condicion exponencial (ejemplo division por cero o acceso a memoria exponencial (ejemplo division por cero o acceso a memoria invalido).invalido).
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 1f30003: panic: because you said to!
Línea 3:Línea 3:EEste 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.
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 1f30003: panic: because you said to!7: current pcb at 1e3f708: Reading in symbols for ../../i386/i386/machdep.c...done.9: (kgdb) where10: #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 ()
Línea 3:Línea 3:EEste 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.
20:#10 0xf019cb2f in trap (…)
Línea 20:Línea 20:Esta es la ubicación de la función trap() en el listado de la stack.
7: current pcb at 1e3f708: 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:Línea 20:Esta es la ubicación de la función trap() en el listado de la stack.
34:34: ss = 266427884}) (../../i386/i386/trap.c line 283) ss = 266427884}) (../../i386/i386/trap.c line 283)35:35: 283 (void) trap_pfault(&frame, FALSE); 283 (void) trap_pfault(&frame, FALSE);36:36: (kgdb) frame frame>tf_ebp frame>tf_eip (kgdb) frame frame>tf_ebp frame>tf_eip37:37: Reading in symbols for Reading in symbols for ../../i386/isa/pcvt/pcvt_drv.c...done.../../i386/isa/pcvt/pcvt_drv.c...done.
Línea 36: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.
Depuramos?
52: (kgdb) print tp53: Reading in symbols for ../../i386/i386/cons.c...done.54: $1 = (struct tty *) 0x1bae55: (kgdb) print tp>t_line56: $2 = 1767990816
Línea 52:Línea 52:El puntero se ve sospechozo pero contiene una dirección válidaEn 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!.
Depuramos?
Algunos links útilesCodigoUnix → http://www.codigounix.com.ar/
FreeBSD → http://www.freebsd.org/es/
OpenBSDeros → http://www.openbsderos.org/
$: WHOAMI$: WHOAMI
/*** Name : Facundo M. de la Cruz _tty0 @ Freenode→* EMail: fmdlc <at> code4life.com.ar* Blog : http://www.codigounix.com.ar/** 0x41) Consultor en IT && Seg. Informática * 0x42) Coordinador de SanLuiX**/
Preguntas?