o que é desserialização - execução remota de código

Como a desserialização insegura se torna execução remota de código (e como detectá-la antes da mesclagem)

O método da Commit Isso abriu uma porta dos fundos

Um novo recurso foi incorporado para lidar com objetos enviados pelo usuário. Tudo passa nos testes, mas semanas depois, um teste de penetração revela que invasores podem executar comandos no servidor; o resultado é uma desserialização insegura oculta no código. O intervalo entre a desserialização e a execução remota de código pode ser perigosamente pequeno, especialmente quando dados serializados de pacotes de código aberto ou serviços internos são confiáveis sem validação.

O que é desserialização em código, por que é arriscada e onde ela se esconde

Em termos de desenvolvedor, o que é desserialização? É o processo de pegar dados estruturados, JSON, XML, formatos binários ou objetos serializados específicos de uma linguagem e transformá-los novamente em objetos na memória.

Sozinho, desserialização é inofensivo e comum, por exemplo:

  • Java: Lendo objetos com Fluxo de entrada de objeto
  • Python: Carregando dados com picles.load
  • Node.js: Analisando JSON com JSON.parse

O risco surge quando a desserialização é aplicada a dados não confiáveis sem validação. Um invasor pode criar uma entrada que acione uma cadeia de gadgets, caminhos de código existentes usados de maneiras não intencionais, o que pode levar à execução remota de código.

Inseguro desserialização é frequentemente encontrado em:

  • Pacotes de código aberto com padrões inseguros
  • Código personalizado que assume que a entrada serializada é confiável
  • APIs de terceiros estão retornando objetos serializados sem verificação
  • Construir artefatos tais como:
    • Java .ser arquivos contendo objetos pré-serializados.
    • Python .pkl arquivos de modelo em fluxos de trabalho de aprendizado de máquina.
    • Objetos de configuração serializados incorporados em imagens do Docker ou contêineres de implantação
  • Dispositivos de teste tais como:

    • Dados de teste serializados antigos copiados de instantâneos de produção.
    • Cargas úteis serializadas baixadas de repositórios externos para testes de desempenho ou regressão.

Esses arquivos podem ser introduzidos em um repositório e carregados automaticamente durante testes ou implantações, acionando desserialização in CI/CD pipelines antes mesmo do código chegar à produção.

Da desserialização insegura à execução remota de código: o caminho do ataque

A cadeia de exploração para desserialização insegura geralmente segue um destes padrões:

  1. Entrada não confiável entra no aplicativo.
  2. A desserialização insegura recria objetos sem restrições.
  3. Uma cadeia de gadgets aciona funcionalidades existentes de maneiras não intencionais.
  4. O invasor aumenta os privilégios e consegue executar código remotamente.

Variantes:

  • As cadeias de gadgets Java exploram bibliotecas antigas como o Apache Commons.
  • Python .pkl carregamento de modelo com objetos maliciosos incorporados.
  • Análise JSON do Node.js com eval () ou importações dinâmicas.

Fluxo:

Untrusted Input → Deserialization → Gadget Chain → Remote Code Execution

Como detectar desserialização insegura antes da mesclagem

Detectar a desserialização insegura antes da mesclagem do código é muito mais barato do que corrigi-la após a implantação. Uma combinação de análise automatizada e testes proativos funciona melhor:

  • Teste de segurança de aplicativos estáticos (SAST):
    • Configure scanners para detectar APIs arriscadas como Fluxo de entrada de objeto, picles.load e YAML.carregar sem um carregador seguro.
    • Examine o código-fonte e os artefatos de construção/teste em busca de informações inseguras desserialização padrões.
    • Exibir descobertas diretamente em pull requests para que os desenvolvedores possam resolvê-los antes da fusão.
  • CI/CD Integração:

Exemplo de fluxo de trabalho:

sql

Commit → SAST scan → PR alert → Fix before merge
  • O bloco mescla descobertas críticas de desserialização insegura para evitar que código inseguro chegue a ramificações de produção.
  • Testes Unitários com Entradas Maliciosas Simuladas:

    • Criar cargas úteis inofensivas e controladas que imitam objetos de ataque serializados comuns.
    • Teste como o aplicativo os manipula; ele deve rejeitar, higienizar ou registrar a entrada em vez de processá-la cegamente.
    • Incluir esses testes no automatizado pipeline então eles são executados em todos os PRs, detectando precocemente comportamentos de desserialização inseguros.
    • Garanta que as cargas de teste não sejam executáveis e sejam seguras para armazenamento no repositório, concentrando-se exclusivamente na lógica de detecção.

Essa abordagem em camadas combina varredura automatizada com testes de propriedade do desenvolvedor, garantindo que caminhos de desserialização inseguros sejam identificados e removidos muito antes de se tornarem vulnerabilidades de execução remota de código.

Estratégias de prevenção para desenvolvedores: impedindo que a desserialização se torne execução remota de código

  1. Limites de confiança:Deserialize somente de fontes autenticadas e verificadas.
  2. APIs seguras:

     

    • Java: Bibliotecas seguras com validação.
    • Python: Usar json.loads() Acima de picles.loads() sempre que possível.
    • Node.js: Evite eval () ou execução dinâmica de código.

       

  3. Listas de permissões e esquemas: Restringir tipos de objetos permitidos. Aplicar esquemas JSON.
  4. Higiene de dependência: Monitore CVEs que mencionam desserialização ou execução remota de código.
  5. Revisões de código: Adicionar desserialização verificações de segurança para modelos de revisão de RP.

