El problema del software inseguro es uno de los desafíos más importantes de la actualidad y para el cual los profesionales del rubro deben estar preparados.

Para eso, la Fundación OWASP (sin fines de lucro) trabaja para mejorar la seguridad de las aplicaciones web a través de una comunidad y de recursos gratuitos y fácilmente accesibles desde su página web. Entre los muchos recursos que ofrece, es reconocida por su proyecto más conocido "OWASP Top 10"

El Proyecto OWASP Top 10 es una iniciativa que identifica y destaca las diez principales vulnerabilidades de seguridad más críticas en aplicaciones web y sirve como guía esencial para desarrolladores y profesionales de seguridad. La misma se actualiza cada cierta cantidad de años, siendo la última actualización del 2021 pero aún vigente.

Las vulnerabilidades incluidas en el OWASP Top 10 representan riesgos que pueden ser explotados por atacantes para comprometer la seguridad de una aplicación web.

Web Goat

WebGoat es un proyecto de OWASP diseñado específicamente para enseñar a desarrolladores y profesionales de seguridad sobre las vulnerabilidades comunes en aplicaciones web y cómo abordarlas. Es una aplicación web deliberadamente insegura, lo que significa que contiene intencionadamente fallas de seguridad que los usuarios pueden explotar con fines educativos.

WebGoat contiene una serie de lecciones interactivas y desafíos que los usuarios pueden explorar y así comprender las vulnerabilidades de seguridad comunes. Cada lección se centra en una vulnerabilidad específica.

Se puede acceder a WebGoat desde su sitio oficial OWASP WebGoat | OWASP Foundation

Asimismo, se puede utilizar webgoat a partir de Docker: webgoat/webgoat - Docker Image | Docker Hub

Vulnerabilidades destacadas por OWASP:

A continuación, te detallamos las vulnerabilidades más críticas destacadas en el top10 de OWASP, sus características y formas de mitigacion:

1. Broken Access Control:

Sucede cuando un sistema no implementa de manera efectiva las restricciones de acceso, lo que permite a usuarios no autorizados realizar acciones o acceder a recursos que deberían estar limitados solo a usuarios específicos. Esto implica fallas en la implementación de controles para gestionar quién tiene acceso a qué recursos y qué acciones pueden realizar.

Las vulnerabilidades comunes que se podrían mencionar:

  • Violación del principio de menor privilegio o denegación por defecto, donde el acceso solo debería otorgarse para competencias, roles o usuarios particulares, pero está disponible para cualquiera.
  • Eludir controles de acceso modificando la URL, estado interno de la aplicación o la página HTML, o mediante el uso de una herramienta de ataque que modifica las solicitudes de API.
  • Permitir ver o editar la cuenta de otra persona, proporcionando su id único.
  • Acceso a API con controles de acceso faltantes para POST, PUT y DELETE.
  • Actuar como un usuario sin haber iniciado sesión, o actuar como un administrador cuando se ha iniciado sesión como usuario.

Características:

  • Autenticación Ineficaz: comúnmente se relaciona con problemas en los procesos de autenticación, como la falta de verificación adecuada de credenciales o la manipulación de sesiones.
  • Privilegios no controlados: Los usuarios pueden obtener acceso no autorizado a funciones o datos sensibles si no se aplican de manera adecuada los controles de autorización.

Ejemplo:

Un atacante descubre que la URL de perfil de usuario en una aplicación web está construida de esta manera `https://estoesunejemplo.com/perfil/{id}`. Si la aplicación no verifica correctamente la autorización, el atacante podría cambiar el ID en la URL para acceder a perfiles de otros usuarios.

Formas de Mitigación:

  • Asignar los privilegios mínimos necesarios para que los usuarios realicen sus funciones.
  • Todas las acciones y los recursos deben ser verificados en el servidor para asegurarse de que el usuario tiene los permisos adecuados antes de procesar la solicitud.
  • Utilizar un sistema de roles para asegurar que los usuarios solo tengan acceso a las funciones y datos que sean coherentes con sus roles específicos.

2. Fallas Criptográficas

