Programación Segura

Este será el nuevo apartado de La Comunidad DragonJAR, que entrará a acompañar de manera paralela los Laboratorios Hacking: Técnicas y contramedidas.

En las publicaciones pretendo resumir los puntos más importantes que deben ser tenidos en cuenta en las diferentes fases de la programación de software orientado a la seguridad.
Estos puntos no son más que los analizados en el Libro “19 Deadly Sins of Software Security (Security One-off)“, el cual puede ser adquirido en el mismo enlace mediante La librería electrónica Amazon.

Trataré de abarcar todos y cada uno de los 19 puntos del libro, además de ofrecer otros recursos relacionados con el tema.
Para comenzar citaré una definición del concepto Programación Segura (Wikipedia), seguido del contenido temático del seriado que he decido crear y nombrar como “Programación segura: Seguridad de Software”, para luego finalizar con la introducción del concepto y del nuevo apartado del Blog.

La programación segura es una rama de la programación que estudia la seguridad del código fuente de un software cuyo objetivo es encontrar y solucionar los errores de software, esto incluye: Utilización de funciones seguras para proteger de desbordamientos de pila, declaración segura de estructuras de datos, control del trabajo con el flujo de datos, análisis profundo de otros errores de software mediante testeos del software en ejecución y creación de parches para los mismos, diseño de parches heurísticos y metaheurísticos para proveer un cierto grado de seguridad proactiva, utilización de criptografía y otros métodos para evitar que el software sea crackeado.

Windows, Unix, Linux, Mac OS X, C, C++, C#, Java, PHP, Perl, Visual Basic, Web y Bases de datos, entre otros, serán los lenguajes, sistemas y plataformas a cubrir en este seriado.

Contenido temático:

  • Desbordamientos de enteros.
  • Injección de código SQL.
  • Injección de secuencia de comandos.
  • Fallas en el manejo de errores.
  • Creación de scripts de sitios cruzados.
  • Fallas en la protección del tráfico de red.
  • Uso de URL mágicos y formularios ocultos.
  • Uso de sistemas de contraseña débiles.
  • Uso inapropiado de SSL.
  • Fallas al almacenar y proteger datos de manera segura.
  • Fugas de información.
  • Resolución confiable de dirección de red.
  • Acceso inapropiado a archivos.
  • Condiciones de carrera.
  • Intercambio de clave no autenticado.
  • Falla al usar números aleatorios criptográficamente fuertes.
  • Escasa usabilidad.

____________________________________________

Introducción

La teoría de la computación se basa en la premisa de que las máquinas son determinísticas. Por lo general esperamos que las computadoras se comporten de la manera en que las hemos instruido. En realiadad dependemos de que el software sea un intermediario para nuestras intenciones. Las computadoras modernas de propósito general y su software se han vuelto tan complejos que por lo general hay capas sobre capas de software entre nuestros clics de ratón y el resultado que esperamos ver. Para desencadenarel poder de nuestras plataformas de cómputo dependemos de que sean correctas todas esas capas que viven entre nuestras intenciones y el puro metal.

En cualquier lugar de esas capas de software puede haver errores, donde el software no hace lo que los autores querían, o por lo menos no lo que el operador de la computadora desea hacer. Esos errores introducen a una cierta cantidad de interminismo en nuestros sistemas, a menudo con importantes implicaciones para la seguridad. Estas fallas se manifiestan desde algo tan simple como una caída del sistema que puede usarse en un ataque de negación de servicio hasta un sobre flujo de búfer que deja que los chicos malos ejecuten el código que dicen en lugar del código de la aplicación.

Siempre cuando tengamos indeterminismo en nuestros sistemas de software debido a errores, nuestros mejores conceptos sobre la manera de proteger nuestros sistemas sólo pueden considerarse con nuestras mejoras suposiciones. Podemos lanzar Firewalls, poner en el lugar tecnologías en el nivel de sistema operativo para probar y frustrar sobre flujos de búfer, y por lo general, seguir aplicando cinta adhesiva, pero no vamos a cambiar de esta manera el paradigma fundamental de la seguridad. Sólo mejorando la calidad de nuestros otros por ir reduciendo el número de fallas es como podemos esperar tener éxito en nuestros esfuerzos relacionados con la seguridad.

La eliminación de todo los riesgos de seguridad en nuestro software no es un objetivo realista en los entornos de desarrollo que hoy en día. En tantos aspectos en el desarrollo de software pueden salir mal desde el punto de vista de la seguridad, que se requiere más que un trabajo de tiempo completo para permanecer al tanto de todo, sin dominarlo por completo.