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

  1. Serialización: Proceso de convertir un objeto en un formato que pueda ser almacenado o transmitido y luego reconstruido.
  2. Deserialización: Proceso inverso a la serialización, donde los datos serializados se convierten nuevamente en un objeto.
  3. 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:

  1. Identifica el punto de deserialización insegura.
  2. 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

Módulo 3: OWASP Top Ten

Módulo 4: OWASP ASVS (Application Security Verification Standard)

Módulo 5: OWASP SAMM (Software Assurance Maturity Model)

Módulo 6: OWASP ZAP (Zed Attack Proxy)

Módulo 7: Buenas Prácticas y Recomendaciones

Módulo 8: Ejercicios Prácticos y Casos de Estudio

Módulo 9: Evaluación y Certificación

© Copyright 2024. Todos los derechos reservados