Aller au contenu

CVE-2026-14894 : téléversement de fichier arbitraire non authentifié et RCE dans l'extension WordPress super forms

HERMES

SCORE DE MENACE HERMES & COMPROMISSION DU CMS D'ENTREPRISE

Cible : Extension WordPress Super Forms – Drag & Drop Form Builder
Confiance : 99%
98 / 100
CRITIQUE

Mesure la pertinence opérationnelle réelle, la militarisation de l'exploit et la posture de menace active.

Décomposition des dimensions
Exploitabilité 20 / 20
Activité de menace 19 / 20
Militarisation 20 / 20
Exposition 20 / 20
Prévalence 19 / 20
Impact 20 / 20
Maturité de l'exploit 20 / 20
Potentiel d'attaque en chaîne 20 / 20
⚖️ Divergence & Justification opérationnelle

Le CVSS v3.1 attribue à la CVE-2026-14894 le score critique maximal de 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) avec une décision CISA SSVC évaluant l'automatisation à 'yes' et l'impact technique à 'total'. Le score de menace Hermes s'aligne à 98 (CRITIQUE). Cet alignement reflète une primitive d'exploitation létale en deux requêtes HTTP permettant à tout attaquant non authentifié de générer un nonce valide et d'écrire immédiatement un fichier exécutable PHP directement sur le serveur web.

🕸️ Graphe de connaissances connecté & Provenance

CVE-2026-14894: Super Forms WordPress Plugin Unauthenticated Arbitrary File Upload to Remote Code ExecutionVULNÉRABILITÉ

Nœuds connectés : 1
Relations sortantes actives
→ affectsCOMPOSANTMicrosoft Office & 365 Apps
98% VERY_HIGH

Software platform affected by security vulnerabilities and agentic attack patterns.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Confirmed security vulnerability in Microsoft Office & 365 Apps documented in Hermes dossier.”

Preuves vérifiées associées :

1. Contexte technique & matrice des versions affectées

Section intitulée « 1. Contexte technique & matrice des versions affectées »

Super Forms est une extension de création de formulaires par glisser-déposer intégrant logique conditionnelle, publication frontend et génération automatique de documents PDF (devis, factures, attestations).

ParamètreSpécification TechniqueContexte Threat Intelligence
Identifiant CVECVE-2026-14894Enregistrement officiel MITRE, NVD & CNA Wordfence
Faiblesse CWECWE-434 (Unrestricted File Upload)Décodage base64 non contrôlé & écriture directe sur disque
Décision CISA SSVCAutomatable: Yes | Technical Impact: TotalExploitation automatisable massivement sans interaction
Vecteur réseauHTTP/HTTPS (80/TCP, 443/TCP)Requêtes AJAX non authentifiées directes
Composant vulnérableSUPER_Ajax::submit_form()includes/class-ajax.php (lignes 2745 à 2768)
Action d’obtention de nonceSUPER_Ajax::create_nonce()wp_ajax_nopriv_super_create_nonce
Versions affectéesToutes les versions <= 6.3.313Intégralité de la branche 6.x
Versions corrigées6.3.314 (7 juillet 2026)Correctif officiel avec forçage de l’extension .pdf et contrôle des octets magiques

2. Analyse approfondie du mécanisme de vulnérabilité

Section intitulée « 2. Analyse approfondie du mécanisme de vulnérabilité »

La vulnérabilité découle de la conjonction de deux défaillances logiques majeures dans includes/class-ajax.php :

Faille 1 : création triviale de nonce via super_create_nonce

Section intitulée « Faille 1 : création triviale de nonce via super_create_nonce »

Les nonces WordPress visent à neutraliser les attaques CSRF et valider l’intention de l’utilisateur. Super Forms enregistre une action publique sans authentification :

// includes/class-ajax.php (Lignes 110-118)
if ( $nopriv ) {
add_action( 'wp_ajax_nopriv_super_' . $ajax_event, array( __CLASS__, $ajax_event ) );
}
// ...
public static function create_nonce() {
echo SUPER_Common::generate_nonce();
die();
}

Une requête GET /wp-admin/admin-ajax.php?action=super_create_nonce renvoie instantanément un nonce cryptographique valide.

Faille 2 : écriture arbitraire sur disque via datauristring

Section intitulée « Faille 2 : écriture arbitraire sur disque via datauristring »

