
Exploit de preuve de concept et analyse technique pour CVE-2026-48907, une vulnérabilité d'exécution de code à distance pré-authentification CVSS 10.0 dans Joomla Content Editor (JCE). Inclut une chaîne d'attaque en 3 requêtes et une ventilation détaillée du correctif.
Preuve de concept (exploit) pour CVE-2026-48907 — une vulnérabilité d'exécution de code à distance (RCE) de score CVSS 10.0, exploitable sans authentification préalable, dans l'extension Joomla Content Editor (JCE).
Recherche par Grayxploit Security Team
CVE-2026-48907 est une vulnérabilité critique d'exécution de code à distance (RCE) non authentifiée affectant l'extension Joomla Content Editor (JCE) — l'éditeur Joomla le plus largement installé — dans toutes les versions jusqu'à la 2.9.99.4 incluse.
En enchaînant trois faiblesses de sécurité indépendantes dans le flux d'importation de profils JCE, un attaquant totalement non authentifié peut :
/tmp/ du serveurL'attaque ne nécessite que 3 requêtes HTTP et fonctionne contre toute installation Joomla par défaut exécutant une version vulnérable de JCE.
Score CVSS v4 : 10.0 — Critique
Découverte et divulguée publiquement par l'équipe de recherche en sécurité Grayxploit à la suite d'une divulgation responsable.
| Logiciel | Versions vulnérables | Version corrigée |
|---|---|---|
| Joomla Content Editor (JCE) | ≤ 2.9.99.4 | 2.9.99.6 (recommandée) |
Remarque : La version 2.9.99.5 a introduit le correctif principal. La version 2.9.99.6 a ajouté des couches de durcissement supplémentaires. Mettez à niveau vers la 2.9.99.6 ou une version ultérieure.
La vulnérabilité provient du point de terminaison d'importation de profils JCE :
POST /index.php?option=com_jce&task=profiles.import
JCE permet aux administrateurs d'exporter et d'importer des profils d'éditeur sous forme de fichiers XML. Le gestionnaire d'importation est accessible sans authentification et accepte des téléversements de fichiers arbitraires en raison d'une chaîne de trois faiblesses indépendantes.
Le contrôleur d'importation n'effectuait aucune vérification ACL :
public function import()
{
// Only gate: CSRF token — trivially bypassable
Session::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
$app = Factory::getApplication();
// … straight into file handling — no authorise() check
}
Joomla intègre le jeton CSRF dans chaque page publique sous forme de balise meta ou de variable JS :
<meta name="csrf.token" content="abcdef1234567890abcdef1234567890" />
Un attaquant n'a qu'à récupérer la page d'accueil, extraire le jeton et le rejouer. La vérification CSRF empêche les requêtes intersites — elle n'empêche pas les requêtes scriptées directes. Aucun appel à Factory::getUser() ou $user->authorise(...) n'était présent dans le chemin d'importation.
Le gestionnaire de téléversement utilisait File::makeSafe(), qui se contente de supprimer les caractères illégaux du système de fichiers — il ne valide pas et ne restreint pas les extensions de fichiers :
$file = $app->input->files->get('profile_file', null, 'raw');
if (!is_uploaded_file($file['tmp_name'])) { return false; }
$name = File::makeSafe($file['name']); // strips illegal chars only
$destination = $config->get('tmp_path') . '/' . $name;
$source = $file['tmp_name'];
File::upload($source, $destination, false, true);
Un nom de fichier tel que shell.xml.php passe File::makeSafe() sans être modifié. Le module mod_php d'Apache l'exécute car la dernière extension reconnue est .php. Les extensions telles que .php, .php5, .phtml et les variantes à double extension étaient toutes acceptées.
File::upload() appelée avec $allow_unsafe = true (CWE-116)La méthode File::upload() de Joomla intègre une liste noire d'extensions qui bloque les types de fichiers dangereux lorsque $allow_unsafe = false (la valeur par défaut) :
// Joomla File::upload() signature
File::upload($src, $dest, $use_streams = false, $allow_unsafe = false)
Le code JCE vulnérable désactivait explicitement ce filet de sécurité :
// VULNERABLE — unsafe uploads explicitly enabled
File::upload($source, $destination, false, true);
Ce simple booléen désactivait l'intégralité de la liste noire interne d'extensions de Joomla, permettant à .php, .php5, .phtml et à toutes les autres extensions exécutables d'être écrits sur le disque.