
Analyse approfondie d'un IDOR pour Concrete CMS, couvrant le point de terminaison message_detail, la cause racine de l'absence d'autorisation, les scénarios d'attaque, l'impact et le correctif.
CVE-2026-8237 est une vulnérabilité de type Insecure Direct Object Reference (IDOR) causée par des contrôles d'autorisation manquants dans Concrete CMS 9.5.0 et versions antérieures. La faille se trouve dans le point de terminaison /ccm/frontend/conversations/message_detail, qui renvoie le contenu complet des messages de conversation en se basant uniquement sur un identifiant de message fourni par l'utilisateur. Comme l'application ne vérifie pas si le demandeur est autorisé à accéder au message spécifié, un attaquant non authentifié peut énumérer les identifiants de messages et récupérer le contenu de conversations qui devrait rester privé. Les URL de téléchargement des pièces jointes associées à ces messages peuvent également être divulguées. Le problème est corrigé dans Concrete CMS 9.5.1.
| Propriété | Valeur |
|---|---|
| Produit | Concrete CMS |
| Versions affectées | 9.5.0 et versions antérieures |
| Version corrigée | 9.5.1 |
| Point de terminaison affecté | /ccm/frontend/conversations/message_detail |
Le point de terminaison récupère un message de conversation à l'aide d'un identifiant de message contrôlé par le client, sans vérifier si l'utilisateur actuel a la permission d'accéder à ce message spécifique.
Le flux vulnérable est conceptuellement :
L'utilisateur fournit messageId
↓
Le serveur récupère le message
↓
Aucune vérification d'autorisation
↓
Renvoie le contenu complet du message
Comme les droits de propriété ou d'accès ne sont jamais vérifiés, les attaquants peuvent modifier la valeur de messageId pour accéder aux messages de conversation d'autres utilisateurs.
Supposons qu'une requête légitime récupère le message 150 :
GET /ccm/frontend/conversations/message_detail?messageId=150
Un attaquant change simplement l'identifiant :
GET /ccm/frontend/conversations/message_detail?messageId=151
Si le serveur répond avec le contenu du message 151 au lieu de refuser l'accès, l'attaquant peut continuer à incrémenter les identifiants pour énumérer les conversations privées et leurs pièces jointes associées.
Une exploitation réussie peut permettre à un attaquant de :
La vulnérabilité a principalement un impact sur la confidentialité, car des informations sensibles peuvent être divulguées sans autorisation.
| Métrique | Score |
|---|---|
| CVSS v3.1 (NVD) | 5.3 (Moyen) |
| CVSS v4.0 (Concrete CMS) |
Remarque : L'éditeur n'a pas publié le code source vulnérable réel. L'exemple suivant illustre uniquement le schéma de vulnérabilité.
$messageId = $_GET['messageId'];
$message = $conversationRepository->find($messageId);
// Missing authorization check
return response()->json([
'message' => $message->getContent(),
'attachments' => $message->getAttachments()
]);
L'application fait confiance au messageId contrôlé par l'utilisateur et renvoie le message demandé sans confirmer que le demandeur est autorisé à y accéder.
$messageId = $_GET['messageId'];
$message = $conversationRepository->find($messageId);
if (!$authorizationService->canView($currentUser, $message)) {
return response()->json([
'error' => 'Access denied'
], 403);
}
return response()->json([
'message' => $message->getContent(),
'attachments' => $message->getAttachments()
]);
L'implémentation corrigée effectue une vérification d'autorisation côté serveur avant de renvoyer toute donnée de conversation. Même si un attaquant modifie le messageId, la requête est refusée à moins que l'utilisateur n'ait la permission d'accéder à ce message spécifique. Cela empêche la divulgation non autorisée du contenu des conversations et des pièces jointes.
| 6.3 (Moyen) |