Ideas, información y conocimientos compartidos por el equipo
de Investigación, Desarrollo e Innovación de BASE4 Security.
Como desarrolladores y/o responsables de la seguridad de una, aplicación, debemos poder definir el límite de lo correcto y lo incorrecto a la hora de construir y diseñar la arquitectura de la misma, muchas veces pasa que en el proceso nos olvidamos de tener en cuenta los errores más comunes cometidos por otros desarrolladores o nos olvidamos los principales intereses de los atacantes. Si tuviéramos que mantenernos al día por nuestra cuenta, sería una tarea titánica ya que las vulnerabilidades y los intereses de los atacantes en buscar nuevos horizontes, tienen una tasa exponencial de variación.
Entonces producto de esto nos surgen varias preguntas, a la hora de proponer un diseño seguro ya sea de una aplicación web, servicio web y/o aplicación móvil; ¿Cómo mantenernos al día? ¿Cómo enfrentar esa ola de novedades sin olvidarnos lo más importante? Uno podría fácilmente decir, que lo más conveniente sería armar una lista de vulnerabilidades más conocidas en base a la experiencia personal, pero allí solo estaríamos teniendo en cuenta una sola óptica de la situación, si bien es deseable que las empresas tengan un histórico de vulnerabilidades o fallas anteriores para poder aplicarlos a la mejora continua, también es cierto que ese histórico va a estar basado en un solo tipo de arquitectura y/o en un solo tipo de aplicación. Esto en el corto plazo quizás no tiene impacto a nivel empresa, pero si la misma está constantemente inmersa en procesos de innovación como debería ser, se encontrará siempre en el dilema de cambiar la arquitectura constantemente y proponer mejoras a los procesos habituales desarrollados en el día a día, llevándola a implementar nuevas funcionalidades y nuevas tecnologías que podrían estar en riesgo bajo la perspectiva de ese histórico (Hecho en función a una arquitectura obsoleta).
Ahí es donde debemos barajar y dar de nuevo repartiendo las cartas en un orden alternativo que nos va a proveer nuevos puntos de vista. Porque invertir esfuerzos en sacar estadísticas y armar históricos si puede haber alguien que haya hecho antes lo mismo pero no solo referido a una arquitectura particular, sino que también a muchas situaciones ocurridas aplicadas a distintos ámbitos.
Ese caso del cual les menciono es el caso de OWASP, (Open Worldwide Application Security Project). Un proyecto que surge de la necesidad de relevar los intereses más comunes de los atacantes en función a los errores que los desarrolladores comentan a lo largo del ciclo de desarrollo de software, la comunidad OWASP está formada por empresas, organizaciones educativas y particulares de todo el mundo. Juntos constituyen una comunidad de seguridad informática que trabaja para crear artículos, metodologías, documentación, herramientas y tecnologías que se liberan y pueden ser utilizadas gratuitamente. Actualizando las principales tendencias, como consecuencia de las mejoras existentes en los procesos de desarrollo seguro. Esta organización que nació enfocada en errores asociados a aplicaciones web, hoy en día tiene en su haber varias versiones, tipificando las vulnerabilidades más explotadas y agrupándolas acorde a la naturaleza de la aplicación. Tenemos actualmente el OWASP Web, OWASP Mobile, y OWASP API, el cual será detallado en este artículo:
OWASP - API 2023
Un elemento fundamental de la innovación en el mundo actual impulsado por las aplicaciones es la interfaz de programación de aplicaciones (API). Desde bancos, comercio minorista, transporte hasta IoT, vehículos autónomos y ciudades inteligentes, las API son una parte fundamental de las aplicaciones móviles, SaaS y web modernas por lo que al encontrarlas habitualmente con frecuencia a nivel cliente están pasando a ser el principal objetivo de los atacantes, ante los descuidos que se cometen a la hora de implementarlas.
Si bien el concepto de una API es sencillo, un servicio que esta brindando un recurso y una interfaz del otro lado consumiendo las distintas prestaciones, tal como se muestra en la imagen;
La mayoría de los desarrolladores omiten el proceso de asegurarlas, quizás por una falsa sensación de seguridad que los lleva a pensar que un atacante ante el desconocimiento del funcionamiento de la misma, no va a tener en la mira estos servicios ya que están fuera de la superficie del ataque. Cuando en realidad ocurre todo lo contrario.
A continuación veremos las 10 vulnerabilidades más frecuentes en este ámbito:
API1 - Broken Object Level Authorization
Object level authorization es un mecanismo de control de acceso, que usualmente está implementado a nivel de código, encargado de validar que un usuario acceda solamente a los objetos que tiene permitido acceder. Suponiendo el caso de que un usuario presenta sus credenciales ante la interfaz alojada en el teléfono y luego él mismo quiere acceder a otro recurso provisto por el servicio, tal como se muestra a continuación:
API2 - Broken Authentication
Esta falla, común también en las aplicaciones web, se puede manifestar en varias vulnerabilidades debido a que cuando nos enfrentamos a un endpoint de una API, existe un desafío inicial para poder consumir la misma y comenzar a intercambiar recursos.
Existen varios casos en donde esto puede llegar a ocurrir:
API3 - Broken Object Property Level Authorization
Esta categoría de vulnerabilidades, combina dos vulnerabilidades descritas en la revisión de 2019 asociada a las API, en donde tenemos Excessive Data Exposure y Mass Assignment, enfocadas básicamente en la manipulación de información sensible y la exposición de este tipo de información, haciendo referencia a las propiedades de los objetos.
Un ejemplo simple de esta vulnerabilidad podría ser el siguiente ;
API4 - Unrestricted Resource Consumption
Algunas consultas requieren recursos como ancho de banda, consumo de CPU, memoria y almacenamiento y otras tienen relegada esta capacidad de procesamiento a los proveedores del servicio, ya que es muy probable que no todas las APIs de una aplicación están bajo el control de la empresa que desarrolla la aplicación. Muchas estructuras utilizan APIs de terceros y pagan por cada request, por lo que estos ataques están asociados a perjudicar los costos de mantenimiento de esas APIs.
Por ejemplo:
API5 - Broken Function Level Authorization
En primer lugar los atacantes buscan un target que contenga dos o más tipos de cuentas. Podría ser un usuario común encargado de las tareas habituales trabajadas sobre su perfil y en otro caso podría ser un usuario administrador, encargado de tener una visión general de toda la aplicación. Capturando varias llamadas a la respectiva API el atacante encuentra un parámetro oculto que hace referencia al tipo de cuenta, por lo que procede a cambiarlo, permitiendo acceder a una función de otro usuario que no corresponde a sus tareas.
En resumen dentro de los manejos de autorizaciones, estas APIs vulnerables no controlan correctamente el acceso a las funciones que corresponden a perfiles más avanzados.
API6 - Unrestricted Access to sensitive business flows
A la hora de crear un endpoint es muy importante entender cuáles son los flujos de negocio más importantes, por lo general son los que se llevan la mayor cantidad de información crítica de la empresa y de las operaciones por lo que protegerlos se transforma en la principal tarea de todo programador. Si estos flujos quedan expuestos, en el funcionamiento de la aplicación podríamos llegar a tener un impacto de medio a crítico dependiendo del flujo de negocio que haya quedado expuesto a través de estas fallas.
Algunos ejemplos más comunes de flujos de negocio expuestos se dan en las siguientes situaciones:
Como vimos en estos tres casos, las APIs presentan estas vulnerabilidades debido a que no se requiere autenticación para utilizar estos recursos. Por lo que le permite a un usuario saltarse el flujo normal de la aplicación e ir a flujos alternativos que no corresponden a su flujo natural de la misma.
API7 - Server Side Request Forgery
Esta vulnerabilidad ocurre cuando una API permite hacer consultas HTTP del lado del servidor hacia un dominio arbitrario elegido por el atacante.
Esto le permite a un atacante hacer conexión con servicios de la infraestructura interna donde se aloja la API y filtrar información sensible.
Los casos son variados, pero veamos cómo un atacante podría robar las llaves de AWS de una empresa.
API8 - Security Misconfiguration
Al igual que en las aplicaciones web existen en las APIs malas configuraciones de seguridad. Esto ocurre cuando no se aplica el correcto hardening de la plataforma o existen permisos mal configurados a la hora de desplegar las mismas. Dentro de las cuestiones a revisar los desarrolladores suelen omitir la mayoría de cuestiones de seguridad debido a la falta de automatización en la etapa de testing. Dentro de las posibles malas configuraciones encontramos las siguientes:
API9 - Improper Inventory Management
Las APIs tienden a exponer más endpoints que las tradicionales aplicaciones web, esto lleva a los desarrolladores a crear la correspondiente documentación del funcionamiento de cada una de las APIs correspondientes. El inventario apropiado debe ser relevado ya que si se pierde la documentación o si se filtra, los atacantes podrían ampliar su superficie de ataque llevando al máximo los conocimientos sobre el manejo de los servicios expuestos.
Esta vulnerabilidad, sumada a la no protección se transforma en la principal bomba de tiempo asociada a estas cuestiones. Siempre debemos preguntarnos, para cada API, si todos los endpoints actuales deberían estar disponibles, para aplicar el principio de mínimos privilegios a toda la configuración de la arquitectura.
En un caso de ejemplo, supongamos que tenemos adicionalmente la siguiente url:
⦁ < http://WEBSITE:5555/api/v2/res//all >
Si prestamos especial atención a la construcción de la url nos damos cuenta que estamos trabajando con la versión 2 de la misma, un atacante que entienda este tipo de funcionamiento podría reemplazar el v2 por un v1, para ver qué módulos quedaron disponibles relacionados con la versión anterior de la API. Muchas veces ocurre que los desarrolladores restringen módulos que no usan en la nueva versión, pero descuidan versiones anteriores que podrían llegar a estar activas como consecuencia de un incorrecto relevamiento a la hora de armar el inventario.
API10- Unsafe Consumption of APIs
Los desarrolladores tienden a recibir datos de APIs de terceros, muchas veces esos consumos que están bajo la órbita de la arquitectura de la empresa no tienen un tratamiento de seguridad adecuado al resto de los flujos de la aplicación que consume estos servicios.
Por lo que la desatención de estos componentes genera una superficie de ataque interesante para la perspectiva del ciberdelincuente ya que puede utilizar estos recursos para perjudicar el funcionamiento de la aplicación.
Tal como se ve en la imagen, si tengo mis API endpoints y son controlados por ejemplo por un API Management de terceros el atacante que encuentre una falla en este componente de terceros va a poder vulnerar toda la arquitectura diseñada previamente. Es por eso que los desarrolladores tienen que estar al tanto constantemente de las fallas que pueden llegar a existir en los sistemas que se contratan y se tercerizan.
Recomendaciones
A la hora de pensar cómo protegernos ante estas cuestiones diría que lo que necesitamos es aumentar nuestra conciencia respecto de los activos informáticos que desplegamos, cuando construimos una aplicación. Es importante seguir las recomendaciones de OWASP respecto de cada punto para poder ejecutar una correcta implementación de las APIs y no abusar del potencial desconocimiento de los atacantes. Los invitamos a recorrer el OWASP API security Project, para más soluciones puntuales en cada caso. Si les gusto este post y desean que hagamos uno relacionado con las recomendaciones déjenlo en los comentarios.
Conclusión
Para tener en cuenta revisando el tema podemos observar que muchos errores se arrastran del manejo descuidado que por lo general tienen las aplicaciones web, el principal error es en primer lugar creer que nadie va a prestar atención a determinado punto de nuestra arquitectura y sumado a eso creer que la seguridad por oscuridad (Uso del diseño secreto como medida de protección, seguridad por desconocimiento) es el mecanismo más efectivo para defendernos cuando en realidad, en muchas ocasiones los atacantes saben más que nosotros de nuestra misma aplicación.