Nota sobre ferramentas: Ferramentas como Xygeni escaneie o código e as dependências em busca de desserialização insegura antes da mesclagem, identificando áreas de alto risco para que os desenvolvedores possam corrigi-las logo.

Exemplos de padrões de detecção em diferentes idiomas (Pseudo-Código Seguro)

Todos os exemplos abaixo são pseudocódigos higienizados que mostram padrões de detecção, e não exploits funcionais:

Java – Detectando uso inseguro de API:

java
// BAD: Accepting untrusted input without validation
ObjectInputStream in = new ObjectInputStream(userInputStream);
Object obj = in.readObject(); // Unsafe - no class type checks

// GOOD: Validate allowed classes before processing
if (allowedClasses.contains(obj.getClass().getName())) {
    process(obj); // Safe processing of approved classes
}

Python – Evitando a desserialização insegura:

python
import pickle

# BAD: Loading untrusted serialized data directly
data = pickle.loads(untrusted_input)  # Unsafe - arbitrary object execution risk

# GOOD: Use JSON with schema validation
import json
data = json.loads(untrusted_input)  # Safe when validated against schema

Node.js – Impedindo a execução dinâmica de código:

javascript
// BAD: Executing code from parsed data
let obj = JSON.parse(untrustedInput);
eval(obj.code); // Unsafe - allows arbitrary code execution

// GOOD: Use fixed logic without dynamic execution
let safeObj = JSON.parse(untrustedInput);
process(safeObj); // Handle only expected properties and values

Automatizando a detecção em DevSecOps Pipelines: Detectando a desserialização antes que ela chegue à produção

A automatização da detecção de desserialização insegura garante vulnerabilidades são detectadas e corrigidas antes que levem à execução remota de código em produção.

Pipeline Exploração

  • Execute SAST no código-fonte, arquivos de configuração e artefatos de construção em cada commit.
  • Detecte padrões de desserialização inseguros no código do aplicativo e dependências.

Inspeção de Artefatos

  • Escanear .ser, .pkl, e outros arquivos serializados para padrões inseguros antes de implantar ou mesmo executar testes.

Pull Request Bloqueio

  • O bloco é mesclado se uma desserialização insegura for detectada.
  • Exiba feedback prático nos RPs para acelerar a correção.

Aplicação de Testes Unitários

  • Incluir testes unitários com entradas maliciosas simuladas no CI/CD pipeline
  • As compilações falham se o aplicativo processar dados serializados inseguros em vez de rejeitá-los.

Evitando falsos positivos sem enfraquecer as regras

  • Não desabilite as regras de detecção para “silenciar” alertas; isso pode permitir que uma desserialização realmente insegura passe despercebida.
  • Use uma lista de permissões controlada para padrões ou dependências seguras conhecidas.
  • Exigir validação de segurança antes de aprovar entradas na lista de permissões.
  • Mantenha a lista de permissões sob controle de versão e revise-a periodicamente para garantir que todas as exceções permaneçam justificadas e seguras.

O papel de Xygeni

  • Integra-se diretamente em CI/CD pipelines para escanear o código-fonte e construir artefatos.
  • Detecta padrões de desserialização inseguros e dependências arriscadas no início do ciclo de vida.
  • Oferece suporte à lista de permissões baseada em políticas com revisão de segurança obrigatória, equilibrando a precisão da detecção com a produtividade do desenvolvedor.

Ficando à frente da execução remota de código por meio da desserialização segura

A desserialização insegura pode passar despercebida até se tornar um caminho direto para a execução remota de código. Para evitá-la, é necessário:

  • Entendendo o que é desserialização e como ela pode ser abusada.
  • Incorporação de detecção automatizada no fluxo de trabalho de desenvolvimento.
  • Revisar regularmente dependências, artefatos de construção e dados serializados usados em testes.

Papel prático do Xygeni neste processo:

  • Digitalização de código-fonte: Identifica padrões de desserialização inseguros em várias linguagens antes que o código seja mesclado.
  • Análise de Artefatos e Dependências: Detecta arquivos serializados arriscados (.ser, .pkl, configuração incorporada) e componentes de terceiros com vulnerabilidades conhecidas.
  • Controles baseados em políticas: Suporta uma lista de permissões controlada com validação de segurança, garantindo que exceções necessárias não introduzam riscos reais.
  • Feedback do desenvolvedor em contexto: Sinaliza a localização exata e a causa da desserialização insegura dentro pull requests, permitindo que os desenvolvedores corrijam problemas imediatamente e confirmem a mitigação por meio de novas varreduras.

Ao integrar verificações como estas diretamente em CI/CD, as equipes podem detectar e remediar problemas inseguros desserialização antes mesmo que ela tenha a chance de evoluir para execução remota de código em produção.

sca-tools-software-composição-análise-ferramentas
Priorize, corrija e proteja seus riscos de software
você recebe uma avaliação gratuita de 7 dias da nossa licença Business Edition e pode aproveitar alguns dos recursos avançados da plataforma SecurityScorecard.
Não é necessário cartão de crédito

Proteja seu desenvolvimento e entrega de software

com o Suíte de Produtos da Xygeni