Intermediário Web — OWASP Top 10

Deserialização Insegura — Execução de Código em Objetos Manipulados

Deserialização insegura ocorre quando a aplicação converte dados externos (JSON, XML, bytes serializados) de volta a objetos sem validar sua integridade ou origem. Um atacante pode manipular o stream serializado para executar código arbitrário durante o processo de desserialização.

Por que é perigoso

Linguagens como Java, PHP e Python possuem mecanismos de serialização nativos que permitem salvar e restaurar objetos completos. Quando métodos como construtores, __wakeup (PHP) ou readObject (Java) executam automaticamente ao desserializar, o atacante controla o que é executado.

Exemplo conceitual em PHP

// Classe vulnerável — executa comando no __wakeup
class Logger {
    public $cmd;
    public function __wakeup() {
        // Em sistema real: NUNCA execute comandos em magic methods
        system($this->cmd);
    }
}

// Dado serializado recebido do usuário (cookie, POST body)
$data = $_COOKIE['data'];
$obj  = unserialize($data); // PERIGO — executa __wakeup com cmd controlado

Um atacante pode gerar um objeto serializado com cmd = "id" e obter execução de comando no servidor.

Java — Gadget Chains

Em Java, o ataque usa cadeias de classes já presentes no classpath (“gadgets”) que, ao serem desserializadas, encadeiam chamadas até atingir execução de código.

// Vetor comum: parâmetro serializado em base64 via HTTP
POST /app/endpoint
Content-Type: application/x-java-serialized-object

rO0ABXNy... (objeto Java serializado em base64, manipulado)

Ferramentas como ysoserial (uso em ambientes autorizados) geram payloads de teste para bibliotecas comuns: Commons Collections, Spring, Hibernate.

Python — pickle

import pickle, os

class Exploit:
    def __reduce__(self):
        # Demonstração educacional — em produção NUNCA use pickle com dados externos
        return (os.system, ('echo pwned',))

data = pickle.dumps(Exploit())
pickle.loads(data)  # executa os.system("echo pwned")

pickle não é seguro para dados não confiáveis. Use JSON ou MessagePack para troca de dados com o exterior.

Detecção

Sinais de desserialização insegura:
- Parâmetros em base64 que começam com "rO0" (Java) ou "Tzo" (PHP)
- Cookies com dados serializados binários
- Endpoints que aceitam Content-Type: application/x-java-serialized-object

Prevenção

1. Não desserializar dados não confiáveis com formatos nativos.

Use JSON, Protobuf ou MessagePack — formatos de dados sem lógica de execução.

2. Se serialização nativa for inevitável, assine e verifique antes de desserializar.

$hmac  = hash_hmac('sha256', $serialized, SECRET_KEY);
// Verificar HMAC antes de unserialize()
if (!hash_equals($expected_hmac, $received_hmac)) {
    throw new Exception('Dados adulterados');
}

3. Java: use ObjectInputFilter para allowlist de classes permitidas.

ObjectInputFilter filter = ObjectInputFilter.Config.createFilter(
    "java.util.ArrayList;java.lang.String;!*"
);
ois.setObjectInputFilter(filter);

4. Monitore desserialização em produção com agentes RASP (Runtime Application Self-Protection).

5. Atualize dependências — muitas gadget chains exploram versões antigas de bibliotecas populares.