Post on 12-Jul-2015
Ley de Murphy
"Si hay varias maneras de hacer una tarea, y uno
de estos caminos conduce al desastre, entonces
alguien utilizará ese camino.”
«Si algo puede salir mal, saldrá mal»
Se tiende a recordar más vívidamente las vecesen que cayó con el lado de la mantequilla haciael suelo puesto que tiene mas consecuencias
Por lo tanto, se tiene la impresión de que el pansiempre cae con la mantequilla hacia abajo, sinimportar la verdadera probabilidad de cadaocurrencia.
Joselin Rivero
Origen
• La auténtica ley de Murphy, originó unatécnica de diseño llamada DiseñoDefensivo
• Busca prever soluciones para evitarfallos en la utilización de un dispositivoque puedan llevar a un resultadoinesperado.
• En la actualidad, vemos ejemplos dediseños realizados teniéndola en cuenta:Un cable USB, HDMI, SCART...
• Están diseñados para que sólo puedaconectarse de forma correcta Programación Defensiva
Informática
Diseño Defensivo
Ley de Murphy
Joselin Rivero
Programación Defensiva
Proyecto que solicitaba la ubicación del usuariopara su localización en un mapa.
Se decidió utilizar los campos "país" y"población", pero al poco tiempo se detectoque algunos usuarios confundían población connúmero de habitantes si se situaba junto a país.Para ese momento, ya habían varios usuariosregistrados de los cuáles no se sabía supoblación.
El problema se soluciono cambiando la palabra"población" por "localidad" en el formulario.
Pero era evitable si se hubiese tenido más encuenta la programación defensiva validandomejor los campos del formulario.
Joselin Rivero
¿Qué es?
• Prevé y Busca soluciones quepuedan evitar fallos en eldiseño de un software
• Garantiza el funcionamientoesperado de algún elemento dela aplicación ante cualquiersituación que puedaaparecer, por muy extraño quesea.
Joselin Rivero
Utilidad
Hacer que el software se comporte de una manera predecibleEl software se comporte de una manera predecible pese a entradas o acciones de usuario inesperadas
Hacer el código fuente comprensible
El código fuente debe ser lo mas legible y entendible, a prueba de una auditoría de código.
Ofrecer Calidad General
Reducir el número de fallos de software y problemas.
Es un enfoque que busca mejorar el software y el código fuente
Hacerlo mas estable, menos robusto y lo menos complejo posible
Se utiliza especialmente en componentes críticos con muy mal funcionamiento
Elimina los graves daños de consecuencias catastróficas que podría acarrear un descuido propio ó un ataque malicioso
Objetivos – Problemas que Resuelve
Joselin Rivero
Desarrollo del Software
Análisis
Diseño
ConstrucciónPruebas
Instalación
Utilidad
Apunta a resolver problemas asociados con la calidad
del software en todas sus fases
Reinaldo Blondell
SANS
• El Instituto SANS (SysAdmin Audit, Networking and SecurityInstitute)
• Agrupa a más de 165.000 profesionales de la seguridadinformática (consultores, administradores de sistemas, entesgubernamentales, etc.)
• Reunir información sobre todo lo referente a seguridadinformática (sistemas operativos, redes, aplicaciones, etc.)
• Ofrecer capacitación y certificación en el ámbito de la seguridadinformática
• Referencia habitual en la prensa sobre temas de auditoríainformática
Reinaldo Blondell
¿Por qué?
• Según SANS, la primera de las 10 peores vulnerabilidades que hay es:
• ISO 27001
NO VERIFICACION de los parámetros de ENTRADA y SALIDA de las funciones de nuestros programas
12.2.1: El insumo de data en las aplicaciones debe ser validado para
asegurar que esta data sea correcta y apropiada.
12.2.2, 12.2.3 y 12.2.4: Que no hayan errores, integridad y validar
output.
Reinaldo Blondell
¿Qué es una Vulnerabilidad?
Es cualquier defecto en el mismo que permita explotarlo con el finde que un atacante pueda hacerse con el control del sistema
Pueden deberse a:
– Una mala configuración del software por parte del administrador/usuario.
– Una incorrecta programación durante el proceso de desarrollo o actualización delsoftware.
La gran mayoría hoy en día se deben al segundo caso ya que:
– Existe bastante documentación de usuario para configurar el software.
– Desconocimiento de seguridad informática en la mayoría de programadores.
– Empresarios que interrumpen los ciclos de desarrollo del software para terminarantes los productos.
– Las auditorías de seguridad de código fuente apenas se practican.
Reinaldo Blondell
Vulnerabilidades y Puntos Críticos más comunes al crear aplicaciones
Interacción insegura entre componentes
•Relacionadas con el envío y recepción de datos entresistemas, componentes, módulos, programas, procesos ohilos separados.
Manejo de recursos
•Relacionadas con el manejos inapropiados durante lacreación, uso, transferencia o destrucción de recursos delsistema.
Defensas porosas
•Relacionadas con técnicas defensivas mal o abusivamenteutilizadas, o simplemente ignoradas.
Grupo de Vulnerabilidades mas importantes en la actualidad según SANS:
Reinaldo Blondell
Vulnerabilidades y Puntos Críticos
Entre las 25 mas importantes existentes en la actualidad tenemos comoreferencia las siguientes:
• Defectos o fallas en la preservación de la estructura de las consultasSQL (SQL-injection).
• Fallas en la preservación de la estructura de las páginas web ( Cross-site Scripting)
• Control externo del estado de la aplicación (por ejemplo al utilizarcookies para mantener el estado).
• Inicialización defectuosa.
• Uso de un algoritmo criptográfico quebrado (obsoleto).
• Contraseñas establecidas en el código (hard-coded).
Franyelvis Colmenares
Ejemplo
Ejemplo
Vulnerabilidad Inyección SQL (SQL Injection)
Efectos • Sucede cuando se inserta o "inyecta" un código SQL "invasor"dentro de otro código SQL para alterar su funcionamientonormal, y hacer que se ejecute maliciosamente el código"invasor" en la base de datos.
• Puede suceder tanto en programas ejecutándoseen computadoras de escritorio, como en páginas web, ya queéstas pueden funcionar mediante programas ejecutándose enel servidor que las aloja
Lenguajes que aplica
SQL (sentencias de SQL)
Franyelvis Colmenares
Ejemplo
Asumir que el siguiente código está enuna aplicación web y que existe unparámetro "nombreUsuario"
Si el usuario escribe su "Alicia”, la aplicacióngenerara una sentencia SQL correcta similara la siguiente, donde se seleccionaría alusuario "Alicia“:
Pero si un usuario malintencionado escribecomo nombre de usuario
Se generaría la siguiente consulta SQL
La base de datos ejecutaría la consulta enorden, seleccionaría el usuario'Alicia', borraría la tabla 'usuarios' yseleccionaría datos que quizá no estándisponibles para los usuarios web comunes
Franyelvis Colmenares
Cómo evitar el Sql Injection
¿CÓMO EVITAR EL SQL INJECTION?
Asignación de
mínimos privilegios
La cuenta debe tener sólo privilegios que ésta necesita, ni más ni menos.
Validar
todas las entradas
Si en un campo de texto sólo se puede ingresar un tipo de dato, pues valide la
entrada para tal efecto y especifique la longitud de caracteres a ingresar
Empleo de
procedimientos almacenados
Utilizar procedimientos almacenados y aceptar los datos del usuario comoparámetros en lugar de instrucciones SQL.
Utilizar comillas
dobles en vez de las simples
En el archivo que procesa los datos de entrada del usuario remplazamos lascomillas simples por comillas dobles, impidiendo inyecciones SQL
Franyelvis Colmenares
Políticas de Programación
• La primera cosa que se debe hacer es redactar una política de programación, que contenga:– Las cosas que NO se deben hacer– La existencia de patrones– El know-how de la empresa o grupo de desarrolladores– Explícitamente indicar la suma importancia del
seguimiento de las reglas– Complejidad ciclomática
• Técnicamente, se puede cumplir con estas reglas– Logging (log4net, log4j)– Peer review (revisión de pares)– Try / catch
Franyelvis Colmenares
Logging
• Aproximadamente un 4% del código debe estar destinado aoperaciones de logging (McConnell)
• Muy difícil enseñar a hacer buen logging, tiempo deaprendizaje aprox. 1 año.
• Mejor herramienta de logging: log4j / log4net:http://logging.apache.org
• Cada vez que ocurre una falla en el programa, podemos estarenterados por correo!!
José Barrios
Ejemplo Logging (log4net)
protected void Logon_Click(object sender, EventArgs e)
{
log.Info("Trata de autenticarse: " + UserEmail.Text +
"/********");
if (verificar(UserEmail.Text, UserPass.Text))
{
log.Info("Usuario autenticado");
… // redirección o a Inicio
}
else
{
log.Error("Usuario " + UserEmail.Text + "/" + UserPass.Text + "
incorrectos");
Msg.Text = "Nombre o Clave de Usuario son inválidos, o el
usuario ha sido dado de baja";
}
}
José Barrios
Mejores Prácticas
Mejores Prácticas
Reducir complejidad del código fuente
Nunca hacer el código más complejo que lo necesario
Revisiones del código fuente
Que alguien diferente al autor original realice una auditoría decódigo
Pruebas de software
Las pruebas de software deberán ser para tanto que el softwaretrabaje como debe, como cuando se supone que pase si serealice deliberadamente malas entradas
Reutilización inteligente del código fuente
Capturar beneficios de un bien escrito y bien probado códigofuente, en vez de crear bugs innecesarios. Aunque no siempre esla mejor manera de progresar, particularmente cuando la lógicadel negocio esta involucrada.
José Barrios
Recomendaciones
Evitar los Errores clásicos de la Programación
Error Área Descripción
Personas Motivación Débil Tiene mayor efecto sobre la productividad y la calidadque ningún otro factor
Procesos Procesos Inadecuados
Proyectos acelerados generan un diseñoindeterminado, insuficiente tiempo y alta presión
Recursos Desarrolladores Meticulosos
El esfuerzo requerido para diseñar, implementar,probar y documentar nuevas tecnologías innecesariasalargan el plan significativamente
Tecnologías Cambiar de Herramientas a Mitad del Proyecto
Raramente funciona y ante ese escenario, cuandoestamos a la mitad de un proyecto, los inevitableserrores cometidos, normalmente anulan cualquierbeneficio.
José Barrios