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.