Introducción
La deserialización insegura es una vulnerabilidad que ocurre cuando una aplicación deserializa datos no confiables sin validar o sanitizar adecuadamente. Esto puede permitir a un atacante ejecutar código arbitrario, realizar ataques de denegación de servicio (DoS), o incluso escalar privilegios dentro de la aplicación.
Conceptos Clave
- Serialización: Proceso de convertir un objeto en un formato que pueda ser almacenado o transmitido y luego reconstruido.
- Deserialización: Proceso inverso a la serialización, donde los datos serializados se convierten nuevamente en un objeto.
- Datos no confiables: Datos que provienen de fuentes externas y no pueden ser considerados seguros sin validación.
Ejemplos de Deserialización Insegura
Ejemplo en Java
import java.io.*; class Usuario implements Serializable { private static final long serialVersionUID = 1L; String nombre; String rol; } public class DeserializacionInsegura { public static void main(String[] args) { try { // Deserialización de un objeto desde un archivo FileInputStream fileIn = new FileInputStream("usuario.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); Usuario usuario = (Usuario) in.readObject(); in.close(); fileIn.close(); System.out.println("Nombre: " + usuario.nombre); System.out.println("Rol: " + usuario.rol); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
En este ejemplo, si el archivo usuario.ser
es manipulado por un atacante, puede contener datos maliciosos que comprometan la seguridad de la aplicación.
Ejemplo en Python
import pickle class Usuario: def __init__(self, nombre, rol): self.nombre = nombre self.rol = rol # Deserialización insegura with open('usuario.pkl', 'rb') as file: usuario = pickle.load(file) print(f'Nombre: {usuario.nombre}') print(f'Rol: {usuario.rol}')
Similar al ejemplo en Java, si el archivo usuario.pkl
es manipulado, puede contener código malicioso que se ejecutará al deserializarlo.
Ejercicio Práctico
Ejercicio 1: Identificación de Deserialización Insegura
Objetivo: Identificar y corregir un código vulnerable a deserialización insegura.
Código Vulnerable:
import java.io.*; class Producto implements Serializable { private static final long serialVersionUID = 1L; String nombre; double precio; } public class DeserializacionVulnerable { public static void main(String[] args) { try { FileInputStream fileIn = new FileInputStream("producto.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); Producto producto = (Producto) in.readObject(); in.close(); fileIn.close(); System.out.println("Nombre: " + producto.nombre); System.out.println("Precio: " + producto.precio); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
Instrucciones:
- Identifica el punto de deserialización insegura.
- Implementa una solución para validar los datos deserializados.
Solución:
import java.io.*; class Producto implements Serializable { private static final long serialVersionUID = 1L; String nombre; double precio; } public class DeserializacionSegura { public static void main(String[] args) { try { FileInputStream fileIn = new FileInputStream("producto.ser"); ObjectInputStream in = new ObjectInputStream(fileIn) { @Override protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { ObjectStreamClass desc = super.readClassDescriptor(); if (!desc.getName().equals("Producto")) { throw new InvalidClassException("Clase no permitida: " + desc.getName()); } return desc; } }; Producto producto = (Producto) in.readObject(); in.close(); fileIn.close(); System.out.println("Nombre: " + producto.nombre); System.out.println("Precio: " + producto.precio); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
Resumen
La deserialización insegura es una vulnerabilidad crítica que puede permitir a los atacantes ejecutar código malicioso, realizar ataques DoS, o escalar privilegios. Es fundamental validar y sanitizar los datos deserializados para mitigar estos riesgos. En este módulo, hemos aprendido los conceptos clave, visto ejemplos prácticos y realizado un ejercicio para identificar y corregir deserialización insegura.
Curso de OWASP: Directrices y Estándares para la Seguridad en Aplicaciones Web
Módulo 1: Introducción a OWASP
Módulo 2: Principales Proyectos de OWASP
- OWASP Top Ten
- OWASP ASVS (Application Security Verification Standard)
- OWASP SAMM (Software Assurance Maturity Model)
- OWASP ZAP (Zed Attack Proxy)
Módulo 3: OWASP Top Ten
- A1: Inyección
- A2: Pérdida de Autenticación
- A3: Exposición de Datos Sensibles
- A4: Entidades Externas XML (XXE)
- A5: Control de Acceso Roto
- A6: Configuración Incorrecta de Seguridad
- A7: Cross-Site Scripting (XSS)
- A8: Deserialización Insegura
- A9: Uso de Componentes con Vulnerabilidades Conocidas
- A10: Registro y Monitoreo Insuficientes
Módulo 4: OWASP ASVS (Application Security Verification Standard)
- Introducción a ASVS
- Niveles de Verificación
- Requisitos de Seguridad
- Implementación de ASVS en Proyectos
Módulo 5: OWASP SAMM (Software Assurance Maturity Model)
Módulo 6: OWASP ZAP (Zed Attack Proxy)
- Introducción a ZAP
- Instalación y Configuración
- Escaneo de Vulnerabilidades
- Automatización de Pruebas de Seguridad
Módulo 7: Buenas Prácticas y Recomendaciones
- Ciclo de Vida de Desarrollo Seguro (SDLC)
- Integración de Seguridad en DevOps
- Capacitación y Concienciación en Seguridad
- Herramientas y Recursos Adicionales
Módulo 8: Ejercicios Prácticos y Casos de Estudio
- Ejercicio 1: Identificación de Vulnerabilidades
- Ejercicio 2: Implementación de Controles de Seguridad
- Caso de Estudio 1: Análisis de un Incidente de Seguridad
- Caso de Estudio 2: Mejora de la Seguridad en una Aplicación Web