Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

75
¿Cómo Consejos prácticos para crear aplicaciones seguras. programar aplicacion es seguras? Paulino Calderón Pale 2015

Transcript of Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Page 1: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

¿Cómo

Consejos prácticos para crear aplicaciones seguras.

programaraplicacionesseguras?

Paulino Calderón Pale 2015

Page 2: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

PaulinoCalderó[email protected]@calderpwn

Page 3: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Seguridad en softwareLos errores en software pueden llegar a ser muy costosos:

¿Qué tal los errores de seguridad?

Bug en software de sistema antibloqueo de frenos le costó a Toyota un aproximadamente 3 billones de dólares americanos. (2009).

Bug en software de trading le costó a Knight Capital Group Inc. cerca de 400 millones de dólares americanos.(2012).

Page 4: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Costo de un bug de seguridad en software

En etapa de diseño: En etapa de pruebas (QA):

En producción:

+$10000 USD para arriba

$1500 USD

Impacto al negocio

$100 USD

Page 5: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

• Es más rápido.• Es más barato. • No realizo ejercicios de revisión de

código.• Porque afecta la experiencia de

usuario.• No conozco de esos temas.• Tengo appliances de seguridad que

me protegen.• No tengo procesos que involucren

la seguridad.• Es más difícil …

¿Por qué hacemos

aplicaciones

inseguras?

Paulino Calderon
Porque es más rápido. (Solo así cumplimos con el deadline)Porque sale más barato. (La seguridad es cara)Porque nunca permito que otra persona revise mi codigo.Porque no conozco de esos temas.Porque somos humanos.
Page 6: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

El factor humano

“Think about how stupid the average person is, and then realize that half of them are stupider than that”

Page 7: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

El factor humanoHecho: Somos humanos, nos

equivocamos... frecuentemente.

NASA olvida convertir unidades y ocasiona que el Climate Orbiter se pierda en el espacio. (1998)

Recordemos brevemente eventos del pasado:

El error del doble gotofail de Apple que permite realizar ataques de MiTM a millones de usuarios. (2014)

Page 8: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Goto fail - Cortesía de Apple

Page 9: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

¿Qué tanto importa el lenguaje?

Realidad: Un programador sin conocimiento sobre programación segura SIEMPRE producirá código inseguro.

Page 10: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

¿Qué tanto importa el lenguaje?Existen mecanismos de seguridad implementados en lenguajes que deben considerarse en base a los requerimientos de cada proyecto:

● Type-safe object oriented programming

● Safe memory management● Safe object construction● Smart pointers/Safe

pointers● Entre otros...

Page 11: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

¿Es culpa del lenguaje?

Revisemos estadísticas de vulnerabilidades existentes en diferentes lenguajes de programación.

¿Qué nos dicen estos números?

Page 12: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

PHP: 406 vulnerabilidades entre 2000-2015

http://www.cvedetails.com/product/128/PHP-PHP.html?vendor_id=74

Page 13: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Ruby: 44 vulnerabilidades entre 2007-2014

http://www.cvedetails.com/product/12215/Ruby-lang-Ruby.html?vendor_id=7252

Page 14: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

ASP.NET: 10 vulnerabilidades entre 2003-2010

http://www.cvedetails.com/product/3091/Microsoft-Asp.net.html?vendor_id=26

Page 15: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

PHP: Tipos de vulnerabilidades

Page 16: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Ruby: Tipos de vulnerabilidades

Page 17: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

ASP.NET: Tipos de vulnerabilidades

Page 18: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

1. Muchos productos son una combinación de lenguajes y tecnologías.

2. Bases de datos como CVE no tienen registro de todas las vulnerabilidades.

3. A veces también los frameworks de desarrollo tienen vulnerabilidades.

4. Existen muchas más vulnerabilidades en implementaciones (no lenguaje).

Los números no necesariamente reflejan la realidad:

000101010111011100000011111101010101000001010101010101010101010100000001010101110111000000111111010101010000010101010101010101010101000000010101011101110000001111110101010100000101010101010101000010101011101110000001111110101010100000101010101010101010101010000000101010111011100000011111101010101

