| Nom du plugin | Lecteur de piste Wikiloops |
|---|---|
| Type de vulnérabilité | Script intersite (XSS) |
| Numéro CVE | CVE-2026-1611 |
| Urgence | Faible |
| Date de publication CVE | 2026-02-08 |
| URL source | CVE-2026-1611 |
Lecteur de piste Wikiloops (≤ 1.0.1) — XSS stocké pour contributeur authentifié (CVE-2026-1611)
Publié : 6 Feb, 2026 | Gravité : Faible (Priorité de correctif : Faible) — CVSS : 6.5 | CVE : CVE-2026-1611
Plugin affecté : Wikiloops Track Player (versions ≤ 1.0.1) | Privilège requis pour l'exploitation : Contributeur (authentifié)
Résumé exécutif
Une vulnérabilité de script intersite stocké (XSS) dans le Lecteur de piste Wikiloops (≤ 1.0.1) permet à un utilisateur authentifié avec des privilèges de contributeur d'injecter du JavaScript dans le contenu rendu par shortcode. La charge utile est persistante et s'exécute dans le navigateur de tout visiteur qui consulte la page compromise. L'exploitation nécessite uniquement un compte de contributeur pour introduire la charge utile ; l'impact dépend des victimes visitant les pages affectées.
Le XSS stocké est une classe de vulnérabilité puissante. Bien que cette découverte soit classée Faible/Modérée par score, les opérateurs de site devraient agir pour réduire l'exposition, en particulier sur les sites à auteurs multiples et les plateformes communautaires où les comptes de contributeurs sont courants.
Qu'est-ce que le XSS stocké via shortcode ? Le tableau technique
Les shortcodes WordPress acceptent des attributs et du contenu des éditeurs de publication et rendent du HTML sur le front-end. Un XSS stocké via shortcode survient lorsque :
- L'entrée du shortcode (attributs ou contenu inclus) peut être fournie par un utilisateur authentifié (ici, un contributeur),
- Cette entrée est enregistrée dans la base de données (post_content, post_meta ou tables personnalisées),
- Le plugin rend l'entrée enregistrée sans encodage ou assainissement correct de la sortie,
- JavaScript payloads (for example #is', '', $content );
// Remove on* attributes (onclick=, onerror=)
$content = preg_replace_callback(
'#(<[a-z0-9]+\b[^>]*?)\s+on[a-z]+\s*=\s*(["\']).*?\2#is',
function( $matches ) {
return $matches[1];
},
$content
);
}
return $content;
}
?>
Cela empêche le stockage futur des balises script provenant des rôles ciblés. Cela ne nettoie pas rétroactivement le contenu existant.
-
Remplacez le gestionnaire de shortcode : Remove the plugin’s handler and register a wrapper that sanitises attributes and enclosed content before rendering.
'', 'height' => '', 'width' => '', ); $atts = shortcode_atts( $allowed_atts, $atts, 'wikiloops_track' ); foreach ( $atts as $k => $v ) { $atts[ $k ] = sanitize_text_field( $v ); } $safe_content = wp_kses_post( $content ); if ( is_callable( $orig ) ) { $output = call_user_func( $orig, $atts, $safe_content ); $output = preg_replace( '#.*?#is', '', $output ); return $output; } return ' ' . esc_html( $safe_content ) . ''; } ); } } ?>