Se da cuando la implementación de técnicas criptográficas es defectuosa o insuficiente, lo que compromete la integridad y confidencialidad de los datos.

Características:

  • El uso de algoritmos criptográficos débiles o desactualizados puede exponer datos sensibles a ciberataques de fuerza bruta o a técnicas más avanzadas.
  • Claves débiles o mal Administradas
  • La generación de números aleatorios es esencial para muchos algoritmos criptográficos. Si los números no son verdaderamente aleatorios, los ataques pueden predecir patrones y comprometer la seguridad.

Ejemplo

Una aplicación web utiliza un algoritmo de hash obsoleto, como MD5, para contraseñas. Estos algoritmos son conocidos por ser vulnerables a ataques de colisión, lo que comprometería la seguridad de las contraseñas almacenadas.

Mitigación:

  • Usar Algoritmos Criptográficos fuertes, actualizados y seguros.
  • Guardar las claves de manera segura, utilizar servicios de administración de claves y contraseñas, y cambiar las claves periódicamente para limitar la exposición en caso de una brecha.
  • Utilizar fuentes de entropía confiables para generar números aleatorios y seguir mejores prácticas para garantizar la aleatoriedad.

3. Inyección SQL:

Puede suceder cuando los datos proporcionados por el usuario no se validan o filtran adecuadamente antes de incorporarse en instrucciones de tipo SQL.

Esto podría permitir que un ciberatacante inyecte código malicioso, comprometiendo la seguridad de la aplicación y accediendo, manipulando o eliminando datos en la base de datos.

Características:

  • Ocurre cuando la entrada del usuario no se valida correctamente antes de ser utilizada en consultas SQL.
  • Los atacantes pueden manipular las consultas SQL para obtener acceso no autorizado a datos, realizar modificaciones no permitidas o incluso ejecutar comandos.

Ejemplo:

Autenticación Bypass: En caso de un formulario de inicio de sesión que toma el nombre de usuario y la contraseña para verificar las credenciales en una consulta SQL. Un atacante podría ingresar `' OR '1'='1' --` como contraseña, lo que podría hacer que la consulta sea siempre verdadera, ignorando la autenticación.

Mitigación:

  • Utilizar consultas parametrizadas o "prepared statements" para asegurar que los datos del usuario no se mezclen directamente con el código SQL.
  • Permitir solo caracteres y patrones específicos en las entradas del usuario (White lists).
  • Validar y filtrar estrictamente todos los logs del usuario para evitar la introducción de caracteres maliciosos.

4. Diseño Inseguro

Diseño inseguro es una categoría amplia que representa diferentes debilidades.

Uno de los factores que contribuyen al diseño inseguro es la falta de perfilado de riesgos comerciales inherentes al software o sistema que se está desarrollando, y por lo tanto la falta de determinar qué nivel de diseño de seguridad se requiere.

Se refiere a la presencia de debilidades fundamentales en la arquitectura y diseño de un sistema.

Características:

  • Diseño que permite flujos de datos no seguros entre componentes del sistema, lo que podría facilitar la exposición o manipulación de datos sensibles.
  • Falta de una clara separación de responsabilidades entre los distintos módulos o capas del sistema, lo que podría conducir a riesgos de seguridad.

Ejemplo:

Un sistema que solo contempla una buena seguridad implementada del lado del cliente, como la validación de datos en JavaScript, sin validar adecuadamente en el servidor, lo que podría permitir ataques de manipulación de datos.

Mitigación:

  • Realizar análisis de amenazas y modelado durante la fase de diseño para identificar posibles riesgos de seguridad.
  • Establecer una clara separación de responsabilidades entre los componentes del sistema, evitando que un componente tenga acceso no restringido a otros.
  • Implementar cifrado para datos sensibles almacenados en la base de datos y durante la transmisión para proteger la confidencialidad de la información.

5. Security Misconfiguration

Refiere a la presencia de configuraciones defectuosas o inseguras en una aplicación web.

Surge generalmente cuando los desarrolladores no aplican configuraciones seguras predeterminadas o no realizan ajustes adecuados en la configuración del sistema.