¿Importa el lenguaje de

programación?

000101010111011100000011111101010101000001010101010101010101010100000001010101110111000000111111010101010000010101010101010101010101000000010101011101110000001111110101010100000101010101010101010101010000000101010111011100000011111

Page 19: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Seguridad en software web y movilExisten controles de seguridad que hacen más robustas a nuestras aplicaciones:

• Autenticación• Autorización• Manejo de sesiones• Validación de datos• Auditoría y bitácoras• Criptografía• Ambiente de desarrollo• Canales de comunicación• Almacenamiento seguro

¿En qué nos estamos equivocando?

Page 20: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Creemos todo lo que leemos en internet

Page 21: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 22: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 23: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

No confíes en extraños

(*) http://www.websec.mx/blog/ver/inseguridad-datos-sesion-codeigniter

● Malos consejos de seguridad hasta en sitios oficiales de proyectos.

● Un ejemplo, el popular framework Codeigniter distribuye la siguiente configuración por default. >>

Page 24: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 25: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 26: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 27: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Buenas prácticas

Siempre revisen lo que instalan.

No confien en configuraciones default.

Hashes de verificación de integridad de archivos críticos de la aplicación.Algún HIDS, solución casera en Bash, tripwire, etc.

No sigan guías sin cuestionar las prácticas de seguridad.

Page 28: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Implementar mecanismos de autenticación o autorización es

complicado

Page 29: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 30: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 31: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Utilizar frameworks no garantiza

seguridad

Existen muchas implementaciones inseguras. De nuevo no es el framework, es la

implementación.

● oAuth es un framework de autorización.

● OpenID es un framework de autenticación.

Page 32: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Utilizar frameworks no garantiza

seguridad

La vulnerabilidad Cover Rdirect está clasificada

como wontfix en muchos sitios.

Page 33: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

¿Como es una buena

implementación?

Una buena implementación de autenticación y autorización:● Registra todas las actividades de

los usuarios sin revelar información privada.

● Verifica el origen, validez y expiración de sesiones.

● Genera alertas en caso de actividad sospechosa (Cuenta bloqueada por superar intentos de inicio de sesión, etc.).

● Tiene mecanismo de protección contra ataques de fuerza bruta.

● 2 factor auth (Si es requerida).● Autoriza el acceso a cada

recurso solicitado.

Page 34: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

No aprendemos a validar datos

Page 35: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Validación de datos

Page 36: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Todos sabemos que debemos validar datos y sin embargo las

mismas vulnerabilidades siguen existiendo.

Validación de datos

La regla es muy simple:NO CONFIEN EN NINGÚN DATO DE

ENTRADA MANIPULABLE

Page 37: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

● No usen listas negras. ● Usen los mecanismos de validación

disponibles en los frameworks pero no dependan de ellos completamente.

● Prueben sus expresiones regulares.● Monitoreen todos los puntos de entrada

Buenas prácticas

Page 38: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 39: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

[20/01/2015 01:00:05] Fallo de inicio de sesion con usuario ‘admin’ y password ‘Administrad0r20’[20/01/2015 01:00:09] Fallo de inicio de sesion con usuario ‘admin’ y password ‘Administrad0r201’[20/01/2015 01:00:15] Inicio de sesion exitosa de usuario ‘admin’

Guardamos información

de más

+

Page 40: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

O no guardamos

nada

[20/01/2015 04:00:05] La aplicación tuvo un error. Origen de conexión: 127.0.0.1[20/01/2015 04:00:09] La aplicación tuvo un error. Origen de conexión: 127.0.0.1[20/01/2015 04:00:15] La aplicación tuvo un error. Origen de conexión: 127.0.0.1

Page 41: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

(IN)seguridad en bitácoras

Muchas veces los desarrolladores no piensan en los riesgos:

● Cualquier aplicación puede acceder a las bitácoras del sistema Logcat (Android).

● Bitácoras comprometidas a través de vulnerabilidades en aplicaciones web.

