Una aplicación local de notas puede superar sus pruebas unitarias y, aun así, incluir dos fallos de seguridad. La ruta GET /notes/:id devuelve la nota 42 siempre que un usuario autenticado la solicita, incluso cuando dicha nota pertenece a otra cuenta. Por otro lado, la aplicación acepta un término de búsqueda que llega a una consulta de base de datos sin haber sido procesado de forma segura. Un tercer problema se encuentra fuera del código personalizado del repositorio: una versión de un paquete tiene asociado un aviso de seguridad publicado. Para explotar estos fallos, un atacante solo necesita una cuenta válida de bajos privilegios (para el primero), un punto final HTTP accesible (para el segundo) y no requiere acceso al código fuente (para el riesgo relacionado con las dependencias).
Estos fallos exponen la superficie de ataque de la aplicación, es decir, todas las rutas de código, interfaces de ejecución y límites de dependencia a través de los cuales una entrada no confiable o un comportamiento controlado por un atacante pueden afectar al sistema. La cuestión para el equipo de defensa no es determinar qué escáner es el mejor en términos generales. Es necesario decidir qué evidencias deben generar las pruebas estáticas de seguridad de aplicaciones (SAST), las pruebas dinámicas de seguridad de aplicaciones (DAST) y el análisis de composición de software (SCA) para la misma aplicación de notas, y luego utilizar dicha información para decidir si un cambio puede pasar a producción. Los repositorios de código fuente, el comportamiento HTTP en ejecución y los paquetes de terceros revelan diferentes aspectos del riesgo.
El ejemplo comparativo más sencillo y útil es la solicitud de /notes/42. El análisis del código fuente puede identificar la condición de autorización que omite la comparación entre la cuenta del usuario solicitante y el propietario de la nota. El análisis en tiempo de ejecución permite enviar una solicitud autorizada como un usuario específico y observar si la respuesta revela la nota de otro usuario. El análisis de dependencias puede examinar el manifiesto del paquete sin necesidad de invocar la funcionalidad vulnerable. Qué herramienta puede demostrar cada hallazgo depende de dónde resida el fallo.
Los límites de confianza de la aplicación de notas indican dónde comienza y termina cada tipo de evidencia.
Este diagrama ilustra por qué ningún escáner individual analiza por igual la entrada del navegador, la lógica de la aplicación, las llamadas a la base de datos y los límites de los paquetes externos.
Dado que los tres observadores requieren un objetivo común, el curso utiliza un repositorio que contiene una aplicación de notas de propiedad local, diseñada intencionadamente con vulnerabilidades. La aplicación acepta parámetros HTTP y cuerpos JSON en la interfaz de la API web, utiliza una identidad establecida mediante la ruta de inicio de sesión local, devuelve respuestas en formato HTML o JSON y gestiona las operaciones de base de datos a través de su capa de acceso a datos. Únicamente analizamos esta aplicación de laboratorio local y los entornos bajo nuestro control. Realizar pruebas en servicios de terceros sin autorización por escrito queda fuera del alcance del curso y podría infringir leyes como la Computer Fraud and Abuse Act en Estados Unidos o la Computer Misuse Act 1990 en el Reino Unido.
El repositorio incluye dos comportamientos implementados deliberadamente. Uno de ellos es una ruta de búsqueda propensa a la inyección, representativa de la vulnerabilidad CWE-89 (Improper Neutralization of Special Elements used in an SQL Command o Neutralización inadecuada de elementos especiales utilizados en un comando SQL). El otro es un fallo de autorización a nivel de objeto en la ruta GET /notes/:id, clasificado en la lista OWASP API Security Top 10 2023 como API1: Broken Object Level Authorization (Autorización a nivel de objeto rota). El manifiesto de dependencias también incluye un paquete deliberadamente desactualizado que presenta un problema conocido. Estos casos se tratan por separado, ya que un hallazgo en el código, una observación HTTP y un aviso de seguridad sobre un paquete no constituyen pruebas intercambiables entre sí.
La instantánea del repositorio permite identificar las rutas, el acceso a datos y la declaración de dependencias sin necesidad de ejecutar ningún análisis ni realizar peticiones.