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:

|