Aplicaciones móviles y web revelan información sensible en bitácoras:

● URLs de servicios, endpoints, APIs, etc.

● Credenciales de acceso a servicio.

● Nombres de variables de datos de entrada.

● Datos de usuario.● Trazas de error.

Page 42: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

• Almacenar las bitácoras en otro dispositivo diferente de donde se corre la aplicación.

• Almacenar la información mínima necesaria para diagnosticar un problema. Incluir funcionalidad para generar trazas más completas.

• Comprobar que las bitácoras están siendo registradas correctamente.

• Desarrollar agente que envíe la información al corelacionador de bitácoras de la empresa (Si lo tienen).

Buenas prácticas

Page 43: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

CryptoLa criptografía es difícil.

Si no han estudiado el tema, ¡No escriban sus propias funciones criptográficas!

Dejen ese trabajo a los EXPERTOS.

Page 44: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Sony’s ECDSA code

Page 45: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Volviendo brevemente al tema de confiar en extraños...

Page 46: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 47: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 48: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Lo que sí debe saber un desarrollador sobre criptografía como mínimo

● Diferencia entre criptografía asimetrica y simetrica.

● Diferencia entre métodos de cifrado.● Uso de políticas seguras para contraseñas y

passphrases. ● Estándares modernos de criptografía. www.keylength.com● Conocer las librerías robustas de criptografía

disponibles para su ambiente de desarrollo.

Page 49: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Hecho: La mayoría de aplicaciones inseguras no realizaron ejercicios de revisión de código fuente.

Page 50: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Software Testing

Tenemos hasta un día internacional dedicado al debugging...Literalmente encontraron un bicho pegado a la hoja de un programa.

Premio: ¿Qué fecha es el día internacional de debugging?

Page 51: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Programas bug bounty

Page 52: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Programas donde se ofrecen recompensas por encontrar bugs de seguridad.

