Desserialização insegura
O que é Desserialização insegura?
Desserialização inseguraVulnerabilidade em que uma aplicação desserializa dados não confiáveis, permitindo ao atacante instanciar objetos arbitrários e, com frequência, conseguir execução remota de código.
Quando uma aplicação converte dados serializados (formatos binários Java/PHP/Python/.NET, YAML ou JSON com metadados de tipo) de volta para objetos, o desserializador pode invocar construtores, métodos mágicos ou cadeias de gadgets — sequências de métodos já carregados que, encadeados, chegam a um sink perigoso como Runtime.exec. Com entrada não confiável, o atacante constrói um payload que dispara esse comportamento durante a desserialização, obtendo execução remota de código (RCE), bypass de autenticação, escrita de ficheiros ou negação de serviço.
O caso canónico é a CVE-2015-4852: o Oracle WebLogic desserializava de forma insegura objetos Java não autenticados enviados pelo protocolo T3 para a porta TCP 7001 e, com o Apache Commons Collections no classpath, a ferramenta ysoserial produzia um gadget de RCE funcional. O primeiro patch da Oracle usou uma frágil deny-list de classes em vez de bloquear totalmente a desserialização não confiável. Falhas semelhantes afetaram o Apache Struts (CVE-2017-9805, via XStream) e inúmeros bugs de object-injection em unserialize() do PHP. Na lista da OWASP, a categoria passou de A8:2017 para a mais ampla A08:2021 – Software and Data Integrity Failures.
flowchart LR A[Atacante] -->|blob serializado forjado<br/>cookie / T3 / corpo de API| APP[Aplicação] APP -->|desserializa bytes não confiáveis| DZ[Desserializador] DZ -->|instancia objetos<br/>invoca métodos mágicos| GC[Cadeia de gadgets<br/>no classpath] GC -->|alcança sink perigoso| RCE[Runtime.exec / escrita de ficheiro] APP -. defesa .-> SIG[Payload assinado +<br/>allow-list de tipos] SIG -.->|rejeita tipos desconhecidos| DROP[Descartar]
Defesas: nunca desserializar dados não confiáveis; preferir formatos ligados a schema (JSON simples, Protobuf) sem recuperação de tipos; assinar ou aplicar HMAC aos payloads serializados; impor uma allow-list estrita de tipos desserializáveis; e manter os runtimes atualizados — o .NET moderno tornou obsoleto e removeu o BinaryFormatter.
● Exemplos
- 01
Aplicação Java a desserializar cookie de sessão com Commons Collections no classpath, resultando em RCE.
- 02
Serviço Python a executar pickle.loads sobre bytes controlados pelo utilizador.
● Perguntas frequentes
O que é Desserialização insegura?
Vulnerabilidade em que uma aplicação desserializa dados não confiáveis, permitindo ao atacante instanciar objetos arbitrários e, com frequência, conseguir execução remota de código. Pertence à categoria Vulnerabilidades da cibersegurança.
O que significa Desserialização insegura?
Vulnerabilidade em que uma aplicação desserializa dados não confiáveis, permitindo ao atacante instanciar objetos arbitrários e, com frequência, conseguir execução remota de código.
Como se defender contra Desserialização insegura?
As defesas contra Desserialização insegura costumam combinar controles técnicos e práticas operacionais, conforme detalhado na definição acima.
Quais são outros nomes para Desserialização insegura?
Nomes alternativos comuns: Desserialização não segura, Vulnerabilidade de desserialização de objetos.