Características:

  • Falta endurecimiento de seguridad apropiado en cualquier parte del stack de la aplicación o permisos mal configurados en los servicios en la nube.
  • A veces se habilitan o instalan características innecesarias (por ejemplo, puertos, servicios, páginas, cuentas o privilegios innecesarios).
  • Las cuentas predeterminadas y sus contraseñas siguen habilitadas y sin cambios.
  • El manejo de errores revela cuestiones de stack u otros mensajes de error demasiado informativos.
  • La configuración de seguridad en los servidores de aplicaciones, frameworks de aplicaciones (por ejemplo, Struts, Spring, ASP.NET), bibliotecas, bases de datos, etc., no están configuradas con valores seguros.

Ejemplo:

Un servidor de aplicaciones tiene configuraciones que permiten la exposición de mensajes de error detallados en producción. Esto podría proporcionar información valiosa para un atacante sobre la estructura interna de la aplicación.

Mitigación:

  • Realizar revisiones periódicas de las configuraciones del sistema, servidor web, base de datos y otros para asegurarse de que estén configurados de manera segura.
  • Eliminar cualquier configuración o función no utilizada para reducir la superficie de ataque.
  • Aplicar el principio de menor privilegio para garantizar que los usuarios y servicios tengan solo los permisos necesarios para realizar sus funciones.
  • Cambiar las configuraciones predeterminadas a configuraciones más seguras y restringidas.

6. Software and Data Integrity Failures

Los fallos de integridad de software y datos se relacionan con el código y la infraestructura que protege contra violaciones de integridad.

Por un lado, en este punto estaríamos frente a una vulnerabilidad relativa a la Integridad del Software, casos en que el software podría haber sido alterado en forma maliciosa, Lo mismo podría suceder en cuanto a los datos si no se tiene un medio para garantizar la integridad de estos, es decir que no sean modificados de manera no autorizada.

Es importante destacar, a modo de ejemplo, que muchas aplicaciones ahora incluyen funcionalidad de actualización automática, donde las actualizaciones muchas veces se descargan sin una verificación suficiente de integridad y se aplican a la aplicación previamente confiable. Los atacantes podrían potencialmente cargar sus propias actualizaciones para ser distribuidas y ejecutadas en todas las instalaciones.

Prevención y mitigación:

  • Utilizar firmas digitales o mecanismos similares para verificar que el software o los datos provengan de la fuente esperada y no hayan sido alterados.
  • Comprobar que las bibliotecas y dependencias, como npm o Maven, estén consumiendo repositorios confiables..
  • Asegurar de que se utilice una herramienta de seguridad de la cadena de suministro de software, como OWASP Dependency Check u OWASP CycloneDX.
  • Corroborar que haya un proceso de revisión para los cambios de código y configuración para minimizar la posibilidad de que se introduzca código o configuración maliciosos en su pipeline de software.
  • Chequear que los datos serializados no firmados o no encriptados no se envíen a clientes no confiables sin algún tipo de verificación de integridad o firma digital para detectar manipulaciones o reproducciones de los datos serializados.

Ejemplo:

Muchos routers domésticos, no verifican las actualizaciones a través de firmware firmado. Es por eso que dado del caso de introducción de actualizaciones falsas, podría llegar a ser imposible que el dispositivo identifique a las mismas como tales.

7. Componentes desactualizados y vulnerables

Se refiere al uso de software de terceros, como bibliotecas, frameworks, etc. que contienen vulnerabilidades conocidas y no se han actualizado a versiones más seguras.

Características:

  • Uso de componentes (bibliotecas, frameworks, etc.) en una aplicación que contiene vulnerabilidades conocidas que podrían ser explotadas por los atacantes.
  • La ausencia de un proceso para mantener actualizados los componentes utilizados en una aplicación, dejando vulnerabilidades sin corregir.

Ejemplo:

Un sitio web que use una versión antigua de una librería de JS para gestionar la interfaz de usuario. Se podrían aprovechar vulnerabilidades conocidas y ser explotadas por atacantes como para realizar ataques de Cross-Site Scripting (XSS).

