Logo Umeet2000

Presentación

Registrarse

Programa

Desarrollo

Participación

Normas para los autores

Comité de Honor

Comité Organizador

Comité Científico

Comité Técnico

Patrocinadores

Servidores espejo (mirrors) Noticias Recortes de prensa,enlaces


Charlas 12/12/2000

Log de la conferencia. Se han suprimido las líneas correspondientes a entradas y salidas de diferentes personas en el canal durante la conferencia


[19:46] (Fernand0) Tenemos el gusto de presentarles ahora a
[19:47] (Fernand0) Ismael Briones Vilar
[19:47] (Fernand0) trabaja en Mundinteractivos - El Mundo (www.elmundo.es visitenla )
[19:48] (Fernand0) Y su presentación trata sobre un tema que en estos días se ve incluso en los medios no técnicos
[19:48] (Fernand0) Programación Segura (Buffer Overflows)
[19:48] (MJesus) plas plas plas plas plas plas plas plas
[19:48] (MJesus) clap clap clap clap clap clap clap clap
[19:48] (MJesus) plas plas plas plas plas plas plas plas
[19:48] (MJesus) clap clap clap clap clap clap clap clap
[19:48] (MJesus) plas plas plas plas plas plas plas plas
[19:48] (Fernand0) Ismael ....
[19:48] (ismak) Buenas tardes
[19:48] (ismak) a todos
[19:48] (MJesus) :))))))))
[19:48] (pask) hola ismak
[19:49] (ismak) voy a tratar de explicar un poco los buffer overflows
[19:49] (ismak) y las funciones que son vulnerables de generarlos, simpre que no se controle correctamente su uso
[19:50] (ismak) No soy un expert en buffer Overflows, por lo que algunas cosas pueden no quedar claras, pero espero poder aclararlas en las preguntas
[19:51] (ismak) bueno, voy a empezar explicando un poco desde lo mas bajo
[19:51] (ismak) ....
[19:51] (ismak) Muchos programas escritos en C son vulnerables ante desbordamientos de
[19:51] (ismak) pila, (Stack Overflow), mediante la escritura de un array con una cadena de
[19:51] (ismak) caracteres mas grande que el tamanyo del array, permitiendo la ejecucion de
[19:51] (ismak) un codigo arbitrario.
[19:52] (ismak) Alguna de estas funciones son:
[19:52] (ismak) strcpy()
[19:52] (ismak) strcat()
[19:52] (ismak) sprintf()
[19:52] (ismak) scanf()
[19:52] (ismak) sscanf()
[19:52] (ismak) fscanf()
[19:52] (ismak) vfscanf()
[19:52] (ismak) vsprintf
[19:52] (ismak) vscanf()
[19:52] (ismak) vsscanf()
[19:52] (ismak) streadd()
[19:52] (ismak) strecpy()
[19:52] (ismak) strtrns()
[19:52] (ismak) Este tipo de vulnerabilidades constituyen unos de los principales
[19:52] (ismak) problemas de seguridad a los que se tienen que enfrentar los administradores
[19:52] (ismak) de sistemas. El incremento de programas que presentan este tipo de problema
[19:52] (ismak) ha aumentado considerablemente.
[19:53] (ismak) Pero vallamos por partes:
[19:53] (ismak) Como se organiza un proceso en memoria?
[19:53] (ismak) Los procesos en memoria estan divididos en tres regiones: Texto,
[19:53] (ismak) Datos y Pila. Nosotros nos concentraremos en la pila. Pero vamos a explicar
[19:53] (ismak) las otra dos regiones.
[19:54] (ismak) La region de texto incluye el codigo (instrucciones del programa) y datos de
[19:54] (ismak) solo lectura. Esta region es de solo lectura y cualquier intento de escribir
[19:54] (ismak) en ella provocara un error (Segmentation violation).
[19:54] (ismak) La region de datos contiene datos inicializados y sin inicializar. Las
[19:54] (ismak) variables estaticas son almacenadas en esta region.
[19:54] (ismak) Un esquema es:
[19:55] (ismak) | |
[19:55] (ismak) | Text |
[19:55] (ismak) | |
[19:55] (ismak) |------------------|
[19:55] (ismak) | (Initialized) |
[19:55] (ismak) | Data |
[19:55] (ismak) | (Uninitialized) |
[19:55] (ismak) |------------------|
[19:55] (ismak) | |
[19:55] (ismak) | Stack |
[19:55] (ismak) | | Direcciones altas de memoria
[19:55] (ismak) Que es una pila?
[19:56] (ismak) Aunque la mayoria sabra lo que en informatica significa pila, voy a
[19:56] (ismak) explicarlo. Una pila es un tipo abstracto de dato, en el que el ultimo
[19:56] (ismak) elemento en entrar es el primero en salir,LIFO (Last in, First out)
[19:56] (ismak) (Por ejemplo, es similar a tener una pila de platos sucios, un encima de
[19:56] (ismak) otro. Para empezar a lavarlos, tendremos que empezar por el de mas arriba,
[19:56] (ismak) que es el ultimo que se incorporo a nuestra pila).
[19:56] (ismak) La region de Stack es un bloque continuo de memoria conteniendo datos. En
[19:56] (ismak) esta region se almacenaran los parametros a una funcion, las variables
[19:56] (ismak) locales. Estos valores son almacenados (mediante el comando PUSH) al llamar
[19:56] (ismak) a una funcion, y extraidos (POP) cuando se sale de la funcion.
[19:57] (ismak) Unos de los problemas de los sitemas operativos multiusuario es que para
[19:57] (ismak) ejecutar ciertas acciones, es necesario realizarlas con privilegios de
[19:57] (ismak) root (Por ejemplo cambiar nuestro passwd). Esto se consigue poniendo el
[19:57] (ismak) programa con suid de root, es decir :
[19:57] (ismak) -rwsr-x-r-x root root programa
[19:57] (ismak) De esta forma, cuando un usuario ejecute el programa, su UID y su GID
[19:57] (ismak) cambiaran momentaneamente al de root, hasta que finalice la ejecucion del
[19:57] (ismak) programa. El problema surge cuando el programa con suid de root copia datos a
[19:57] (ismak) buffers sin controlar el tamanyo del buffer y el numero de caracteres copiados,
[19:57] (ismak) lo que permitiria sobreescribir la direccion de retorno y ejecutar un codigo
[19:57] (ismak) arbitrario.
[19:58] (ismak) Imaginemonos el siguiente programa:
[19:58] (viper) ese cambio no puede usarse como vulnerabilidad para hacer algo?
[19:59] (ismak) cambio de la direccion de retorno, si claro, a eso vamos :-)
[19:59] (ismak) main (int argc, char *argv[]) {
[19:59] (ismak) char s
[1024];
[19:59] (ismak) strcpy (s,argv
[1]);
[19:59] (TuC0) creo que esa es la idea, evitar la vulnerabilidad
[19:59] -uni- No Permission!
[19:59] (ismak) }
[19:59] (ismak) todos sabemos que esa vulnerabilidad existe y se puede explotar, pero como se puede evitar? vamos a ver si llegamos a ello
[20:00] (ismak) como decia, tenemos un sencillo programa
[20:00] (ismak) Este programa copia la cadena de caracteres que se le pasa en la linea de
[20:00] (ismak) comandos en el buffer s, pero sin controlar el numero de caracteres copiados,
[20:00] (ismak) por lo que si copiamos mas de 1024 caracteres, podremos sobreescribir la
[20:00] (ismak) direccion de retorno
[20:00] (ismak) Esta seria el estado de nuestra pila:
[20:00] (ismak) [ ] [ ] [ ] [ ]
[20:00] (ismak) | | | |
[20:00] (ismak) | | | ->argv
[20:00] (ismak) | | ->RET
[20:00] (ismak) | ->ebp
[20:01] (ismak) ->s
[20:01] (ismak) el buffer s ocupa 1024 bytes
[20:02] (ismak) ebp y la direccion de retorno ocupan 4 bytes ambos
[20:02] (ismak) Si pasamos una cadena de 1028 caracteres, sobreescribiremos la direccion de
[20:02] (ismak) retorno, por lo que el programa saltara a una direccion arbitraria de memoria,
[20:02] (ismak) generando un segmentation fault. Ahora bien, nosotros podemos pasarle una
[20:02] (ismak) cadena de caracteres que contenga un codigo ejecutable (/bin/sh) por ejemplo,
[20:02] (ismak) y sobrescribir la direccion de retorno con la direccion de nuestro codigo.
[20:03] (ismak) De esta forma, al ser un programa con suid root, este codigo se ejecutaria
[20:03] (ismak) con los privilegios de root. En nuestro caso obtendriamos un shell con
[20:03] (ismak) privilegios de root. Este es, en resumidas cuentas, el fallo que se
[20:03] (ismak) utiliza para generar un buffer overflow.
[20:03] (ismak) Esto es lo que nos preguntaba viper
[20:04] (ismak) si el buffer s contiene el codigo de un programa, podemos conseguir que se ejecute con privilegios de administrador (root)
[20:04] (ismak) lo mas normal es obtener el codigo en ensamblador de un programa que ejecute un shell
[20:05] (ismak) Podemos encontrar el codigo en ensamblador para diferentes arquitecturas si buscamos un poco por la web
[20:05] (ismak) Para evitar estos problemas debemos hacer uso de nuevas funciones que
[20:05] (ismak) permitan controlar el numero de caracteres que se copian a un buffer. Voy a
[20:05] (ismak) mostrar una serie de funciones que son susceptibles de generar buffer
[20:05] (ismak) overflows si se utilizan en el desarrollo de un programa, sin controlar el
[20:05] (ismak) tamanyo de los buffers, asi como las funciones que deberiamos de utilizar para
[20:05] (ismak) evitar estos problemas:
[20:06] (ismak) gets Muy peligrosa Usar fgets(buf, size, stdin)
[20:06] (ismak) strcpy Muy Peligrosa Usar strncpy.
[20:06] (ismak) strcat Muy Peligrosa Usar strncat.
[20:06] (ismak) sprintf Muy Peligrosa Usar snprintf.
[20:06] (ismak) scanf Muy Peligrosa Especificar los parametros correctamente.
[20:06] (ismak) sscanf Muy Peligrosa Especificar los parametros correctamente.
[20:06] (ismak) fscanf Muy Peligrosa Especificar los parametros correctamente.
[20:06] (ismak) vfscanf Muy Peligrosa Especificar los parametros correctamente.
[20:06] (ismak) vsprintf Muy Peligrosa Usar vsnprintf.
[20:06] (ismak) vscanf Muy Peligrosa Especificar los parametros correctamente.
[20:06] (ismak) vsscanf Muy Peligrosa Especificar los parametros correctamente.
[20:06] (viper) me parece que ocurrio un buffer overflow
[20:06] (viper) :-))
[20:06] (ismak) La lista es bastante grande. POdeis ver la lista completa en la pagina de IBM http://www-4.ibm.com/software/developer/library/buffer-defend.html?dwzone=se curity
[20:07] (Slayer_X) hehehe, fue un lag overflow ;)
[20:07] (ismak) Donde se explican los buffer overflows de forma muy clara. cOn una serie de ejemplos
[20:09] (ismak) La utilizacion de estas funciones, simpre teniendo en cuenta y controlando el tamanyo de as cadenas copiados a los buffers
[20:10] (ismak) es una de las formas que existen de evitar los buffer overflows
[20:10] (ismak) Existen otros metodos, en los que no he profundizado, pero que tambien pueden ser interesantes
[20:11] (ismak) como evitar la ejecucion de codigo en pila (gracias pask) pero que no puede comentaros.
[20:12] (ismak) Bueno, no he profundizado mucho en el tema, pero espero que se generen preguntas y empecemos a discutir sobre el tema, nunca se acaba de aprender
[20:12] (pask) como ?
[20:12] (pask) que no puedo comentarlos ?
[20:13] (pask) (??)
[20:13] (MJesus) plas plas plas plas plas plas plas plas
[20:13] (MJesus) clap clap clap clap clap clap clap clap
[20:13] (MJesus) plas plas plas plas plas plas plas plas
[20:13] (MJesus) clap clap clap clap clap clap clap clap
[20:13] (MJesus) plas plas plas plas plas plas plas plas
[20:13] (MJesus) clap clap clap clap clap clap clap clap
[20:13] (MJesus) plas plas plas plas plas plas plas plas
[20:13] (Slayer_X) ya se pueden hacer preguntas? ;)
[20:13] (ismak) Podeis obtener buena documentacion en estos documentos:
[20:13] (ismak) * Aleph One.
[20:13] (ismak) Smashing the stack for fun and profit.
[20:13] (ismak) Phrack Magazine, 7(49), Noviembre 1996.
[20:13] (ismak) http://www.securityfocus.com/data/library/P49-14.txt
[20:14] (ismak) * Writing Safe Setuid Programs
[20:14] (ismak) http://seclab.cs.ucdavis.edu/~bishop/secprog.html
[20:14] (ismak) * How to Write Buffer Overflows
[20:14] (ismak) http://www.l0pht.com/advisories/bufero.html
[20:14] (viper) 3clop clop clop clop clop clop clop clop
[20:14] (ismak) * Preventing Buffer Overflows
[20:14] (ismak> http://www-4.ibm.com/software/developer/library/buffer-defend.html?dwzone=se curity
[20:14] (ismak)
[20:15] (ismak) tu si que puedes comentarlos pask :-)
[20:15] (TuC0) diria alguna pregunta, pero me he quedado sin palabras
[20:15] (TuC0) :p
[20:15] (Slayer_X) felicitaciones ismak, estuvo genial, sobretodo para los q no entendiamos bien esto
[20:15] (Fernand0) yo tengo una pregunta
[20:16] (C0x86) :)
[20:16] (Fernand0) Viendo la charla
[20:16] (ismak) A mi aun me quedan cosas por saber :-p
[20:16] (viper) que significa el segmentation fault al ejecutar un programa? Tiene algo que ver con buffer Overflows?
[20:16] (Fernand0) y leyendo esos documentos y otros
[20:17] (Fernand0) pudiera parecer que los fallos de seguridad están motivados por programar en c
[20:17] (Fernand0) eso es asi ?
[20:17] (Fernand0) qué se sabe de otros lenguajes?
[20:17] (ismak) cuando se sobreescibe la direccion de retorno, el programa salta a una direccion arbitraria. Como en esa direccion no exuste un codigo valido que ejecutar, el programa genera un error, un Segmentation fault
[20:18] (viper) porque hace un tiempo baje un programa de un ftp y al ejecutarlo en Linux me tiraba este error
[20:18] (ismak) Fernand0: no solo los buffer overflows se generan en el lenguaje c, de echo se generan en cualquier lenguaje que permita sobreescribir un buffer con una cadnea mayor que su tamanyo
[20:18] (viper) me parecio raro. Deberia estar probado para liberarlo
[20:18] (trusmis) viper: tranquilo es un error bastante común
[20:18] (Slayer_X) ismak: alguna idea de porque los profesores de C/C++ nunca mencionan el tema de "buffer overflow"?
[20:19] (viper) y como los soluconas?
[20:19] (ismak) Slayer_X: a mi nunca me los comentaron. Seguramente esa puede ser la causa de que existan muchos programas con este problema
[20:19] (Slayer_X) victor: dale con strace tu_programa_de_ftp y capaz te da una luz
[20:20] (ismak) viper: puede ser por muchos motivos
[20:20] (viper) por ejemplo?
[20:21] (Slayer_X) ismak: no conozco uno solo q mencione ese tema
[20:21] (ismak) viper: que no este compilado para esa distribucion, ...
[20:22] (viper) podria
[20:22] (ismak) Slayer_X: yo tampoco, al menos de los profesores que yo he tenido
[20:22] (pask) a ver ..
[20:22] (pask) volvi ..
[20:22] (pask) respecto al tema de evitar la ejecucion en la zona de pila
[20:22] (pask) existen varios parches para linux
[20:23] (pask) uno de ellos es OpenWall Project de Solar Designer
[20:23] (viper) No se si tendra algo que ver, pero cuando uso una determinada aplicacion de TheGimp! se cierra el programa y sale un mensaje que termina con SiGCAUGHT o algo asi
[20:23] (pask) permite logear los intentos de ejecucion y los intentos de links duros en tmp y demas ... varias de las cosas mas utilitzadas para cascar un sistema
[20:24] (pask) otro parche se llama PAX .. es mejor en cueanto disminucion de rendimiento respecto a OpenWall project
[20:24] (pask) ninguno de los 2 funciona bien con un server ORacle (si alguien lo consigue que me lo diga please)
[20:24] (ismak) viper: a mi me a sucedido muchas veces con algunos programas, pero necesitar debugear el programa paara sacar algo en calro. Empieza con el strace como comento Slayer_X
[20:24] (pask) con solaris es realmente mas sencillo
[20:24] (maz) con solaris
[20:24] (botijo) con solaris es realmente mas sencillo
[20:24] (maz) atencion
[20:25] (maz) que es sencillo en solaris?
[20:25] (viper) me voy a fijar. La verdad_ no lo use nunca
[20:25] (pask) el evitar la ejecucion en la zona de pila
[20:25] (pask) con
[20:25] (pask) set noexe_user_stack=1
[20:26] (pask) set noexe_user_stack_log=1
[20:26] (pask) set noexec_user_stack=1
[20:26] (pask) set noexec_user_stack_log=1
[20:26] (pask) evitariamos la ejecucion y logeariamos el intento
[20:26] (pask) es realmente interesante
[20:27] (ismak) de verdad que suena bien
[20:27] (Slayer_X) pask: buen dato ;)
[20:27] (ismak) gracias pasky ;-)
[20:27] (maz) hf
[20:27] (maz) ok
[20:27] (maz) alguien a instalado Oracle en Solaris?
[20:27] (pask) de nada ismak ;-))
[20:28] (MJesus) plas plas plas plas plas plas plas plas
[20:28] (MJesus) clap clap clap clap clap clap clap clap
[20:28] (MJesus) plas plas plas plas plas plas plas plas
[20:28] (MJesus) clap clap clap clap clap clap clap clap
[20:28] (MJesus) plas plas plas plas plas plas plas plas
[20:28] (MJesus) clap clap clap clap clap clap clap clap
[20:28] (pask) sobre solaris no .. sobre linux si ... de todos modos la gente que conozco que si lo ha hecho .. el Universall installer esta mas evolucionado .. que problema tienes ?
[20:28] (pask) Borja si estuviera igual podria hablarnos de estos mejor ..
[20:28] (pask) tiene servers en explotacion con Oracle sobr Solaris SParc
[20:29] (Slayer_X) algun dia me pondre un solaris :P
[20:29] (ismak) bueno, voy a tener que marchar, a ver si puedo conectarme desde casa
[20:29] (Fernand0) Si no hay más preguntas
[20:29] (Fernand0) es momento de agradecer a Ismael su presentación
[20:29] (Fernand0) y de invitarles a profundizar sobre la misma
[20:29] (Slayer_X) muchas gracias ismak felicitaciones por la magnifica charla
[20:29] (Fernand0) siguiendo su conferencia y los enlaces proporcionados
[20:29] (Fernand0) y aprovechando para discutir sobre ella
[20:29] (Fernand0) aqui
[20:29] (Fernand0) o en los foros habituales

Y seguimos un buen rato más charlando...




Contact: umeet@uninet.edu