Dans le traitement de la soumission de formulaire, l’extension inspecte les fichiers transmis :

// CODE VULNÉRABLE (Super Forms <= 6.3.313 dans includes/class-ajax.php)
foreach( $v['files'] as $key => $value ) {
// Tentative de génération d'un fichier PDF
if(isset($value['datauristring'])){
try {
$imgData = str_replace( ' ', '+', $value['datauristring']);
unset($value['datauristring']);
$imgData = substr( $imgData, strpos( $imgData, "," )+1 );
$imgData = base64_decode( $imgData );
unset($GLOBALS['super_upload_dir']);
add_filter( 'upload_dir', array( 'SUPER_Forms', 'filter_upload_dir' ));
if(empty($GLOBALS['super_upload_dir'])){
$GLOBALS['super_upload_dir'] = wp_upload_dir();
}
$d = $GLOBALS['super_upload_dir'];
$value['value'] = SUPER_Common::email_tags( $value['value'], $data, $settings );
$value['label'] = SUPER_Common::email_tags( $value['label'], $data, $settings );
// FAILLE CRITIQUE : $value['value'] est directement contrôlé par l'attaquant !
// Aucune vérification d'extension, aucun contrôle MIME, aucun assainissement !
$basename = $value['value'];
$filename = trailingslashit($d['path']) . $basename;
$file = fopen($filename, 'w');
fwrite($file, $imgData);
fclose($file);
  1. Absence de contrôle de configuration : le script ne vérifie pas si l’option de génération PDF est active sur le formulaire.
  2. Nom de fichier non filtré : la variable $basename est directement extraite de la requête HTTP (ex: shell.php).
  3. Absence de liste blanche d’extensions : rien n’empêche l’écriture de fichiers d’extensions .php, .phtml ou .phar.
  4. Écriture directe : fopen() dépose le fichier immédiatement dans le dossier accessible publiquement wp-content/uploads/super-forms/.

3. Scénario d’attaque & déploiement du web shell

Section intitulée « 3. Scénario d’attaque & déploiement du web shell »

L’exploitation se déroule en deux requêtes HTTP sans identifiants préalables :

[Attaquant]
│
│ 1. GET /wp-admin/admin-ajax.php?action=super_create_nonce
▼
┌─────────────────────────────────────────────────────────────┐
│ Le serveur WordPress répond avec le sf_nonce valide │
└─────────────────────────────────────────────────────────────┘
│
│ 2. POST /wp-admin/admin-ajax.php (action=super_form_submit)
▼
┌─────────────────────────────────────────────────────────────┐
│ Données forgées dans data[0][files][0] : │
│ - value : "agent_hermes.php" │
│ - datauristring : "data:application/pdf;base64,PD9waH..." │
└─────────────────────────────────────────────────────────────┘
│
▼ Écriture sur disque
┌─────────────────────────────────────────────────────────────┐
│ Déposé dans : /wp-content/uploads/super-forms/agent_hermes.php │
│ Résultat : Exécution de code à distance (RCE) immédiate │
└─────────────────────────────────────────────────────────────┘

4. Indicateurs de compromission (IOC) & forensique

Section intitulée « 4. Indicateurs de compromission (IOC) & forensique »
MéthodeURI / ParamètreCaractéristique Détectée
GET/wp-admin/admin-ajax.php?action=super_create_nonceCréation répétée de nonces depuis des adresses IP suspectes
POST/wp-admin/admin-ajax.phpCorps HTTP contenant action=super_form_submit et datauristring=
GET/wp-content/uploads/super-forms/*.phpAppel direct d’un script PHP dans l’arborescence des uploads
  • Répertoire d’upload cible : /var/www/html/wp-content/uploads/super-forms/ (ou sous-dossiers annuels/mensuels).
  • Fichiers exécutables anormaux : présence de fichiers .php, .phtml, .phar, .inc dans le dossier des uploads.
  • Base de données : entrées dans wp_posts avec post_type='attachment' dont le nom de fichier se termine par une extension exécutable.

alert http any any -> $HTTP_SERVERS any (
msg:"HERMES EXPLOIT - Téléversement de fichier arbitraire Super Forms (CVE-2026-14894)";
flow:to_server,established;
http.method; content:"POST";
http.uri; content:"admin-ajax.php";
http.request_body; content:"action=super_form_submit"; nocase;
http.request_body; content:"datauristring="; nocase;
pcre:"/data\[[0-9]+\]\[files\]\[[0-9]+\]\[value\]=[^\&]+\.(php|phtml|phar|inc)/Ui";
classtype:web-application-attack;
sid:202614894; rev:1;
)
rule SuperForms_Uploaded_Webshell_CVE_2026_14894 {
meta:
description = "Détecte les web shells téléversés via la CVE-2026-14894 de Super Forms"
author = "Hermes Codex Threat Intelligence"
reference = "CVE-2026-14894"
date = "2026-09-12"
threat_level = "CRITICAL"
strings:
$php_open = "<?php"
$super_forms_dir = "super-forms"
$cmd_exec = /(passthru|shell_exec|system|popen|eval|assert)\s*\(/
condition:
uint32(0) == 0x68703f3c and
$cmd_exec and
filepath contains "wp-content/uploads"
}
index=web_proxy sourcetype=access_combined
uri_path="*/wp-admin/admin-ajax.php*"
| search _raw="*super_form_submit*" AND _raw="*datauristring*"
| rex field=_raw "data\[\d+\]\[files\]\[\d+\]\[value\]=(?<uploaded_filename>[^&]+)"
| eval is_executable=if(match(uploaded_filename, "(?i)\.(php|phtml|phar|inc|pl|cgi)"), 1, 0)
| where is_executable=1
| stats count earliest(_time) as premiere_tentative latest(_time) as derniere_tentative by src_ip, dest_ip, uploaded_filename

6. Analyse du correctif éditeur (commit c5838f58)

Section intitulée « 6. Analyse du correctif éditeur (commit c5838f58) »

La version 6.3.314 a corrigé la vulnérabilité en appliquant 4 niveaux de contrôle stricts :

// CORRECTIF OFFICIEL dans 6.3.314 (includes/class-ajax.php)
// 1. Contrôle obligatoire de l'activation de la génération PDF
if ( empty( $settings['_pdf']['generate'] ) || $settings['_pdf']['generate'] !== 'true' ) {
unset( $data[ $k ]['files'][ $key ]['datauristring'] );
continue;
}
// 2. Normalisation du nom et forçage absolu de l'extension .pdf
$basename = sanitize_file_name( wp_basename( (string) $value['value'] ) );
$stem = preg_replace( '/\.[^.]*$/', '', $basename );
$stem = str_replace( '.', '_', (string) $stem );
$stem = trim( $stem, '.-_' );
if ( '' === $stem ) {
$stem = 'super-forms-' . strtotime( date_i18n( 'Y-m-d H:i:s' ) );
}
$basename = $stem . '.pdf'; // EXTENSION .pdf IMPOSÉE !
// 3. Vérification cryptographique des octets magiques PDF (%PDF-)
if ( '%PDF-' !== substr( (string) $imgData, 0, 5 ) ) {
throw new Exception( esc_html__( 'Invalid file upload rejected.', 'super-forms' ) );
}
// 4. Confinement strict par realpath dans le dossier d'uploads
$baseDir = realpath( $d['path'] );
$filename = trailingslashit( $baseDir ) . $basename;
$parentReal = realpath( dirname( $filename ) );
if ( false === $parentReal || 0 !== strpos( trailingslashit( $parentReal ), trailingslashit( $baseDir ) ) ) {
throw new Exception( esc_html__( 'Invalid file upload rejected.', 'super-forms' ) );
}

  1. Mise à jour immédiate de super forms : Mettre à niveau l’extension vers la version 6.3.314 ou supérieure via WP-CLI :

    Fenêtre de terminal
    wp plugin update super-forms
  2. Audit et assainissement des répertoires d’upload : Rechercher tout fichier PHP suspect dans le répertoire des téléversements :

    Fenêtre de terminal
    find /var/www/html/wp-content/uploads/ -type f -name "*.php" -ls
  3. Interdiction de l’exécution de scripts dans les uploads (durcissement Nginx/Apache) : Interdire l’exécution directe des scripts PHP dans les dossiers médias :

    location ~* ^/wp-content/uploads/.*\.php$ {
    deny all;
    return 403;
    }
  4. Renouvellement des secrets WordPress : En cas de détection d’un web shell résiduel, considérer le serveur et la base de données comme totalement compromis : renouveler les sels d’authentification dans wp-config.php, les mots de passe de base de données et auditer l’ensemble des comptes administrateurs.