Recherche en sécurité sur Liferay CE 7.0.3 GA4 : RCE pré-authentification en tant que root (classe CVE-2020-7961) reproduite de bout en bout, plus 16 autres découvertes — 8+ sans CVE connu. Chasse en boucle agentique : 25 générateurs, 22 juges, 9 validateurs en direct sur Docker. Piste de preuves + vérificateur en une passe inclus.
Un audit de sécurité de Liferay Portal CE 7.0.3 GA4 (tag git 7.0.3-ga4, commit
b2d7cc68a) réalisé avec la méthodologie RAPTOR loop-hunt :
reconnaissance déterministe → 25 agents générateurs isolés lisant le code source brut → 22 agents juges
indépendants réfutant à partir du code brut → 9 validateurs en conditions réelles attaquant une véritable instance GA4 dans Docker.
Titre : RCE non authentifié en tant que
rootreproduit de bout en bout (classe CVE-2020-7961), plus 8 vulnérabilités supplémentaires vérifiées en conditions réelles — plusieurs sans CVE connu.
⚠️ Aspects légaux/éthiques : tout ceci cible une instance de test auto-hébergée. Liferay CE 7.0 est en fin de vie (dernière version 7.0.6 GA7, 2018) ; ces problèmes ne sont pas corrigés en amont. N'utilisez ce contenu que contre des systèmes qui vous appartiennent ou pour lesquels vous êtes explicitement autorisé à tester.
Statut : ✅ vérifié en conditions réelles contre l'instance GA4 sous Docker · 🔬 confirmé par le code (un juge indépendant a redérivé la trace complète du code source brut) · 🧪 nécessite une config / conditionné par la config.
| ID | Découverte | Gravité | Authentification | Statut | Preuve |
|---|---|---|---|---|---|
| F-1 | Surcharge de type JSONWS → instanciation arbitraire de classes + setters → RCE en tant que root (c3p0 HexAsciiSerializedMap → ObjectInputStream → gadget d'écriture de fichier AspectJWeaver → JSP) | Critique | aucune | ✅ | verified/f1-jsonws-deser-rce.md |
| F-2 | Indice javaClass jabsorb sur /poller/* → instanciation arbitraire de classes + injection de champs, avant la validation du userId | Élevée (potentielle) | tout compte (auto-inscription activée par défaut) | ✅ sink confirmé / bras RCE ouvert | verified/F-2-poller.md |
| F-4 | XML-RPC pingback.ping : récupération avant validation → SSRF aveugle + oracle de ports interne (a atteint le shell Gogo sur 127.0.0.1:11311) | Moyenne | aucune | ✅ | verified/f4-xmlrpc-pingback-ssrf.md |
| F-5 | IDOR versionId sur SyncDownloadServlet → lire n'importe quelle version de fichier DL (intersite, aucun contrôle VIEW sur l'objet diffusé) | Élevée | aucune (via « leg » visible par les invités) | ✅ | verified/F-5.md |
| F-6 | Le moteur de templates XSL ignore le sandboxing (secureProcessing=false, restricted supprimé) → SSRF document() et exécution de commandes XSLTC rt:exec | Critique | auteur de template du site | ✅ | verified/F-6-F-7-template-engines.md |
| F-7 | Les templates restreints Velocity et FreeMarker exposent propsUtil / saxReaderUtil bruts → divulgation de propriétés du portail + file:// aux invités | Élevée | auteur de template | ✅ | verified/F-6-F-7-template-engines.md |
| F-8 | IDOR sur la table Image_ via /image/*?img_id=N — aucun jeton, contrôles limités au préfixe contournés par échange de préfixe, identifiants séquentiels énumérables | Moyenne | aucune | ✅ | verified/f-8-image-idor.md |
| F-11 | SimpleCaptcha = PIN à 4 chiffres, jamais invalidé après des erreurs, le compteur d'invités n'incrémente jamais → cassage en ~5 000 requêtes | Moyenne | aucune | ✅ | verified/f11-f12-captcha-reminder.md |
| F-12 | Mot de passe oublié : énumération d'utilisateurs + oracle de réponse de rappel sans captcha (contournement par nouvelle session) ; une réponse vide déclenche un véritable ticket de réinitialisation pour les comptes sans question | Moyenne-Élevée | aucune | ✅ | verified/f11-f12-captcha-reminder.md |
| F-13 | Écrasement des paramètres de requête du Web Content Display (groupId/articleId/ddmTemplateKey) → lecture intersite d'articles non destinés aux invités (défaut journal.article.view.permission.check.enabled=false) | Élevée | aucune (nécessite un WCD sur une page invitée) | ✅ | verified/F-13-wcd-param-override.md |
| F-3 | L'axis-extender OSGi ignore ServiceAccessPolicy / le marquage d'accès distant sur les services SOAP de modules | Moyenne (Élevée avec module WSDD) | aucune | 🔬 | judge/axis-spring-remoting.md |
| F-9 | OpenID lie le compte de la victime à l'OpenID de l'attaquant avant la vérification de l'assertion → prise de contrôle du compte | Élevée | aucune (OpenID activé, non défaut) | 🔬 🧪 | judge/sso-autologin.md |
| F-10 | readObject de TunnelServlet protégé uniquement par une liste noire de classes ; gadgets ROME/JdbcRowSetImpl/c3p0/AspectJWeaver sur le classpath | Potentiel critique | pair de confiance (secret partagé + hôte autorisé) | ✅ les barrières tiennent avant auth | verified/f10-f20-tunnel-auth-pipeline.md |
| F-14 | TokenAutoLogin se fie à un en-tête SM_USER nu (aucune vérification, aucune liste blanche d'IP) | Moyenne | aucune (SSO par jeton activé, non défaut) | 🔬 🧪 | judge/sso-autologin.md |
| F-15 | L'import LAR par un admin de site fait passer en fraude RolesAdminPortletDataHandler → suppression massive de rôles d'entreprise / effacement des permissions | Moyenne | admin de site | 🔬 | judge/export-import-lar.md |
| F-16 | OpenSocial (absent du bundle par défaut) : SSRF makeRequest pré-auth, JS d'origine /gadgets/ifr, jetons de sécurité forgeables → usurpation d'identité, XSS stocké | Élevée ×4 | aucune / membre du site | 🔬 (conditionnel au déploiement) | judge/opensocial-shindig.md |
| F-17 | WSRP (absent du bundle par défaut) : SSRF ProxyServlet pré-auth ; endpoint markup → rendu arbitraire de portlet + persistance typeSettings du layout | Moyenne | aucune | 🔬 (conditionnel au déploiement) | judge/wsrp.md |
Liste complète organisée avec les rejets : FINDINGS.md · rapport narratif : REPORT.md