Pular para o conteúdo
Todos os conceitos

Cadeia de gadgets (o conceito)

Desserializar classe arbitrária deixa o atacante escolher objetos existentes cujos métodos automáticos encadeiam até um efeito danoso.

Este é um conceito, não uma receita. Alguns formatos guardam, junto dos dados, o NOME DA CLASSE do objeto. O desserializador reconstrói aquela classe exata e, em muitas linguagens, roda sozinho um método de ciclo de vida no objeto recém-criado, sem o aplicativo pedir. Esse gatilho automático é o cerne do perigo: o atacante escolhe qual classe nasce e, com ela, qual método já existente roda.

Um gadget é um trecho de código que já existe no programa (ou nas bibliotecas) e faz algo útil para o atacante quando disparado pelo ciclo de vida. Uma cadeia de gadgets liga vários desses trechos, um chamando o próximo, até um efeito final danoso. O atacante não escreve código novo no servidor: ele costura comportamentos que já estavam lá, só os ativando na ordem certa.

Por isso a regra é não desserializar classe arbitrária de fonte não confiável. Em Java o gatilho é readObject; em PHP, __wakeup e __destruct; em Python, o que o pickle faz ao reconstruir. A defesa é usar formato só de dados (JSON) e, no máximo, uma lista de permissão de tipos, nunca deixar o dado nomear a classe.

__class__ dado nomeia a classe onRestore() dispara onRestore() gadget A gadget B efeito danoso reconstrói a classe encadeia O método de ciclo de vida roda sozinho e liga gadgets que já existem no programa.
O dado nomeia a classe; o desserializador a reconstrói e dispara um método de ciclo de vida, que encadeia em outro gadget até um efeito danoso.

Aparece nestes desafios