O que é Insecure Deserialization e por que você deveria se preocupar?

Vernieri
5 min readSep 27, 2021
“System security breach” by mightyohm is licensed under CC BY-SA 2.0

Serialização & Deserialização

No contexto de desenvolvimento de software a serialização ou serialization é o processo de tradução de uma estrutura de dados ou estado de objeto em um formato que pode ser armazenado ou transmitido e reconstruído posteriormente.

https://hazelcast.com/wp-content/uploads/2021/04/serialization-diagram.png

O Problema

Então você tem esse objeto, digamos em PHP, esse objeto é o cookie de sessão ou cookie com as credenciais da aplicação frontend por exemplo, enviado via http-urlencoded. O conceito de serialização é pegar esse objeto e transformar em um Byte Stream. Dessa forma ele está em um formato adequado para ser trafegado e processado pela rede HTTP. Dessa forma ele pode armazenado num banco de dados. Na outra aplicação será feito o processo de Deserialização, o objeto será restruturado e executado.

https://portswigger.net/web-security/deserialization

Se você aceita inputs do usuário sem validação o usuário poderá controlar os dados que são enviados. Inclusive dados Deserializados. Caso ele manipule um Byte Stream, o sistema irá restruturar o objeto, mas ao invés de ser o objeto esperado será a execução de um código malicioso. Em outra palavras: O Hacker vai injetar código na sua aplicação, podendo a levar em cenários de RCE.
Exemplo teórico: Um forum em PHP envia através de um cookie as credenciais dos usuários utilizando http-urlencoded, algo como:
userID, role, password_sha256, state;

Um usuário chamado João teria o seguinte cookie: joao,usuario,12345,xyz;
Um atacante percebe que essa aplicação web não possui validação de input corretamente. O hacker então realiza o seguinte ataque: Ele altera o seu próprio cookie: hacker,admin,12345,xyz.
Com esse cookie ele envia para o servidor. Dessa forma quando isso for deserializado ele está dando para sua própria conta acessos de Admin.
Quem sabe o atacante também pode injetar uma shell_reversa e objeter um RCE no servidor.

O Ataque

Agora será feito uma demonstração simples do ataque.
Essa máquina foi obtida lá no VulnHub e você pode estar baixando e testando também. Fica aqui o aviso de Spoiler. Se você pretende resolver a máquina sozinho(a), não continue lendo. Você já possui informação o suficiente para testar. (Esse Post não serve como solução do desafio pois só estou demonstrando a parte da Deserialização, o desafio possui outras partes).

Link: https://www.vulnhub.com/entry/devrandom-pipe,124/

Passo 1: Identificando onde está o problema

Em certa página do web site encontramos esse Param= sendo enviado através de url-encoded. Vamos explorar esse cara.

Passo 2: Decodando

Usando o decoder conseguir ver o que sendo enviado:

Passo 3: Reestruturando com código malicioso

Vamos alterar algumas coisinhas:

Enviamos recebemos 200 OK e o link: /scriptz
Acessando vemos que criamos um arquivo no lado do servidor:

Vamos acessar nosso info.php:

Ta lá!

Agora vamos fazer uma reversinha:

Passo 4: Fazendo a Reversinha

Abrindo a porta 5110:

Acessando medium.php (ignorem os outros, são de quando eu estava testando a máquina):

Basta clicar e…:

Passo 5: Executando código de forma remota.

Como Resolver

Como foi demonstrado nessa simulação bem básica, o insecure deserialização pode levar aos cenários de RCE, e inclusive Negação de serviço, data exfiltração, information leakage e por aí vai. Vai depender muito da situação, linguagem aplicada, etc.
Aqui no exemplo foi PHP. Não é um ataque simples de ser explorado nem fácil de ser encontrado. Para evitar insecure deserialization é necessário NÃO DESERIALIZAR INFORMAÇÕES SEM ANTES VALIDAR.
Além disso, ter em sua esteira de software uma ferramenta de SAST, no mínimo.

As Ferramentas SAST conseguem identificar esse tipo de vulnerabilidade bem cedo na esteira e pode ser corrigido de forma fácil pela equipe de desenvolvedores e engenheiros. Apesar de SAST e DAST serem necessários, não podemos contar somente com eles. O mais indicado é o RASP.
De um ponto de vista prático, a proteção de estilo RASP cobrirá os problemas de desserialização insegura:

  1. Use formatos independentes de idioma: prefira formatos padrão, como JSON ou YAML, em vez de formatos binários nativos.
  2. Inclua verificações de integridade: quando possível, inclua validação positiva com base em assinaturas para dados serializados. Nunca deserialize informações sem validação!
  3. Certifique-se de que sua ferramenta de proteção tenha visibilidade total: evite a proteção com base em listas negras ou correspondência de padrões (como WAF e DAST) porque não é flexível o suficiente para bloquear ameaças desconhecidas. Os RASPs, por outro lado, desfrutam de total visibilidade.
  4. Impedir a execução remota: um dos efeitos mais frequentes e perniciosos da desserialização insegura é a execução de código remoto. Os RASPs envolvem seu aplicativo para garantir que nenhuma execução remota ocorra.

Referências

https://hdivsecurity.com/bornsecure/insecure-deserialization-attack-examples-mitigation/

https://portswigger.net/web-security/deserialization

https://hazelcast.com/wp-content/uploads/2021/04/serialization-diagram.png

https://www.vulnhub.com/entry/devrandom-pipe,124/

https://owasp.org/www-project-top-ten/2017/A8_2017-Insecure_Deserialization

--

--

Vernieri

IT Professional, BTECH degree’s, Post-graduated in Information Security.