Laboratórios Docker + scanner defensivo para RCE de carregamento remoto de classe fastjson. fastjson 1.2.66-1.2.83: sonda de recurso @JSONType (CVE-2026-16723). fastjson2 2.0.57: @type do atacante alcança loadClass com autoType DESATIVADO via tipos polimórficos (@JSONType(seeAlso) / Jackson @JsonSubTypes). Payloads somente com marcador; controles safeMode + JDK17.
@JSONType e detecçãoEste repositório agora preserva duas linhas de pesquisa distintas sobre Fastjson:
modern-fd/ é a reconstrução somente-marcador recomendada da
cadeia remote-JAR/descritor de arquivo de corpo único do Fastjson 1.2.83 em Spring
Boot 3, Tomcat embarcado normal e JDK 17. Ela usa o sumidouro literal de DTO fixo
JSON.parseObject(body, BoundEnvelope.class) com AutoType desabilitado.scanner/ contém detecção passiva de requisições/logs, inventário estático
de artefatos e uma sonda de alcance não executável.O bug:
ParserConfig.checkAutoTypetesta cada valor de@typeem busca da anotação@JSONTypefazendogetResourceAsStream(typeName.replace('.','/') + ".class"). Em combinações modernas de Linux/JDK, uma sonda remotajar:httppode deixar o JAR em cache atrás de um descritor aberto; sondas posterioresjar:file:/proc/self/fd/Nno mesmo corpo podem reabri-lo sob nomes de classe válidos e inicializar uma classe anotada. A composição exata 1.2.83 funciona com AutoType desabilitado e por meio de um DTO fixo contendoList<Object>. A vinculação (binding) sozinha, portanto, não é uma mitigação. Passo a passo completo:docs/MECHANISM.md.
A revisão complementar de todo o projeto abrangeu 2,041 linhas de métodos chamáveis/inicializadores estáticos em todos os 193 arquivos Java de produção do Fastjson 1.2.83. A tabela abaixo prioriza os resultados de maior impacto; não é uma afirmação de que toda implantação do Fastjson seja afetada. Este repositório reproduz diretamente F105. As demais entradas resumem revisão de código-fonte lacrada separadamente e evidência limitada de laboratório.
| Prioridade | Achado | Resultado comprovado | Limite importante |
|---|---|---|---|
| 1 | F105 — execução remota de bytecode via @JSONType | Inicialização de classe fornecida pelo atacante por meio de classloaders Spring Boot compatíveis, incluindo a rota direta do JDK 8 e a continuação do JAR retido /proc/self/fd/N no Linux/JDK 17 | Exige um portador @type alcançável pelo parser, classloader Boot/TCCL compatível, saída de rede, SafeMode/IgnoreAutoType desativados e um JAR exato do atacante. A rota moderna de DTO fixo adicionalmente precisa de um canal de valor genérico (o laboratório usa List<Object>), procfs Linux, um descritor retido e alinhamento exato de nomes; não é universal em todos os JDKs, classloaders ou SOs |
| 2 | F1/F45 — execução de comando via TemplatesImpl | Execução de comando marcadora através da API de DTO fixo, incluindo uma propriedade ignorada do corpo da requisição | Exige política de servidor enfraquecida: admissão de classes, AutoType e preenchimento de campos privados ou caminhos equivalentes; as configurações padrão intactas bloqueiam |
| 3 | F70/C016 — buffering sem limites e expansão GZIP | Caminhos de byte/InputStream tipado e DTO anotado expandem ou fazem buffer sem limite de saída; OOME em Java com heap restrito foi reproduzido | São necessários alcance ao endpoint/esquema e a bytes controlados pelo atacante; indisponibilidade em toda a produção não foi estabelecida |
| 4 | F18/C089 — esgotamento de pilha do thread do parser | Valores comuns de objeto profundamente aninhados podem produzir StackOverflowError no parsing padrão | Impacto na disponibilidade do thread da requisição; não é uma quebra invariável da JVM ou do serviço inteiro |
| 5 | F120/C162 — SSRF HTTP de esquema fixo/carregamento de recurso local | JEditorPane/JTextPane.page controlados pelo corpo da requisição realizam requisições HTTP e podem carregar conteúdo file: limitado no estado do Document | Exige que a aplicação declare o tipo Swing; nenhum roubo automático de resposta ou RCE foi comprovado |
| 6 | F118/C160 — falha de autorização/integridade de dados por colisão de hash | Uma colisão distinta de FNV-1a-64 em Unicode pode se ligar a uma constante de enumeração privilegiada ou direcionar mutação JSONPath para o setter errado do bean | Exige uma colisão utilizável e confiança a jusante ou uma operação exposta de mutação JSONPath; nenhuma admissão de classe ou RCE |
| 7 | F121/C163 — alcance JNDI fixo do JdbcRowSet | A ordem exata dos setters causou uma conexão JNDI/LDAP de saída selecionada pelo corpo | A evidência para em uma conexão: sem resposta de naming, object factory, carregamento de bytecode ou RCE |
| 8 | F2/F45 — resolução DNS padrão | A resolução de hostname controlada pelo atacante funciona na configuração padrão e por meio de uma propriedade ignorada do DTO fixo | Apenas interação DNS/OOB, não SSRF HTTP genérico ou RCE |
Consulte findings/FINDINGS.md para rótulos de validação,
pré-requisitos, achados de nível inferior, prioridades de remediação e limites
negativos explícitos.
Este repositório é para educação, pesquisa defensiva e testes autorizados de sistemas
que você possui ou para os quais tem permissão explícita de testar. A publicação em host,
quando suportada para a rede interna do laboratório moderno, deve ser feita apenas em
127.0.0.1; os scripts conduzem o teste inteiramente dentro dessa rede isolada.
O laboratório moderno não possui primitiva de execução de processos e define apenas um
marcador fixo dentro da JVM.
O laboratório legado com JDK 8 executa id e grava sua saída em /tmp/PWNED; mantenha-o
isolado. Não aponte o exploit legado ou a sonda ativa para sistemas não autorizados.
O diretório scanner/ fornece quatro ferramentas Python 3 sem dependências (sem
instalações via pip).
fjdetect.py — inspeciona passivamente corpos de requisição JSON decodificados ou logs
JSON estruturados em busca de sementes remote-JAR e sequências /proc/self/fd ou /dev/fd.fjscan_static.py — inventaria jars/wars/ears para a combinação vulnerável
(1.2.83 com verificação de conteúdo e metadados × conteúdo real das classes do Spring Boot
loader). Versões 1.2.48–1.2.82 com sondas e candidatos apenas por metadados/nome de arquivo
são relatados separadamente para revisão. Compatível com gate de CI (código de saída 2 em EXPOSED).fjscan_probe.py — verificação ativa e segura de alcance: dispara o @type contra um canário
que você controla (listener embutido ou Burp Collaborator / interactsh) e correlaciona o
callback de busca de recurso. Seu listener embutido retorna um 404 vazio; configure
listeners externos de forma equivalente. Um callback não prova carregamento de classe ou RCE.fjpayload.py — gera corpos de busca de recurso remoto para testes manuais;
use apenas um listener vazio/404 quando a execução não for pretendida.# 1) passive request/log inspection
python3 scanner/fjdetect.py --ndjson gateway.jsonl
# 2) inventory build artifacts / unpacked images (parallel)
python3 scanner/fjscan_static.py /path/to/artifacts --threads 16