
Sicherheitsforschung zu Liferay CE 7.0.3 GA4: Pre-Auth-RCE als Root (CVE-2020-7961-Klasse) Ende-zu-Ende reproduziert, plus 16 weitere Erkenntnisse — 8+ ohne bekannte CVE. Agentischer Loop-Hunt: 25 Generatoren, 22 Prüfer, 9 Live-Validatoren auf Docker. Beweiskette + Ein-Klick-Checker enthalten.
Ein Sicherheitsaudit von Liferay Portal CE 7.0.3 GA4 (Git-Tag 7.0.3-ga4, Commit
b2d7cc68a), durchgeführt mit der RAPTOR-Loop-Hunt-Methodik:
deterministische Aufklärung → 25 isolierte Generator-Agenten, die aus dem Rohquellcode lesen → 22 unabhängige
Judge-Agenten, die anhand des Rohquellcodes widerlegen → 9 Live-Validatoren, die eine echte GA4-Instanz in Docker angreifen.
Kernaussage: Nicht authentifizierte RCE als
rootEnde-zu-Ende reproduziert (Klasse CVE-2020-7961), plus 8 weitere live-verifizierte Schwachstellen – einige davon ohne bekannte CVE.
⚠️ Rechtlich/ethisch: Alles hier richtet sich gegen eine selbst gehostete Testinstanz. Liferay CE 7.0 ist End-of-Life (letzte Veröffentlichung 7.0.6 GA7, 2018); diese Probleme sind upstream nicht gepatcht. Verwenden Sie dieses Material nur gegen Systeme, die Ihnen gehören oder für die Sie ausdrücklich autorisiert sind, sie zu testen.
Status: ✅ live-verifiziert gegen die Docker-GA4-Instanz · 🔬 per Code bestätigt (unabhängiger Judge hat die vollständige Spur aus dem Rohquellcode rekonstruiert) · 🧪 benötigt Konfiguration / konfigurationsabhängig.
| ID | Befund | Schweregrad | Auth | Status | Nachweis |
|---|---|---|---|---|---|
| F-1 | JSONWS-Typ-Override → beliebige Klasseninstanziierung + Setter → RCE als root (c3p0 HexAsciiSerializedMap → ObjectInputStream → AspectJWeaver-Dateischreib-Gadget → JSP) | Kritisch | keine | ✅ | verified/f1-jsonws-deser-rce.md |
| F-2 | /poller/* jabsorb javaClass-Hinweis → beliebige Klasseninstanziierung + Feldinjektion, vor der userId-Validierung | Hoch (potenziell) | jedes Konto (Selbstregistrierung standardmäßig aktiv) | ✅ Senke / RCE-Zweig offen | verified/F-2-poller.md |
| F-4 | XML-RPC pingback.ping Abruf-vor-Validierung → blinde SSRF + interner Port-Orakel (erreichte Gogo-Shell auf 127.0.0.1:11311) | Mittel | keine | ✅ | verified/f4-xmlrpc-pingback-ssrf.md |
| F-5 | SyncDownloadServlet versionId-IDOR → jede DL-Dateiversion lesen (cross-site, keine VIEW-Prüfung auf dem gestreamten Objekt) | Hoch | keine (über einen für Gäste sichtbaren „leg") | ✅ | verified/F-5.md |
| F-6 | XSL-Template-Engine ignoriert Sandboxing (secureProcessing=false, restricted verworfen) → document()-SSRF und XSLTC rt:exec-Befehlsausführung | Kritisch | Site-Template-Autor | ✅ | verified/F-6-F-7-template-engines.md |
| F-7 | Velocity und FreeMaker eingeschränkte Templates legen rohes propsUtil / saxReaderUtil offen → Offenlegung von Portal-Eigenschaften + file:// für Gäste | Hoch | Template-Autor | ✅ | verified/F-6-F-7-template-engines.md |
| F-8 | Image_-Tabellen-IDOR über /image/*?img_id=N — kein Token, präfixbezogene Prüfungen durch Präfixwechsel umgangen, fortlaufende IDs aufzählbar | Mittel | keine | ✅ | verified/f-8-image-idor.md |
| F-11 | SimpleCaptcha = 4-stellige PIN, wird bei falschen Versuchen nie ungültig, Gästezähler wird nie erhöht → nach ca. 5.000 Anfragen gebrochen | Mittel | keine | ✅ | verified/f11-f12-captcha-reminder.md |
| F-12 | Passwort-vergessen: Benutzer-Enumeration + Antwort-Orakel für Erinnerungsfrage ohne Captcha (Fresh-Session-Bypass); leere Antwort erzeugt ein echtes Reset-Ticket für Konten ohne Sicherheitsfrage | Mittel-Hoch | keine | ✅ | verified/f11-f12-captcha-reminder.md |
| F-13 | Web Content Display Request-Param-Override (groupId/articleId/ddmTemplateKey) → Cross-Site-Lesen von Nicht-Gast-Artikeln (Standard journal.article.view.permission.check.enabled=false) | Hoch | keine (benötigt ein WCD auf einer Gästeseite) | ✅ | verified/F-13-wcd-param-override.md |
| F-3 | OSGi-Axis-Extender überspringt ServiceAccessPolicy / Remote-Access-Kennzeichnung bei Modul-SOAP-Diensten | Mittel (Hoch mit WSDD-Modul) | keine | 🔬 | judge/axis-spring-remoting.md |
| F-9 | OpenID verknüpft das Opferkonto mit der OpenID des Angreifers, bevor die Assertion verifiziert wird → Kontoverletzung (Account Takeover) | Hoch | keine (OpenID aktiviert, nicht Standard) | 🔬 🧪 | judge/sso-autologin.md |
| F-10 | TunnelServlet readObject nur durch eine Klassen-Blacklist geschützt; ROME/JdbcRowSetImpl/c3p0/AspectJWeaver-Gadgets im Klassenpfad | Kritisch (potenziell) | vertrauenswürdiger Peer (gemeinsames Geheimnis + erlaubter Host) | ✅ Barrieren halten vor der Authentifizierung | verified/f10-f20-tunnel-auth-pipeline.md |
| F-14 | TokenAutoLogin vertraut einem rohen SM_USER-Header (keine Verifizierung, keine IP-Whitelist) | Mittel | keine (Token-SSO aktiviert, nicht Standard) | 🔬 🧪 | judge/sso-autologin.md |
| F-15 | Site-Admin-LAR-Import schmuggelt RolesAdminPortletDataHandler ein → massenhafte Löschung von Unternehmensrollen / Berechtigungs-Wipe | Mittel | Site-Administrator | 🔬 | judge/export-import-lar.md |
| F-16 | OpenSocial (nicht im Standard-Bundle): Pre-Auth-makeRequest-SSRF, /gadgets/ifr-Origin-JS, fälschbare Sicherheitstokens → Identitätsübernahme, gespeichertes XSS | Hoch ×4 | keine / Site-Mitglied | 🔬 (abhängig von der Bereitstellung) | judge/opensocial-shindig.md |
| F-17 | WSRP (nicht im Standard-Bundle): Pre-Auth-ProxyServlet-SSRF; Markup-Endpunkt → beliebiges Portlet-Rendering + Persistenz der Layout-typeSettings | Mittel | keine | 🔬 (abhängig von der Bereitstellung) | judge/wsrp.md |
Vollständige kuratierte Liste mit Ablehnungen: FINDINGS.md · narrativer Bericht: REPORT.md
Katalog von etwa 50 bekannten Liferay-7.0.x-Problemen als Vorwissen (Prior Art): PRIOR-ART.md
(OSV [email protected], NVD-Durchsuchung, Code-White-/CERT-EU-Advisories).