¿Qué es la deserialización? - Ejecución remota de código

Cómo la deserialización insegura se convierte en ejecución remota de código (y cómo detectarla antes de la fusión)

El proceso de Commit Eso abrió una puerta trasera

Se ha incorporado una nueva función para gestionar objetos subidos por el usuario. Todo supera las pruebas, pero semanas después, una prueba de penetración revela que los atacantes pueden ejecutar comandos en el servidor; esto es resultado de una deserialización insegura oculta en el código. La diferencia entre la deserialización y la ejecución remota de código puede ser peligrosamente pequeña, especialmente cuando se confía sin validación en datos serializados de paquetes de código abierto o servicios internos.

¿Qué es la deserialización en el código, por qué es riesgosa y dónde se esconde?

En términos de desarrollo, ¿qué es la deserialización? Es el proceso de tomar datos estructurados, JSON, XML, formatos binarios u objetos serializados específicos del lenguaje, y convertirlos de nuevo en objetos en memoria.

Por sí mismo, deserialización es inofensivo y común, por ejemplo:

  • Java:Lectura de objetos con ObjetoEntradaStream
  • Python:Cargando datos con pickle.load
  • Node.js:Análisis de JSON con JSON.parse

El riesgo surge cuando se aplica la deserialización a datos no confiables sin validación. Un atacante puede manipular la entrada para activar una cadena de gadgets, rutas de código existentes utilizadas de forma no deseada, lo que puede provocar la ejecución remota de código.

Inseguro deserialización Se encuentra a menudo en:

  • Paquetes de código abierto con valores predeterminados inseguros
  • Código personalizado que supone que la entrada serializada es confiable
  • API de terceros Están devolviendo objetos serializados sin verificación
  • Construir artefactos como:
    • Java .ser archivos que contienen objetos pre-serializados.
    • Python .pkl archivos modelo en flujos de trabajo de aprendizaje automático.
    • Objetos de configuración serializados incrustados en imágenes de Docker o contenedores de implementación
  • Dispositivos de prueba como:

    • Datos de prueba serializados antiguos copiados de instantáneas de producción.
    • Cargas útiles serializadas descargadas de repositorios externos para pruebas de rendimiento o regresión.

Estos archivos pueden introducirse en un repositorio y cargarse automáticamente durante pruebas o implementaciones, lo que desencadena situaciones inseguras. deserialización in CI/CD pipelines incluso antes de que el código llegue a producción.

De la deserialización insegura a la ejecución remota de código: la ruta de ataque

La cadena de explotación para la deserialización insegura a menudo sigue uno de estos patrones:

  1. Una entrada no confiable ingresa a la aplicación.
  2. La deserialización insegura recrea objetos sin restricciones.
  3. Una cadena de gadgets activa funcionalidades existentes de formas no deseadas.
  4. El atacante aumenta los privilegios y logra la ejecución remota de código.

Variantes:

  • Las cadenas de gadgets de Java explotan bibliotecas antiguas como Apache Commons.
  • Python .pkl Carga de modelos con objetos maliciosos incrustados.
  • Análisis de JSON de Node.js con eval () o importaciones dinámicas.

Fluir:

Untrusted Input → Deserialization → Gadget Chain → Remote Code Execution

Cómo detectar una deserialización insegura antes de la fusión

Detectar una deserialización insegura antes de fusionar el código es mucho más económico que corregirla después de la implementación. Una combinación de análisis automatizado y pruebas proactivas funciona mejor:

  • Pruebas de seguridad de aplicaciones estáticas (SAST):
    • Configurar escáneres para detectar API riesgosas como ObjetoEntradaStream, pickle.load y YAML.load sin cargador seguro.
    • Escanee tanto el código fuente como los artefactos de compilación/prueba para detectar elementos inseguros. deserialización .
    • Mostrar los hallazgos directamente en pull requests para que los desarrolladores puedan abordarlos antes de fusionarlos.
  • CI/CD Integración: :

Ejemplo de flujo de trabajo:

sql

Commit → SAST scan → PR alert → Fix before merge
  • Los bloques se fusionan cuando se encuentran hallazgos críticos de deserialización insegura para evitar que código inseguro llegue a las ramas de producción.
  • Pruebas unitarias con entradas maliciosas simuladas:

    • Crear cargas útiles inofensivas y controladas que imitan objetos de ataque serializados comunes.
    • Pruebe cómo los maneja la aplicación; debería rechazar, desinfectar o registrar la entrada en lugar de procesarla a ciegas.
    • Incluya estas pruebas en la automatización pipeline Por lo tanto, se ejecutan en cada PR y detectan de forma temprana el comportamiento de deserialización inseguro.
    • Asegúrese de que las cargas útiles de prueba no sean ejecutables y que sea seguro almacenarlas en el repositorio, centrándose exclusivamente en la lógica de detección.

Este enfoque en capas combina el escaneo automatizado con pruebas propias del desarrollador, lo que garantiza que las rutas de deserialización inseguras se identifiquen y eliminen mucho antes de que puedan convertirse en vulnerabilidades de ejecución de código remoto.

Estrategias de prevención para desarrolladores: Cómo evitar que la deserialización se convierta en ejecución remota de código

  1. Límites de confianza: Deserialice únicamente desde fuentes autenticadas y verificadas.
  2. API seguras:

     

    • Java: Bibliotecas seguras con validación.
    • Python: uso json.loads () más del pickle.loads() donde sea posible.
    • Node.js: Evitar eval () o ejecución de código dinámico.

       

  3. Listas de permitidos y esquemasRestringir los tipos de objetos permitidos. Aplicar esquemas JSON.
  4. Higiene de la dependencia: Supervise los CVE que mencionan la deserialización o la ejecución remota de código.
  5. Revisiones de código: Agrega deserialización Comprobaciones de seguridad para plantillas de revisión de relaciones públicas.

Nota sobre herramientas: Herramientas como xygeni Escanear el código y las dependencias para detectar deserializaciones inseguras antes de la fusión, identificando áreas de alto riesgo para que los desarrolladores puedan solucionarlas de manera temprana.

Ejemplos de patrones de detección en distintos idiomas (Pseudocódigo seguro)

Todos los ejemplos a continuación son pseudocódigos desinfectados que muestran patrones de detección y no exploits funcionales:

Java: detección del uso inseguro de la API:

java
// BAD: Accepting untrusted input without validation
ObjectInputStream in = new ObjectInputStream(userInputStream);
Object obj = in.readObject(); // Unsafe - no class type checks

// GOOD: Validate allowed classes before processing
if (allowedClasses.contains(obj.getClass().getName())) {
    process(obj); // Safe processing of approved classes
}

Python: Cómo evitar la deserialización insegura:

python
import pickle

# BAD: Loading untrusted serialized data directly
data = pickle.loads(untrusted_input)  # Unsafe - arbitrary object execution risk

# GOOD: Use JSON with schema validation
import json
data = json.loads(untrusted_input)  # Safe when validated against schema

Node.js: cómo evitar la ejecución de código dinámico:

javascript
// BAD: Executing code from parsed data
let obj = JSON.parse(untrustedInput);
eval(obj.code); // Unsafe - allows arbitrary code execution

// GOOD: Use fixed logic without dynamic execution
let safeObj = JSON.parse(untrustedInput);
process(safeObj); // Handle only expected properties and values

Automatización de la detección en DevSecOps Pipelines: Cómo detectar la deserialización antes de que llegue a producción

La automatización de la detección de deserialización insegura garantiza Las vulnerabilidades se detectan y se corrigen antes de que conduzcan a la ejecución remota de código en producción.

Pipeline Escaneado

  • Ejecutar SAST en el código fuente, los archivos de configuración y los artefactos de compilación en cada commit.
  • Detectar patrones de deserialización inseguros tanto en el código de la aplicación como dependencias.

Inspección de artefactos

  • Escanear .ser, .pkl, y otros archivos serializados para patrones inseguros antes de implementar o incluso ejecutar pruebas.

Pull Request de amargo

  • Los bloques se fusionan si se detecta una deserialización insegura.
  • Muestre comentarios prácticos en las relaciones públicas para acelerar la remediación.

Aplicación de pruebas unitarias

  • Incluir pruebas unitarias con entradas maliciosas simuladas en el CI/CD pipeline
  • Las compilaciones fallan si la aplicación procesa datos serializados no seguros en lugar de rechazarlos.

Cómo evitar falsos positivos sin debilitar las normas

  • No desactive las reglas de detección para “silenciar” las alertas; esto puede permitir que una deserialización realmente insegura pase inadvertida.
  • Utilice una lista blanca controlada (lista de permitidos) para patrones o dependencias seguros conocidos.
  • Requerir validación de seguridad antes de aprobar entradas de la lista blanca.
  • Mantenga la lista blanca bajo control de versiones y revísela periódicamente para garantizar que todas las excepciones permanezcan justificadas y seguras.

El papel de Xygeni

  • Se integra directamente en CI/CD pipelines para escanear tanto el código fuente como los artefactos de compilación.
  • Detecta patrones de deserialización inseguros y dependencias riesgosas al inicio del ciclo de vida.
  • Admite listas blancas basadas en políticas con revisión de seguridad obligatoria, equilibrando la precisión de detección con la productividad del desarrollador.

Mantenerse a la vanguardia de la ejecución remota de código mediante la deserialización segura

La deserialización insegura puede pasar desapercibida hasta que se convierte en una ruta directa a la ejecución remota de código. Para evitarla se requiere:

  • Entender qué es la deserialización y cómo se puede abusar de ella.
  • Integración de detección automatizada en el flujo de trabajo de desarrollo.
  • Revisar periódicamente las dependencias, los artefactos de compilación y los datos serializados utilizados en las pruebas.

Papel práctico de Xygeni en este proceso:

  • Escaneo de código fuente:Identifica patrones de deserialización inseguros en varios idiomas antes de fusionar el código.
  • Análisis de artefactos y dependencias: Detecta archivos serializados riesgosos (.ser, .pkl, configuración integrada) y componentes de terceros con vulnerabilidades conocidas.
  • Controles basados en políticas:Admite una lista de permitidos controlada con validación de seguridad, lo que garantiza que las excepciones necesarias no introduzcan riesgos reales.
  • Comentarios de los desarrolladores en contexto: Marca la ubicación exacta y la causa de la deserialización insegura dentro pull requests, lo que permite a los desarrolladores solucionar problemas inmediatamente y confirmar la mitigación mediante nuevos escaneos.

Al integrar controles como estos directamente en CI/CDLos equipos pueden detectar y remediar problemas inseguros. deserialización antes de que tenga la oportunidad de escalar a una ejecución de código remoto en producción.

sca-tools-software-herramientas-de-analisis-de-composicion
Priorice, solucione y proteja sus riesgos de software
Además, te ofrecemos una prueba gratuita de 7 días de nuestra Business Edition para que puedas explorar las funciones avanzadas de la plataforma SecurityScorecard.
No se requiere tarjeta de crédito

Asegure el desarrollo y entrega de software

con la suite de productos Xygeni