Mitigación:

  • Mantener un inventario de todos los componentes utilizados en la aplicación, incluyendo bibliotecas, frameworks y módulos de terceros.
  • Utilizar servicios y herramientas que rastreen las vulnerabilidades conocidas en los componentes utilizados y proporcionen alertas sobre actualizaciones de seguridad.
  • Automatizar el proceso de actualización de componentes para garantizar que se realice de manera oportuna y según necesidades.
  • Revisar regularmente el código fuente de la aplicación en busca de dependencias desactualizadas y realizar actualizaciones conforme sea necesario.

8. Fallas de identificación y autenticación

Refiere a problemas relacionados con la correcta identificación y autenticación de usuarios en una app web.

Caracterítsticas:

  • Fallos en la forma en que la aplicación identifica a los usuarios, como el uso de id débiles o predecibles.
  • Problemas en los procesos de autenticación, como falta de medidas de seguridad adecuadas o la aceptación de credenciales débiles.

Ejemplo:

Una aplicación asigna identificadores numéricos a los usuarios de forma secuencial y pública (por ejemplo, 1, 2, 3, ...). Un atacante podría predecir o enumerar estos identificadores para acceder a cuentas de otros usuarios.

Mitigación

  • Utilizar autenticación multifactor.
  • Asignar id de usuario de forma aleatoria y no secuencial para evitar la predicción por parte de los atacantes.
  • Establecer políticas de contraseñas al efecto de que las mismas sean fuertes.
  • Utilizar HTTPS para asegurar la transmisión segura de credenciales durante la autenticación.

9. Security Logging and Monitoring Failures:

Corresponde a problemas relacionados con la falta de una implementación adecuada de registros y monitoreo de seguridad en una aplicación web. Estos fallos pueden impedir la detección temprana de actividades maliciosas.

Características:

  • Ausencia de registros detallados de eventos y actividades en la aplicación, lo que dificulta la investigación y respuesta a incidentes.
  • Falta de sistemas de monitoreo en tiempo real que permitan identificar y responder rápidamente a actividades sospechosas o ataques en curso.

Ejemplo:

El caso de una aplicación no registre eventos de acceso, como inicios de sesión exitosos o fallidos. Esto dificulta la identificación de intentos de acceso no autorizado.

Mitigación:

  • Registrar eventos detallados, para facilitar la detección y respuesta a incidentes.
  • Implementar sistemas de monitoreo en tiempo real para identificar actividades sospechosas de manera inmediata.
  • Utilizar soluciones de seguridad que faciliten la recopilación y análisis de registros, y que proporcionen alertas sobre patrones de actividad extraña.
  • Registrar errores de aplicación de manera detallada.

10. Server-Side Request Forgery:

Ocurre cuando un atacante puede lograr que una aplicación realice solicitudes HTTP en nombre del servidor donde se ejecuta la aplicación, lo que puede llevar a la exposición de recursos internos o a la ejecución de acciones no autorizadas.

Características:

  • Capacidad del atacante para forzar a la aplicación a realizar solicitudes HTTP a destinos arbitrarios, incluso relacionados a recursos internos.
  •  Posibilidad de exponer información sensible o recursos internos, como archivos locales, bases de datos, o servicios internos, a través de las solicitudes realizadas por la aplicación.

Ejemplo:

Una aplicación procesa solicitudes de imágenes externas y utiliza URLs para cargar imágenes. Un atacante podría proporcionar una URL que apunte a un servicio interno en la red local, exponiéndolo a través de la aplicación.

Mitigación:

  • Validar y filtrar estrictamente las URLs proporcionadas por los usuarios para asegurar que solo apunten a recursos permitidos y no a servicios internos.
  • Implementar whitelists de dominios permitidos para limitar la posibilidad de acceder a recursos no autorizados.
  • Restringir los protocolos permitidos en las URLs para evitar solicitudes a protocolos como `file://` o `ftp://`, que podrían conducir a SSRF.
  • Utilizar redes privadas virtuales (VPNs) para segmentar y proteger recursos internos, reduciendo el riesgo de exposición a través de SSRF.