xtingray | hora de empezar una nueva charla...
|
xtingray | en esta ocasion nos acompaña Alejandro Sánchez Acosta
|
xtingray | y ha participado en varios proyectos para la GNU, Gnome
y KDE...
|
xtingray | Alejandro, el auditorio es tuyo... adelante!
|
alejandro | Muchas gracias xtingray.
|
alejandro | Buenas noches a todos.
|
alejandro | Bien, el objetivo de mi charla es hacer una pequeña
introducción a los problemas actuales de seguridad que existen en
diferentes lenguajes mostrando aquellos patrones que pueden presentar
riesgos en código fuente.
|
alejandro | + Introducción a los problemas de seguridad
|
alejandro | Si observamos proyectos en Sourceforge, podemos ver
que exiten más de 50 mil proyectos escritos con software libre.
|
alejandro | De estos proyectos existen tanto aplicaciones gráficas
como de consola, por lo que es importante que se compruebe la seguridad
en el código fuente.
|
alejandro | Las aplicaciones Web siguen teniendo problemas de
seguridad como Cross Site Scripting, Cross Site Request Forgery, Session
Fixation, Subida de Ficheros, Ejecución de comandos, etc.
|
alejandro | En el campo de las aplicaciones de consola podemos
encontrarnos con otro gran repertorio de vulnerabilidades ampliamente
conocidos como son el caso de los buffer overflows, heap overflows,
format string, etc.
|
alejandro | Este tipo de ataques se representan en código fuente
de diferentes maneras y sus problemas son similares en diferentes
lenguajes.
|
alejandro | Basicamente lo que ocurre es que no existe una
verificación de los datos de entradas de usuario dando lugar a diferentes
tipos de riesgos.
|
alejandro | Aún así también otras vulnerabilidades residen en la
lógica de la aplicación, en el tratamiento de excepciones o como muestra
la aplicación la información.
|
alejandro | Aunque estos problemas no son tan críticos como los
citados previamente, si que proporcionan información a un posible
atacante del tipo de aplicación que se está ejecutando.
|
alejandro | En las situaciones en las que la salida se interpreta se
dice que son casos de inyección de código y son los anteriormente
comentados (XSS, XSRF, FT o CE).
|
alejandro | Distinguiendo entre las aplicaciones web y de consola
podemos observar que algunos problemas en nuevos lenguajes están
mitigados, por ejemplo, en Java y .NET mediante el uso de recolección de
memoria.
|
alejandro | En estos sistemas el programador no tiene que
preocuparse de problemas asociados a la asignación y liberación de
memoria.
|
alejandro | + Detección de vulnerabilidades
|
alejandro | Una vez introducido los problemas de seguridad en los
diferentes lenguajes, tanto aplicaciones web como de consola o gráficas,
veremos como se pueden detectar vulnerabilidades.
|
alejandro | Si hacemos un análisis a herramientas actuales para el
uso de auditoria o análisis del código de aplicaciones vemos que nos
encontramos con herramientas basadas en firmas.
|
alejandro | Estas herramientas basadas en firmas o patrones como
ITS4, Rats, Splint o Flawfinder, generalmente unicamente miran patrones.
|
alejandro | Por lo que nos encontramos con un gran amplio
número de falsos positivos.
|
alejandro | Generalmente marcan el uso de buenas prácticas y
recomendaciones buscando patrones que puedan identificar riesgos.
|
alejandro | Generalmente todavía les falta un análisis más
profundo como el que podría hacer directamente un compilador.
|
alejandro | Además unicamente están enfocados a un único
lenguaje, por lo que no nos sirven para el trabajo de auditoría general.
|
alejandro | Lo ideal sería trabajar directamente en el compilador
para conseguir mitigar estos riesgos.
|
alejandro | Esto se conseguiría haciendo un análisis léxico,
sintáctico y semántico del código, pero por su complejidad todavía no
existe ninguna solución.
|
alejandro | Además que las pocas implementaciones en
Universidades como proyectos de investigación suelen ser muy lentas.
Hola
|
alejandro | Por lo que unicamente nos quedan análisis mediante
patrones, los cuales veremos en profundidad segun varios lenguajes.
|
alejandro | También haría falta el uso de métricas dentro de las
aplicaciones de análisis de código,
|
alejandro | para estimar el número de vulnerabilidades, líneas de
código, complejidad, etc.
|
alejandro | Generalmente se hace uso de busqueda de patrones de
entrada de usuario y funciones que puedan ser un riesgo.
|
alejandro | Ademas de realizar un seguimiento de la aplicacion.
|
alejandro | (casos de asignacion, paso a funciones, etc)
|
alejandro | + Entrada de usuario en aplicaciones
|
alejandro | Bien, una vez entendido lo importante que es el analisis
de la entrada de usuario,
|
alejandro | veremos como identificarlos para poder evitar
problemas tipicos de seguridad.
|
alejandro | Si analizamos por ejemplo la entrada de usuario en
aplicaciones Web en java nos encontramos codigo como el siguiente:
|
alejandro | string username = request.getParameter("username");
|
alejandro | Este tipo de declaracion puede ser vulnerable
dependiendo de lo que se haga con la variable username.
|
alejandro | Por lo que es correspondiente saber que se hace con
ella posteriormente.
|
alejandro | En otros lenguajes como .NET se utiliza el objeto
Request (o Request.GetQueryString)
|
alejandro | en PHP HTTP_POST_VARS o HTTP_GET_VARS
|
alejandro | en aplicaciones que usan CGIs en C el uso de getenv()
|
alejandro | y así un largo etcetera, dependiendo del tipo de
aplicacion.
|
alejandro | Daros cuenta que tenemos un gran número de
patrones y un gran amplio número de lenguajes.
|
alejandro | En aplicaciones web, podemos usar desde Ruby on
Rails (RoR), Djwango, ModPerl, ModPython, Mason, etc.
|
alejandro | - Cross Site Scripting (XSS)
|
alejandro | Una vez que tenemos analizada la entrada de usuario,
pueden existir casos en los que se realice una inyección.
|
alejandro | Ese código puede ir inyectado directamente en código
HTML/JS.
|
alejandro | Muchos de estos casos son importantes identificarlos
ya que pueden provocar casos de fraude como phishing.
|
alejandro | http://es.wikipedia.org/wiki/Phishing
|
alejandro | Entre estos tipos de inyección, identificandolos en
código, veremos dos tipos diferentes.
|
alejandro | Casos directos que les llamaremos Direct XSS o DXSS.
|
alejandro | Y casos indirectos llamados Indirect XSS o IXSS.
|
alejandro | Como ejemplo podríamos tener en Java:
|
alejandro | <%=request.getParameter("username");%>
|
alejandro | esto es un caso directo que hace un echo del usuario
|
alejandro | Este caso no induce generalmente a falsos positivos y
es fácil de identificar.
|
alejandro | En este caso tendriamos que hacer la validación
directa, como en el caso de PHP usando htmlentities o usando funciones
de escape.
|
alejandro | Si tuvieramos el caso de un IXSS, ya seria por
consecuencia de lo explicado previamente.
|
alejandro | Se trataría de entrada de usuario recogida por el
programa y que luego se usa directamente en HTML:
|
alejandro | string username = request.getParameter("username");
|
alejandro | <%=username%>
|
alejandro | esto seria un caso tipico de IXSS
|
alejandro | naturalmente puede complicarse en la lógica del
programa
|
alejandro | o incluso mucho más cuando se usan modelos
basados en MVC.
|
alejandro | en los que se separa el código de la vista, por ejemplo
el uso de Struts en Java o el uso de codebehind en .NET
|
alejandro | + XSRF
|
alejandro | Otro tipo de vulnerabilidad Web común se llama XSRF
(Cross Site Request Forgery).
|
alejandro | Es una evolución de la vulnerabilidad anteriormente
comentada y se utiliza para modificacion de la lógica de la aplicación.
|
alejandro | Un ejemplo tipico seria el uso del cambio del precio de
un producto en una aplicación.
|
alejandro | El problema viene asociado también a la entrada de
usuario
|
alejandro | solo que es mas dificil de identificar, por lo que hay que
hacer un seguimiento y ver si la logica de la aplicacion
|
alejandro | hace una correcta validacion de los parametros de
entrada
|
alejandro | y comprueba su valor al realizar un pedido. (como en el
caso del producto)
|
alejandro | + SQL Injection
|
alejandro | Otro problema tipico de las aplicaciones web se deriva
del uso de backends como bases de datos.
|
alejandro | Las bases de datos no realizan ningun tipo de
validación, por lo que nos encontramos con riesgos de inyeccion en base
de datos.
|
alejandro | Provocando problemas como volcados de tablas,
cambios de privilegios, borrado de la base de datos, etc.
|
alejandro | Esta validación tiene que hacerse tanto en el código,
usando PreparedStatements
|
alejandro | como directamente en el código de la bbdd en el caso
de usar comandos SQL
|
alejandro | (xp_cmdshell, etc)
|
alejandro | Entre los tipos de SQL Injection, tendríamos también
el caso directo como indirecto.
|
alejandro | Los casos directos seria en .NET lo siguiente:
|
alejandro | String username = Request["username"];
|
alejandro | sql.AppendFormat ("SELECT {0} from users",
username);
|
alejandro | sql.ExecuteQuery();
|
alejandro | sorry, query.ExecuteQuery(sql);
|
alejandro | aqui directamente no estaríamos validando la consulta
SQL
|
alejandro | por lo que se recomienda usar PreparedStatements
|
alejandro | para realizar la validación
|
alejandro | + Campos hidden
|
alejandro | Otro tipo de código que puede representar un riesgo es
el uso de campos hidden.
|
alejandro | El uso de campos hidden puede usarse para enviar en
un formulario datos de usuario, contraseñas, especificar la dirección de
un correo, etc.
|
alejandro | Necesitariamos mirar en este caso información
sensible que pueda contener el formulario.
|
alejandro | Por ejemplo, si manda una direccion de correo en la
tipica página de contactar,
|
alejandro | podría permitir el uso de utilizar esa aplicacion para
mandar correos a cualquier dirección
|
alejandro | de forma anónima
|
alejandro | + Manejo de excepciones
|
alejandro | El tratamiento de excepciones en una aplicación
también es importante.
|
alejandro | Si en la entrada de usuario se estan recogiendo datos
de la aplicación como por ejemplo un entero,
|
alejandro | aunque no se pueda usar para realizar tipos de
inyección
|
alejandro | como los anteriormente comentados
|
alejandro | puede utilizarse para provocar excepciones
|
alejandro | por ejemplo, si usamos un entero y usamos mas de su
tamaño asignado en el lenguaje
|
alejandro | podemos provocar una excepcion en el servidor y ver
informacion sensible
|
alejandro | asi que todos los patrones usados anteriormente en
esos lenguajes
|
alejandro | tienen que identificarse para ver si se trata de un
problema
|
alejandro | int Value = Request["number"];
|
alejandro | <%=Value%>
|
alejandro | Si ponemos un Value=9999999, nos dará una
excepción
|
alejandro | si no hemos tratado en el bloque try {} catch la
excepcion
|
alejandro | + Datos de Sesion
|
alejandro | Segun cada lenguaje, la sesion puede utilizarse para
guardar valores.
|
alejandro | Estos valores pueden tambien ser utilizados como
inyeccion en caso de provenir de entrada de usuario.
|
alejandro | En el caso por ejemplo de Java, se pueden guardar
como atributos.
|
alejandro | con request.setAttribute(request.getParameter("data"));
|
alejandro | asi guardariamos datos de entrada de usuario
|
alejandro | como un atributo
|
alejandro | (faltaría el , data que seria el nombre del atributo)
|
alejandro | si luego hacemos request.getAttribute(data);
|
alejandro | tendriamos un caso de inyeccion si se pega en HTML/JS
|
alejandro | esto es igual en el objeto Session de .NET o en PHP.
|
alejandro | por lo que tenemos que tener mucho cuidado
|
alejandro | + Aplicaciones generales
|
alejandro | Bien, todos los problemas comentados se
corresponden en varios lenguajes a aplicaciones web.
|
alejandro | Generalmente cuando se hace una auditoria, es raro
encontrar una aplicacion que no sea vulnerable a este tipo de ataques.
|
alejandro | En algunos nuevos frameworks como Djwango o .NET
se consigue evitar facilmente.
|
alejandro | Debido a que se realiza la propia validacion por el
lenguaje.
|
alejandro | Sin embargo, en los otros lenguajes, tenemos riesgos
importantes a nivel de código.
|
alejandro | En las otras aplicaciones nos encontraremos otro tipo
de problemas.
|
alejandro | Como en consola/gráficas en C o C++, tenemos casos
de race conditions, heap overflows, buffer overflows, integer overflows o
format strings.
|
alejandro | Para identificar estos riesgos, es a veces complicado.
|
alejandro | Tenemos que buscar la entrada de usuario en algunos,
como declaraciones de tamaño de cadenas.
|
alejandro | En el caso de C, tendriamos que comprobar patrones
como strcpy(), gets(), etc.
|
alejandro | En el caso de format strings, no es del todo complicado,
tendriamos que verificar si se esta pasando el formato
|
alejandro | tipico: printf(cadena);
|
alejandro | para los race conditions, podriamos buscar si se hace
free() de una zona asignada varias veces..
|
alejandro | en el caso de los heap, buscar la zona reservada de
memoria
|
alejandro | + Minda
|
alejandro | Bueno, como se ha visto es dificil de identificar todos
los riesgos.
|
alejandro | De hecho para cada lenguaje existen muchisimos
patrones de entrada que pueden hacer susceptible nuestra aplicación.
|
alejandro | No se ha entrado en detalle en todos los lenguajes, solo
se ha hecho una pequeña introducción,
|
alejandro | debido a que en cada lenguaje es complicado saber
realmente como se identifica la entrada.
|
alejandro | Para ello, he desarrollado una aplicación que se llama
Minda.
|
alejandro | Minda es una aplicación para la auditoria de codigo
fuente.
|
alejandro | Funciona en varios lenguajes y es capaz de auditar
código en C, C++, Java, Php y .NET
|
alejandro | Esta elaborandose en progreso otros lenguajes como
Python o Perl.
|
alejandro | De estos lenguajes, aunque llevo trabajando cerca de
un año, hace falta realizar un análisis mucho más completo
|
alejandro | debido a que se necesitan muchos patrones diferentes.
|
alejandro | La aplicación tiene dos partes, que serían la vista y el
core del programa.
|
alejandro | El core tiene varios módulos, que serían el Finder
(buscador de ficheros), el Parser (ejecuta reglas por cada lenguaje), el
motor de relgas (que tiene reglas por cada lenguaje)
|
alejandro | el modulo de reportes (para generacion de informes)
|
alejandro | y las metricas (para el conteo estadistico de
vulnerabilidades)
|
alejandro | la vista luego sería la parte asociada a la interfaz
gráfica (hecha en Gtk#)
|
alejandro | y luego la linea de comandos (para ejecución en
consola)
|
alejandro | La aplicación aunque lleva cerca de un año de
desarrollo, todavia no he tenido tiempo de liberar la 0.1
|
alejandro | Es una aplicación que está avanzada en el análisis de
código y puede ayudar al programador o auditar a analizar código
|
alejandro | aunque el trabajo que hace internamente no es el de un
compilador
|
alejandro | puesto que necesitaba más una herramienta que me
ayudara a auditar código
|
alejandro | antes que un compilador por cada lenguaje, que luego
no sabria si hubiera llegado a funcionar
|
alejandro | y si hubiera resultado eficiente
|
alejandro | el trabajo de la herramienta ha sido reescrito varias
veces
|
alejandro | por lo que ha tenido mejoras y desmejoras en el
performance
|
alejandro | actualmente cuenta con un diseño muy modular, por lo
que seria muy sencillo registrar y añadir nuevas reglas
|
alejandro | para realizar el trabajo de auditoria en cada lenguaje
|
alejandro | está realizado el trabajo en C# usando Mono y funciona
en cualquier plataforma de las que antes comentó César
|
alejandro | es decir, GNU/Linux, Windows, MacOSX, Solaris o *BSD.
|
alejandro | Lo mismo para las arquitecturas.
|
alejandro | El análisis como he comentado se basa en la
comprobación de las firmas.
|
alejandro | Que sería el analizador sintactico, y luego una lógica
aplicada la parte semántica,
|
alejandro | para intentar reducir falsos positivos
|
alejandro | El proyecto se acaba de abrir a día de hoy dentro de la
forja de novell
|
alejandro | y se puede bajar via subversion
|
alejandro | se dispone tambien de una lista de correo para
desarrollo
|
alejandro | podeis mirar el proyecto minda en forge.novell.com
|
alejandro | o bien se esta empezando la parte de la web: en
http://minda.sf.net/
|
alejandro | Así que os invito a probar la herramienta, colaborar o
mandar parches.
|
alejandro | No se trata de una aplicación perfecta, por lo que he
comentado antes del trabajo que se debería de hacer con un compilador,
|
alejandro | pero ayuda realmente a analizar el código fuente de las
aplicaciones.
|
alejandro | Por lo que cualquier ayuda será bienvenida.
|
alejandro | Alguna pregunta?
|
MJesus | el proyecto minda en http://forge.novell.com ?
|
alejandro | Para cualquier pregunta, duda o aclaración, mi
dirección de correo es: asanchez@gnu.org
|
alejandro | Y en relación a Minda, la lista de desarrollo está en
forge.novell.com
|
alejandro | si, esta puesto ya el svn como anonimo, asi que
cualquiera puede bajarse el código fuente
|
alejandro | la aplicación está bajo la licencia GPLv2.
|
MJesus | aunque acepte cualquir lenguaje, cual es el de eleccion para Minda
?
|
alejandro | MJesus, principalmente empezo soportando Java y
.NET, por lo que son actualmente los lenguajes más maduros
|
MJesus | tu crees en el futuro de java ?
|
alejandro | por defecto, debería de ser Java, aunque es algo que
eliges tamibien en la aplicación en linea de comandos como en el GUI
|
alejandro | hay algunas capturas en: http://minda.sf.net
|
alejandro | si, Java todavia se sigue usando extensivamente,
aunque ultimamente parece que hay mucha tendencia por la plataforma de
.NET
MJesus, mientras existan moviles como los actuales,
existira java (eso como poco)
|
alejandro | por eso creo que es muy importante por ejemplo la
charla de antes de César
|
alejandro | como una alternativa a .NET :)
> ya van por los moviles de nueva generacion :)
|
fmaq | me imagino que el recien estar avanzando con lenguajes
como perl o python se debera a que la naturaleza dinamica en cuanto a los
datos ( no ser lenguajes tipeados, resulta en una complicacion adicional.
|
alejandro | si, resulta de una complejidad adicional, al igual que PHP
|
alejandro | pero es posible verificar problemas de seguridad, lo
unico que complica no saber realmente que estás guardando
|
alejandro | así que habra un trabajo mucho mas extensivo en el
caso del analisis
|
alejandro | a esto hay que sumarle todas las colecciones de datos
que proporciona cada lenguaje
|
fmaq | hay que tener muy en cuenta que los lenguajes scripting
tambien estan teniendo asenso en la web sobre todo.
|
alejandro | si, por eso el comienzo del soporte para RubyOnRails,
Python, Perl o PHP
|
alejandro | que estoy empezando a intentar tener soportados
|
fmaq | mis mejores deseos para la prosecucion del objetivo!!!!!!!
|
alejandro | luego vendra la complicacion de Web 2.0, aun asi quiero
tener tambien soporte en aplicaciones que no sean web
|
alejandro | muchas gracias fmaq
> mas preguntas ?
|
xtingray | gracias por tu charla alejandro
|
xtingray | :)
|
alejandro | a vosotros por tener una vez más la Unix Meeting
|
alejandro | :)
|
fmaq | me temo que a las complicaciones propias de cada lenguaje,
se suma un creciente desapego a las buenas practica??
|
alejandro | si, generalmente es un uso de malas practicas
|
alejandro | de que los desarrolladores no estan concienciados
|
fmaq | algo tendra que ver por alli lo de la filosofia RAD??
|
alejandro | a intentar resolver problemas de seguridad, por lo que siempre nos encontramos este tipo de problemas
|
alejandro | si, generalmente es no llevar a cabo en el propio ciclo de desarrollo el uso de buenas practicas
|
alejandro | si te fijas en el ciclo que marca OWASP quiere que se tengan en cuenta estas practicas
|
alejandro | y se intenten mitigar no solo una vez hecho el desarrollo, sino en todo el ciclo
|
fmaq | lo malo es que la gente solo juzga la cosas a travez de resultados rapidos, a veces demasiado rapidos!!!!!
|
alejandro | si, generalmente se quiere algo rapido y solo se mira la funcionalidad
|
alejandro | asi que a veces no es solo problema del desarrollador, pero si que necesita haber mas concienciacion
|
alejandro | el uso de funciones de validacion, prepared statements, etc, no es tan complicado si se lleva siempre a cabo
|
fmaq | y herramientas ni duda, porque la tendencia de ciclos rapidos no la para nadie.
|
fmaq | lo malo que es por el lado que se hace los ahorros de tiempo.!!
|
alejandro | si, tambien hacen falta más aplicaciones paramétricas, analisis de código, calidad, etc.
|
alejandro | pero lamentablemente un buen desarrollo en el ambito privado es complicado de encontrar
|
alejandro | bueno, espero que haya sido interesante, doy mi charla por acabada
|
alejandro | quien quiera colaborar, que no dude en mandarme un correo
|
alejandro | muchas gracias, buenas noches
|
fmaq | Gracias a Uds.!!!!!!!!
|
---|