2 août 2021

[CVE-2021-26545] [CVE-2021-26546] [CVE-2021-26547] [CVE-2021-26548] [CVE-2021-28932] [CVE-2021-31413]: Multiples vulnérabilités au sein d’une solution de Relations Presse v5.2.38.1.1

Introduction

Il y a quelques mois, BSSI a effectué des tests d’intrusion sur une solution de Relations Presse d’un client.

Cet article décrit cinq vulnérabilités découvertes par l’équipe d’audit de BSSI lors de ces tests. Elles affectent la version 5.2.38.1.1.

L’interface d’administration permet de configurer facilement un site web de relations publiques :

Figure 1 : Interface d’administration de l’application

Lors des tests, les auditeurs ont constaté que 6 champs n’étaient pas encodés avant d’être réutilisés par l’application. L’absence de filtrage sur ces champs permettait à un attaquant d’injecter du code JavaScript arbitraire qui aurait pu ensuite être exécuté côté client.

Première vulnérabilité – Injection JavaScript (XSS) sur le tableau de bord de l’administrateur (CVE-2021-26545)

La première vulnérabilité permettait à un attaquant authentifié d’injecter du code malveillant s’exécutant du côté client (JavaScript) dans des pages web visitées par d’autres administrateurs (XSS stocké).

Les tests effectués par les auditeurs ont révélé un paramètre vulnérable aux injections de type Cross-Site Scripting (XSS). Il a été identifié dans la page du tableau de bord de l’interface d’administration (https://REDACTED.XXX.link/dashboard).

Le premier champ vulnérable était le titre (champ title) des articles. Un pare-feu (NinjaFirewall WP+) empêchait l’injection d’une charge utile malveillante complète dans ce champ, mais il a été possible de contourner cette protection en injectant le début et la fin de la charge utile malveillante dans deux titres d’articles différents :

Figure 2 : Le fractionnement de la charge utile permet de contourner le pare-feu

Lorsque le tableau de bord était affiché, la charge utile malveillante était alors reconstruite puis exécutée :

Figure 3 : Reconstruction et exécution de la charge utile

Deuxième vulnérabilité – injection de JavaScript (XSS) sur une page d’article (CVE-2021-26546)

Le second champ vulnérable était img_caption, la légende des images des articles. La politique de sécurité du contenu (CSP) empêchait l’injection d’un script provenant de sources non fiables, mais il a été possible de contourner cette protection en utilisant une fonction de callback hébergée dans un domaine de confiance :

Figure 4 : L’utilisation d’une fonction de callback hébergée dans un domaine de confiance pouvait contourner la politique de sécurité

Lorsqu’un utilisateur accédait à l’article, la charge utile malveillante était exécutée :

Figure 5 : Le champ img_caption n’a pas été filtré.

Troisième vulnérabilité – injection de JavaScript (XSS) sur une page (CVE-2021-26547 et CVE-2021-26548)

Deux autres paramètres vulnérables ont été identifiés durant l’audit. Les champs content et cp_teaser n’étaient pas filtrés avant d’être réutilisés dans un JavaScript au format json. La charge utile devait être formatée d’une manière spécifique pour que le script préexistant soit toujours dans un format json valide et puisse être exécuté :

Figure 6 : Les champs content et cp_teaser n’étaient pas filtrés

Lorsqu’un utilisateur accédait à l’article, la charge utile malveillante était exécutée :

Figure 7 : Exploitation d’une XSS au sein d’un article

Quatrième et cinquième vulnérabilités – injection de JavaScript (XSS) sur une page d’article (CVE-2021-28932 and CVE-2021-31413)

Deux derniers champs vulnérables ont été identifiés. Les sous-titres et surtitres (champs cp_overtitle & cp_subtitle1) des articles :

Figure 8 : Deux autres champs vulnérables dans un article

Une charge utile telle que <META HTTP-EQUIV= »refresh » CONTENT= »0;url=https://evil.com »> pouvait rediriger instantanément n’importe quel utilisateur vers un site web malveillant.

Conclusion

Dès la découverte des vulnérabilités, l’équipe d’audit de BSSI a contacté et signalé les vulnérabilités à l’équipe DevOps (responsable du produit). Un correctif a été mis à disposition le 23 mars 2021 (correspondant à la version 5.2.38.1.2). Ce patch corrige effectivement 3 des vulnérabilités bien qu’il n’y ait pas de changelog public. Le 29 juin 2021, un pare-feu a été ajouté pour corriger les deux dernières vulnérabilités.

Ces vulnérabilités sont maintenant connues sous les appellations CVE-2021-26545, CVE-2021-26546, CVE-2021-26547, CVE-2021-26548, CVE-2021-28932 et CVE-2021-31413.

Chronologie

15/01/2021 – Découverte des vulnérabilités
19/01/2021 – Premier contact avec l’équipe de développement de la solution
02/01/2021 – Demande de CVE ID envoyée au Mitre
01/02/2021 – 4 CVE ID attribués par le Mitre
03/02/2021 – Relance de l’équipe de développement de la solution
03/02/2021 – Les vulnérabilités sont prétendument corrigées
04/03/2021 – Vérification des corrections (1/3 corrigé) + Découverte de nouvelles vulnérabilités (2 vulnérabilités)
19/03/2021 – Relance de l’équipe de développement de la solution
23/03/2021 – Les vulnérabilités sont censées être corrigées à l’aide du patch V5.2.38.1.2
24/03/2021 – Vérification des corrections (3/5 patchés)
08/04/2021 – Relance de l’équipe de développement de la solution
16/04/2021 – Demande de CVE ID envoyée au Mitre
16/04/2021 – 2 CVE ID assignés par le Mitre
21/05/2021 – Relance de l’équipe de développement de la solution
21/05/2021 – Les vulnérabilités sont prétendument corrigées
21/05/2021 – Vérification des corrections (3/5 patchés)
29/06/2021 – Les vulnérabilités sont censées être corrigées en utilisant un firewall
29/06/2021 – Vérification des corrections (3/5 corrigés)
29/06/2021 – Les vulnérabilités sont censées être corrigées à l’aide d’un pare-feu avec de nouvelles règles.
30/06/2021 – Vérification des corrections (5/5 corrigés)
02/08/2021 – Divulgation des vulnérabilités (notification + 151 jours depuis la dernière découverte)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *