
Pesquisa de segurança no Liferay CE 7.0.3 GA4: RCE pré-autenticação como root (classe CVE-2020-7961) reproduzida de ponta a ponta, mais 16 outras descobertas — 8+ sem CVE conhecido. Caça em loop agêntico: 25 geradores, 22 juízes, 9 validadores ao vivo no Docker. Trilha de evidências + verificador de uma passada incluídos.
Uma auditoria de segurança do Liferay Portal CE 7.0.3 GA4 (git tag 7.0.3-ga4, commit b2d7cc68a) realizada com a metodologia RAPTOR loop-hunt: reconhecimento determinístico → 25 agentes geradores isolados lendo o código-fonte bruto → 22 agentes juízes independentes refutando a partir do código bruto → 9 validadores ao vivo atacando uma instância GA4 real no Docker.
Destaque: RCE não autenticado como
rootreproduzido de ponta a ponta (classe CVE-2020-7961), além de mais 8 vulnerabilidades verificadas ao vivo — várias delas sem CVE conhecido.
⚠️ Legal/ético: tudo aqui tem como alvo uma instância de teste auto-hospedada. O Liferay CE 7.0 está em fim de vida (última versão 7.0.6 GA7, 2018); esses problemas não têm correção upstream. Use este material apenas contra sistemas que você possui ou que está explicitamente autorizado a testar.
Status: ✅ verificado ao vivo contra a instância GA4 no Docker · 🔬 confirmado por código (juiz independente re-derivou o rastreamento completo a partir do código-fonte bruto) · 🧪 requer/condicionado à configuração.
| ID | Descoberta | Gravidade | Autenticação | Status | Evidência |
|---|---|---|---|---|---|
| F-1 | Sobrescrita de tipo JSONWS → instanciação arbitrária de classes + setters → RCE como root (c3p0 HexAsciiSerializedMap → ObjectInputStream → AspectJWeaver file-write → JSP) | Crítico | nenhuma | ✅ | verified/f1-jsonws-deser-rce.md |
| F-2 | /poller/* dica de javaClass do jabsorb → instanciação arbitrária de classes + injeção de campos, antes da validação do userId | Alto (potencial) | qualquer conta (auto-registro ativado por padrão) | ✅ sink / vetor de RCE aberto | verified/F-2-poller.md |
| F-4 | XML-RPC pingback.ping busca-antes-de-validar → SSRF cego + oráculo de porta interna (alcançou o shell Gogo em 127.0.0.1:11311) | Médio | nenhuma | ✅ | verified/f4-xmlrpc-pingback-ssrf.md |
| F-5 | SyncDownloadServlet IDOR de versionId → lê qualquer versão de arquivo DL (cross-site, sem verificação VIEW no objeto transmitido) | Alto | nenhuma (via "leg" visível a convidados) | ✅ | verified/F-5.md |
| F-6 | O mecanismo de template XSL ignora o sandboxing (secureProcessing=false, restricted descartado) → SSRF via document() e execução de comandos via XSLTC rt:exec | Crítico | autor de template do site | ✅ | verified/F-6-F-7-template-engines.md |
| F-7 | Templates restritos do Velocity e do FreeMarker expõem propsUtil / saxReaderUtil brutos → divulgação de propriedades do portal + file:// para convidados | Alto | autor de template | ✅ | verified/F-6-F-7-template-engines.md |
| F-8 | IDOR na tabela Image_ via /image/*?img_id=N — sem token, verificações com escopo de prefixo contornadas por troca de prefixo, ids sequenciais enumeráveis | Médio | nenhuma | ✅ | verified/f-8-image-idor.md |
| F-11 | SimpleCaptcha = PIN de 4 dígitos, nunca invalidado em tentativas erradas, contador de convidados nunca é incrementado → quebra em ~5 mil requisições | Médio | nenhuma | ✅ | verified/f11-f12-captcha-reminder.md |
| F-12 | Recuperação de senha: enumeração de usuários + oráculo de resposta de lembrete sem captcha (bypass por sessão nova); resposta vazia dispara um ticket de redefinição real para contas sem pergunta de lembrete | Médio-Alto | nenhuma | ✅ | verified/f11-f12-captcha-reminder.md |
| F-13 | Substituição de parâmetro de requisição no Web Content Display (groupId/articleId/ddmTemplateKey) → leitura cross-site de artigos não destinados a convidados (journal.article.view.permission.check.enabled=false por padrão) | Alto | nenhuma (requer um WCD em uma página de convidado) | ✅ | verified/F-13-wcd-param-override.md |
| F-3 | O axis-extender do OSGi ignora a ServiceAccessPolicy / a marcação de acesso remoto em serviços SOAP de módulos | Médio (Alto com módulo WSDD) | nenhuma | 🔬 | judge/axis-spring-remoting.md |
| F-9 | O OpenID vincula a conta da vítima ao OpenID do atacante antes da verificação da asserção → tomada de conta | Alto | nenhuma (OpenID ativado, não padrão) | 🔬 🧪 | judge/sso-autologin.md |
| F-10 | readObject do TunnelServlet protegido apenas por uma blacklist de classes; gadgets ROME/JdbcRowSetImpl/c3p0/AspectJWeaver no classpath | Potencial crítico | peer confiável (segredo compartilhado + host permitido) | ✅ barreiras se mantêm pré-autenticação | verified/f10-f20-tunnel-auth-pipeline.md |
| F-14 | O TokenAutoLogin confia em um cabeçalho SM_USER puro (sem verificação, sem allowlist de IP) | Médio | nenhuma (token SSO ativado, não padrão) | 🔬 🧪 | judge/sso-autologin.md |
| F-15 | A importação de LAR por admin do site contrabandeia RolesAdminPortletDataHandler → exclusão em massa de papéis da empresa / limpeza de permissões | Médio | admin do site | 🔬 | judge/export-import-lar.md |
| F-16 | OpenSocial (não está no bundle padrão): SSRF makeRequest pré-autenticação, JS de origem /gadgets/ifr, tokens de segurança forjáveis → personificação, XSS armazenado | Alto ×4 | nenhuma / membro do site | 🔬 (condicional ao deployment) | judge/opensocial-shindig.md |
| F-17 | WSRP (não está no bundle padrão): SSRF ProxyServlet pré-autenticação; endpoint de markup → renderização arbitrária de portlet + persistência de typeSettings do layout | Médio | nenhuma | 🔬 (condicional ao deployment) | judge/wsrp.md |
Lista completa curada com rejeições: FINDINGS.md · relatório narrativo: REPORT.md
Catálogo de ~50 problemas conhecidos do Liferay 7.0.x usado como conhecimento prévio: PRIOR-ART.md (varredura OSV [email protected], varredura NVD, avisos da Code White / CERT-EU).