OWASP Top Ten 2017 (es)

A8:2017-Deserialización Insegura

Languages: en de [es]
Agente de amenaza / Vector de ataque Debilidades de seguridad Impacto
Específico
de la Apl.
Explotabilidad: 1 Prevalencia: 2 Detectabilidad: 2 Técnico: 3 ¿Negocio?
Lograr la explotación de deserialización es difícil, ya que los exploits distribuidos raramente funcionan sin cambios o ajustes en su código fuente.
Este ítem se incluye en el Top 10 basado en una encuesta a la industria y no en datos cuantificables.
Algunas herramientas pueden descubrir defectos de deserialización, pero con frecuencia se necesita ayuda humana para validarlo. Se espera que los datos de prevalencia de estos errores aumenten a medida que se desarrollen más herramientas para ayudar a identificarlos y abordarlos.
No se debe desvalorizar el impacto de los errores de deserialización. Pueden llevar a la ejecución remota de código, uno de los ataques más serios posibles. El impacto al negocio depende de las necesidades de la aplicación y de los datos.
¿La aplicación es vulnerable?
Aplicaciones y APIs serán vulnerables si deserializan objetos hostiles o manipulados por un atacante. Esto da como resultado dos tipos primarios de ataques:
* Ataques relacionados con la estructura de datos y objetos; donde el atacante modifica la lógica de la aplicación o logra una ejecución remota de código que puede cambiar el comportamiento de la aplicación durante o después de la deserialización.
* Ataques típicos de manipulación de datos; como ataques relacionados con el control de acceso, en los que se utilizan estructuras de datos existentes pero se modifica su contenido.
La serialización puede ser utilizada en aplicaciones para:
* Comunicación remota e Inter-Procesos (RPC/IPC)
* Protocolo de comunicaciones, Servicios Web y Brokers de mensajes.
* Caching y Persistencia.
* Bases de datos, servidores de caché y sistemas de archivos.
* Galletas HTTP cookies, parametros de formularios HTML, testigos de autenteicacíond de una API
Cómo se previene
El único patrón de arquitectura seguro es no aceptar objetos serializados de fuentes no confiables o utilizar medios de serialización que sólo permitan tipos de datos primitivos. Si esto no es posible, considere alguno de los siguientes puntos:
* Implemente verificaciones de integridad tales como firmas digitales en cualquier objeto serializado, con el fin de detectar modificaciones no autorizadas.
* Durante la deserialización y antes de la creación del objeto, exija el cumplimiento estricto de verificaciones de tipo de dato, ya que el código normalmente espera un conjunto de clases definibles. Se ha demostrado que se puede pasar por alto esta técnica, por lo que no es aconsejable confiar sólo en ella.
* Aísle el código que realiza la deserialización, de modo que se ejecute en un entorno con los mínimos privilegios posibles.
* Registre las excepciones y fallas en la deserialización, tales como cuando el tipo recibido no es el esperado, o la deserialización produce algún tipo de error.
* Restrinja y monitoree las conexiones (I/O) de red desde contenedores o servidores que utilizan funcionalidades de deserialización.
* Monitoree los procesos de deserialización, alertando si un usuario deserializa constantemente.
Ejemplos de escenarios de ataque
Escenario #1: una aplicación React invoca a un conjunto de microservicios Spring Boot. Por ser programadores funcionales, intentaron asegurar que su código fuera inmutable. La solución a la que llegaron fue serializar el estado del usuario y pasarlo en ambos sentidos con cada solicitud. Un atacante advierte la firma “R00” del objeto Java, y usa la herramienta Java Serial Killer para alcanzar ejecución de código remoto en el servidor de la aplicación.
Escenario #2: un foro PHP utiliza serialización de objetos PHP para almacenar una “super” galleta HTML, que contiene el ID, rol, hash de la contraseña y otros datos del estado del usuario:
a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
Un atacante modifica el objeto serializado para darse privilegios de administrador a sí mismo:
a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
Referencias