CVE-2021-35464
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply updates per vendor instructions.
Resumo
Deserialização Java insegura no parâmetro jato.pageSession do ForgeRock Access Management (antigo OpenAM), explorável sem autenticação com uma única requisição HTTP para endpoints /ccversion/*. Resulta em execução remota de código no contexto do usuário que roda o AM. Está no catálogo KEV da CISA por exploração confirmada, inclusive contra pelo menos um órgão governamental, o que torna o CVSS 9.8 condizente com o risco real — não é um caso de 'crítico no papel, irrelevante na prática'.
Detalhamento técnico
A falha é uma deserialização de dados não confiáveis (CWE-502) no componente Sun ONE Application Framework (JATO), um framework legado de páginas web herdado de versões antigas do Java EE que o ForgeRock AM manteve internamente para renderizar certas páginas administrativas/de versão. O parâmetro jato.pageSession, presente em múltiplas páginas do produto, carrega um objeto Java serializado (tipicamente codificado em base64) que o servidor desserializa diretamente ao processar a requisição, sem validar o tipo ou a origem dos dados.
O atacante controla o conteúdo desse blob serializado. Como não há filtro de classes (ObjectInputFilter/allowlist) nem verificação de integridade, é possível construir uma cadeia de gadgets (bibliotecas Java presentes no classpath do AM, como as tipicamente usadas por ysoserial) que, ao serem reconstruídas pela JVM durante a desserialização, executam código arbitrário antes mesmo de qualquer lógica de negócio ser alcançada.
O vetor de rede são os endpoints /ccversion/Version, /ccversion/Masthead e /ccversion/ButtonFrame — três páginas do console administrativo do JATO que não exigem sessão válida para serem acessadas, o que elimina a barreira de autenticação. A descrição do fornecedor associa a causa raiz ao uso do JATO em conjunto com Java 8 ou anterior, versões em que certas proteções de desserialização introduzidas em JDKs mais novos (filtros globais de serialização) não estão disponíveis ou não são aplicadas pelo AM.
Como é explorada
O ataque é pré-autenticação e de baixa complexidade: uma única requisição HTTP (GET ou POST, dependendo do endpoint) para uma das três rotas /ccversion/* com o parâmetro jato.pageSession contendo o payload serializado é suficiente para acionar a desserialização. Não há necessidade de configuração não padrão do AM nem de conhecimento prévio de credenciais — é isso que justifica AC:L, PR:N e UI:N no vetor CVSS.
Existe módulo Metasploit, template Nuclei e PoC pública, o que baixou drasticamente a barreira técnica para exploração em massa a partir de scanners automatizados. A CISA registrou o CVE no catálogo KEV com evidência de exploração ativa, e há relato documentado de atores de ameaça avançados (APT) usando essa falha para obter acesso inicial a redes corporativas e governamentais, a partir do qual pivotaram lateralmente e implantaram ferramentas adicionais.
O resultado final da exploração é execução de código com os privilégios do processo do AM — que, segundo o próprio fornecedor, não deveria rodar como root, mas frequentemente roda com privilégios suficientes para leitura de configurações sensíveis (segredos de integração, chaves de assinatura de tokens SSO) e movimentação lateral, dado o papel central que o AM ocupa como provedor de identidade/SSO na rede.
Versões
Como se proteger
A correção definitiva é atualizar para ForgeRock AM 7.0 ou versão posterior, onde o fornecedor removeu ou isolou o uso vulnerável do JATO. Para quem não pode migrar imediatamente, o ForgeRock publicou orientações e hotfixes para ramos anteriores no knowledge base article a47894244 (backstage.forgerock.com) — consulte esse artigo para a versão exata de hotfix aplicável ao seu branch (6.5.x, 6.0.x, 5.5.x), já que os números de patch variam por linha de release e não estão confirmados aqui com precisão suficiente para citar.
Como controle compensatório imediato, bloquear ou restringir acesso externo aos endpoints /ccversion/Version, /ccversion/Masthead e /ccversion/ButtonFrame (via proxy reverso, WAF ou regra de firewall de aplicação) reduz a superfície de ataque sem exigir downtime de upgrade — mas é paliativo, não correção, pois qualquer outra página que use jato.pageSession pode estar igualmente exposta caso novos vetores sejam descobertos. Rodar o processo do AM sem privilégios de root/administrador limita o impacto de uma exploração bem-sucedida, mas não impede a execução de código nem o acesso a segredos legíveis pelo próprio processo.
Não funciona como mitigação: apenas trocar a versão do JDK (Java 9+) sem atualizar o AM, pois a causa raiz está na lógica de desserialização do próprio componente JATO dentro do produto, não somente no comportamento padrão da JVM.
Como detectar
Em logs de acesso HTTP/proxy, procure requisições para /ccversion/Version, /ccversion/Masthead ou /ccversion/ButtonFrame contendo o parâmetro jato.pageSession com valor longo em base64 — objetos Java serializados frequentemente começam com a sequência 'rO0AB' (correspondente aos magic bytes 0xACED do formato de serialização Java) antes da codificação em URL. Volume anômalo de requisições a esses três endpoints específicos, especialmente sem sessão autenticada prévia, é indicativo forte de tentativa de exploração ou de varredura automatizada com os módulos Metasploit/Nuclei públicos.
Não há um sinal 100% confiável de exploração bem-sucedida apenas pelo tráfego de rede — a confirmação exige correlacionar com comportamento pós-exploração no host (processos filhos inesperados gerados pelo processo do AM, conexões de saída não usuais, criação de artefatos/webshells), já que a própria requisição de exploração é indistinguível de uma tentativa falha sem inspeção de payload e resposta do servidor.