Serialização é o processo de transformar algum objeto em um formato de dados que pode ser restaurado mais tarde. As pessoas geralmente serializam objetos para salvá-los no armazenamento ou para enviar como parte das comunicações. A desserialização é o inverso desse processo – tomando dados estruturados a partir de algum formato e reconstruindo-o em um objeto. Hoje, o formato de dados mais popular para serializar dados é JSON. Antes disso, era XML.
No entanto, muitas linguagens de programação oferecem uma capacidade nativa para serializar objetos. Esses formatos nativos geralmente oferecem mais recursos do que JSON ou XML, incluindo customizabilidade do processo de serialização. Infelizmente, as características desses mecanismos de desserialização nativa podem ser reutilizadas por efeitos maliciosos quando operam em dados não confiáveis. Os ataques contra desserializadores foram encontrados para permitir a negação de serviço, controle de acesso e ataques remotos de execução de código.
Tipos de Serialização
Existem vários tipos de serialização disponíveis, dependendo do objeto que está sendo serializado e da finalidade. Quase todas as linguagens de programação modernas suportam a serialização. Em Java, por exemplo, um objeto é convertido em uma representação compacta usando o fluxo de bytes, e o fluxo de bytes pode ser revertido de volta para uma cópia desse objeto.
Outros tipos de serialização incluem a conversão de um objeto em um formato hierárquico como JSON ou XML. A vantagem desta serialização é que os objetos serializados podem ser lidos como texto simples, em vez de um fluxo de bytes.
Vulnerabilidades de desserialização dos últimos três meses
Nos maiores riscos de segurança da OWASP de 2017, a desserialização insegura está posicionada no oitavo lugar, sendo que em 2017, as principais novas vulnerabilidades relacionadas à serialização insegura, principalmente em Java, foram publicadas, como pode ser visto na figura abaixo.
Figura 1 – CVEs relacionados à desserialização insegura.
Para entender a magnitude dessas vulnerabilidades, analisamos os ataques dos últimos três meses (outubro a dezembro de 2017) que tentam explorar a deserialização insegura. Uma observação chave é o aumento acentuado dos ataques de desserialização nos últimos meses, como pode ser visto na figura 2.
Figura 2 – Ataque de desserialização ao longo de 3 meses.
A maioria dos atacantes não usava vetores de ataque além da deserialização insegura. Percebemos que cada invasor estava tentando explorar diferentes vulnerabilidades, sendo os CVE acima mencionados os mais prevalentes.
Ataques de desserialização na prática
A maioria dos ataques que vimos estão relacionados à serialização de bytes-stream de objetos Java. Além disso, vimos alguns ataques relacionados à serialização para XML e outros formatos, representados na figura.
Figura 3 – Distribuição de vulnerabilidades em diferentes formatos de serialização.
No ataque seguinte, o invasor está tentando explorar CVE-2017-10271. O payload é enviado no corpo da solicitação HTTP usando um objeto Java serializado através da representação XML.
Figura 4 – Vetor de ataque contendo uma matriz Java serializada em um XML.
Este script bash tenta enviar uma solicitação HTTP usando o comando “wget”, baixando um script de shell disfarçado como um arquivo de imagem (observe a extensão de arquivo jpg) e executando-o. Poucas notas interessantes podem ser feitas examinando este comando:
- A existência de comandos shell e “wget” indicam que essa carga está direcionada a sistemas Linux
- Usar uma extensão de arquivo de imagem geralmente é feito para evitar controles de segurança
- O parâmetro “-q” para “wget” significa “silencioso”, isso significa que “wget” não terá saída para o console, portanto, será mais difícil notar que tal pedido foi feito. Uma vez que o script baixado é executado, o servidor está infectado com um malware de criptografia tentando mutar moedas digitais Monero (uma moeda criptografia semelhante à Bitcoin).
Além de ataques deste tipo, alguns ataques mais aprimorados de desserialização foram indentificados, conforme pode ser visto na imagem abaixo:
Figura 5 – Vetor de ataque usando uma vulnerabilidade RCE dos Apache Struts.
Figura 6 – Ataque oriundo da China detectado por uma de nossas plataformas.
Este ataque tenta explorar vulnerabilidade, já conhecida, de RCE (Remote Code Execution) relacionada ao Apache Struts.
Inicialmente não notamos nenhuma indicação de minérios criptográficos nos payloads dos ataques relacionados a este CVE, sendo a maioria das cargas úteis ataques de reconhecimento.
No entanto, neste ataque, o payload (marcado em amarelo acima) é muito semelhante à carga útil do exemplo anterior. Usando o mesmo servidor remoto e o mesmo script exato, ele infectou o servidor com malware de criptografia.
Este antigo método de ataque com uma nova carga útil sugere uma nova tendência no meio cibernético, onde os atacantes tentam explorar vulnerabilidades RCE, novas e antigas, para transformar servidores vulneráveis em mineiradores criptográficos e obter um ROI mais rápido sobre o seu “trabalho”.
Recomendações
Dadas as novas vulnerabilidades relacionadas à desserialização insegura que foram descobertas este ano e sua presença nos principais riscos de segurança da OWASP, esperamos ver mais vulnerabilidades relacionadas a esta em 2018. Entretanto, as organizações que usam servidores afetados são aconselhadas a usar o patch mais recente para mitigar essas vulnerabilidades.
Uma alternativa ao patch manual é o patch virtual. O patch virtual protege ativamente os aplicativos da Web contra ataques, reduzindo a janela de exposição e diminuindo o custo dos patches de emergência e correção de ciclos.
Um WAF que fornece mapeamento virtual não interfere com o fluxo de trabalho normal da aplicação e mantém o site protegido enquanto permite que os proprietários do site controlem a linha de tempo do processo de correção.
Tem interesse em saber mais sobre nossa solução de WAF e proteger o seu website? Entre em contato e fale agora mesmo com nossos especialistas!