Deserialización insegura
¿Qué es Deserialización insegura?
Deserialización inseguraVulnerabilidad en la que una aplicación deserializa datos no confiables, permitiendo al atacante instanciar objetos arbitrarios y, a menudo, lograr ejecución remota de código.
Cuando una aplicación convierte datos serializados (formatos binarios de Java/PHP/Python/.NET, YAML o JSON con metadatos de tipo) de nuevo en objetos, el deserializador puede invocar constructores, métodos mágicos o cadenas de gadgets: secuencias de métodos ya cargados que, encadenados, alcanzan un sink peligroso como Runtime.exec. Con entradas no confiables, el atacante construye un payload que dispara ese comportamiento durante la deserialización, obteniendo ejecución remota de código (RCE), bypass de autenticación, escritura de ficheros o denegación de servicio.
El caso canónico es CVE-2015-4852: Oracle WebLogic deserializaba de forma insegura objetos Java no autenticados enviados por el protocolo T3 al puerto TCP 7001 y, con Apache Commons Collections en el classpath, la herramienta ysoserial producía un gadget de RCE funcional. El primer parche de Oracle usó una frágil lista de denegación de clases en lugar de bloquear directamente la deserialización no confiable. Fallos similares afectaron a Apache Struts (CVE-2017-9805, vía XStream) e innumerables bugs de inyección de objetos en unserialize() de PHP. En la lista de OWASP, la categoría pasó de A8:2017 a la más amplia A08:2021 – Software and Data Integrity Failures.
flowchart LR A[Atacante] -->|blob serializado manipulado<br/>cookie / T3 / cuerpo de API| APP[Aplicación] APP -->|deserializa bytes no confiables| DZ[Deserializador] DZ -->|instancia objetos<br/>invoca métodos mágicos| GC[Cadena de gadgets<br/>en el classpath] GC -->|alcanza sink peligroso| RCE[Runtime.exec / escritura de fichero] APP -. defensa .-> SIG[Payload firmado +<br/>lista blanca de tipos] SIG -.->|rechaza tipos desconocidos| DROP[Descartar]
Defensas: nunca deserializar datos no confiables; preferir formatos ligados a esquema (JSON plano, Protobuf) sin recuperación de tipos; firmar o aplicar HMAC a los payloads serializados; imponer una lista blanca estricta de tipos deserializables; y mantener los runtimes parcheados: el .NET moderno ha marcado como obsoleto y eliminado BinaryFormatter.
● Ejemplos
- 01
App Java que deserializa una cookie de sesión con Commons Collections en el classpath, provocando RCE.
- 02
Servicio Python que ejecuta pickle.loads sobre bytes controlados por el usuario.
● Preguntas frecuentes
¿Qué es Deserialización insegura?
Vulnerabilidad en la que una aplicación deserializa datos no confiables, permitiendo al atacante instanciar objetos arbitrarios y, a menudo, lograr ejecución remota de código. Pertenece a la categoría de Vulnerabilidades en ciberseguridad.
¿Qué significa Deserialización insegura?
Vulnerabilidad en la que una aplicación deserializa datos no confiables, permitiendo al atacante instanciar objetos arbitrarios y, a menudo, lograr ejecución remota de código.
¿Cómo defenderse de Deserialización insegura?
Las defensas contra Deserialización insegura combinan habitualmente controles técnicos y prácticas operativas, como se detalla en la definición.
¿Cuáles son otros nombres para Deserialización insegura?
Nombres alternativos comunes: Deserialización no segura, Vulnerabilidad de deserialización de objetos.