Algunas empresas que han implementado este programa exitosamente:● Google● Facebook● Microsoft ● Otros muy interesantes como Internet Bug Bounty (https://internetbugbounty.org) dan recompensa por encontrar bugs en productos como Apache, Ruby, Python, PHP, entre otros).

Programas bug bounty

¿Podrían implementarlo en su empresa o lugar de trabajo?

Page 53: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Software testing

Unit testing aunque sea muy tedioso es una herramienta

invaluable para construir software seguro.

Necesitamos integrar a nuestro SDLC ejercicios de análisis estático y dinámico

Page 54: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Integration testing

Si automatizamos los procesos de ‘integration testing’ lograremos detectar muchos problemas.

Por ejemplo Jenkins puede ser utilizado en proyectos hechos en Java, ASP.NET, Perl y Python.

Page 55: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Softwarefuzzing

Automatizar pruebas al software con datos de entrada aleatorios y mal formados. El objetivo es analizar el comportamiento de la aplicación bajo diferentes datos de entrada mal formados.

Algunos fuzzers públicos:● spike● antiparser● Afl● Sulley● Melkor

!Para mejores resultados construyan los suyos!

Page 56: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Herramientas de análisis estático de código● Veracode● Source Code Analysis de

HP/Fortify● PVS-Studio● Security Advisor (Coverity)● Checkmarx● CLANG (C/C++/Obj-C)● Brakeman (Ruby)● Infer (Java, Obj-C)

Page 57: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Clang

Analizador estático de código para C/C++/Obj-C

● Encontrando heartbleed con Clang:http://blog.trailofbits.com/2014/04/27/using-static-analysis-and-clang-to-find-heartbleed/

Otros proyectos interesantes basados en Clang:● Xsecurityhttps://github.com/XSecurity/XsecurityIntegración con Xcode para detectar vulnerabilidades en aplicaciones iOS.● Inferhttps://github.com/facebook/inferAnalizador estatico de código para aplicaciones mobiles Android e iOS.

Page 58: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 59: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Infer

Analizador estático de código desarrollado por Facebook para Java,

C y Obj-C.

Descarga: https://github.com/facebook/infer

Page 60: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Infer

Page 61: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale
Page 62: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Grep para analizar

códigoGrep es nuestro amigo. Por ejemplo podríamos

utilizar algo como:

$grep –R –n –A3 –B3 –i ’$_GET\|$_POST’ .

En ambientes Windows: File Locator Lite

Page 63: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Análisis de código gratis

Websec tiene una base de datos con listas de nombres de funciones ‘peligrosas’ divididas por lenguaje de

programación (JAVA, RUBY, PHP, Python)

InsecureProgrammingDB https://github.com/cldrn/InsecureProgrammingDB

Page 64: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Adversidades para analizadores de código

● Metaprogramming puede complicar el proceso de auditoría de código fuente..

● Diferencias entre lenguajes de programación

Page 65: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Otras herramientas

● Navegadores de código fuente.● Seguridad de binarios

Ya hablamos de herramientas, pero ¿qué tal los procesos?

Page 66: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

¿Por qué hacemos

aplicaciones inseguras?

La ausencia de procesos de negocio que respalden la seguridad siempre llevará a la creación de código inseguro.

La seguridad debe ser planeada desde el principio e integrada en la arquitectura de la aplicación.

Page 67: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Thread modeling

Método para analizar la seguridad de una aplicación que permite identificar, evaluar y mitigar los riesgos relacionados con la aplicación.

Page 68: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Retos al realizar

thread modeling

● No se conocen a fondo los procesos involucrados.

● No se conocen los riesgos.● Difícil asignar importancia si

se desconoce el nivel de explotación requerido.

Page 69: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Thread modeling en tu organización

1. Entiende tu aplicación.2. Identifica las amenazas.3. Desarrolla las medidas de

protección y mitigaciones.

Page 70: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Seguridad en el ciclo de vida de desarrollo de software● Evaluar el riesgo de nuevas aplicaciones.● Investigar requerimientos necesarios para tratar la

información según su sensibilidad.● Elaborar una guía de buenas prácticas a las que

todos deben apegarse.● Periódicamente evalúa y actualiza esa guía de

buenas prácticas.● Entrena a los programadores a tomar talleres técnicos

de programación segura en el entorno de trabajo.● Incluye aspectos de seguridad en evaluaciones de

QA.

Page 71: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Seguridad en el ciclo de vida de desarrollo de software

Herramientas pueden ayudar pero necesitan a una persona con conocimientos en seguridad informática en el equipo para validación.

Es importante no usar solo una herramienta.

Page 72: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

REQUERIMIENTOS:Documentar/Identificar los requerimientos de seguridad del proyecto.Análisis de riesgo.

DISEÑO:Thread modeling.

DESARROLLO:Implementar mejores prácticas.Análisis estático de código.

TESTING:Análisis dinámico de la aplicación.Fuzzing.Análisis de vulnerabilidades.

DEPLOYMENT:Revisión de configuración de seguridad de aplicación y servidor.

Page 73: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Seguridad en el

entorno de desarrollo

La seguridad comienza desde nuestras casas. Es decir, nuestros ambientes de desarrollo.

Auditando las llaves públicas de todos los usuarios de Github:https://blog.benjojo.co.uk/post/auditing-github-users-keys

Page 74: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

¿Qué aprendimos hoy?

Si quieren crear aplicaciones seguras deben:● No confien en extraños.● No confien en ningún dato de entrada manipulable. ● No confien en frameworks ciegamente. ● No implementen sus propias funciones de criptografía (A menos

que sean expertos en crypto).● Inviertan en entrenamiento sobre programación segura.● Almacenen sus bitácoras de forma segura. ● Verifiquen su sistema de autenticación y autorización.● Realicen ejercicios de auditoría de código. ● Consideren a la seguridad en su ciclo de desarrollo de software.● Consideren implementar un programa de recompensa por

reportar bugs.● No usen una sola herramienta.

Page 75: Dragonjarcon2015 - ¿Cómo programar aplicaciones seguras? por Paulino Calderon Pale

Paulino Calderón [email protected] @calderpwn

¡Gracias!