Failles et vulnérabilités du Web

Widget Logic et son insertion de JavaScript non désirée

Blog Failles et vulnérabilités du Web Widget Logic et son insertion de JavaScript non désirée
0 commentaire

Timothée Allemmoz a indiqué sur le Slack de la communauté WordPress France que l’extension Widget Logic semblait avoir été détourné. Voyons ça ensemble. (TL;DR C’est infecté mais je vous donne la soluce pour le garder !)

Investigation

Première chose à faire : aller sur la page de ce plugin et dans les reviews. On y apprend alors rapidement qu’il est actuellement fermé depuis 11 jours à l’heure de cet article. Les dernières revues parlent d’un fichier JS inclus.

widget logic main

On voit aussi que la version a été mise à jour il y a 2 semaines au plus :

widget logic update

À l’oeil

widget logic 590

Widget Logic v5.9.0

Regardons maintenant simplement la différence dans la structure des fichiers sur SVN et outre le fait qu’on passe d’une 0.57 à une 5.7, un changement survient à partir de la 6 :

widget logic 602

Widget Logic v6.02

On passe de “wpchefgadget, alanft” à “Widget Logic” chez widgetlogic.org. Ça reste possible de changer d’auteur tout en restant la même personne, surtout si elle fait devenir ce plugin en pro/premium, mais ici le site montre bien qu’il est gratuit (pour le moment !). Qui a changé ça ??

Dans le code

Regardons maintenant un différentiel, on y trouve de suite ce code :

widget logic js enqueue

Aïe, là j’aime déjà moins… le fichier inclus widget_cfg.php n’est qu’une sorte de fausse librairie maison pour retourne des données fixes :

widget logic cfg

J’y ai encadré les 2 données qui nous intéresse, tout ça pour simplement former ce lien vers un fichier JavaScript qui sera inclus dans vos sites : https://widgetlogic.org/v2/js/data.js?t=123456 (vous pouvez cliquer, pas de danger).

En beautifiant ce code on y trouve plein de choses dont ça : widget logic football

Pardon ? Des données sur le football ?? Mais pourquoi !

Car ce plugin ajoute un widget ou un bloc Gutenberg avec des données de match en live :

widget logic match

Mais quel rapport ? Aucun ! En tout cas le lien vers le .js chez eux est bien présent PARTOUT sur votre site et le bloc que vous gagnez ressemble à ceci :

widget logic bloc

Je disais donc “aucun rapport”… Le soucis de laisser un .js provenant d’une source externe très incertaine, contrairement à un lien qui point chez un gafam (oui ça reste quand même plus sécure désolé) est qu’il suffit de pirater leur site pour insérer un autre code JS dans TOUTES les installations d’un coup…

FIX

Au delà au fait que leur mise à jour 6.0.3 est inférieure à leur version 6.02 qui est une faute de frappe, mais désolé les amis, 6.02 = 6.2, c’est donc supérieur à la nouvelle 6.0.3 ! la prochaine 6.0.4 le sera encore… il faut à minima une 6.2.x ou 6.2.x.x! Aïe…

Passons ce point et voyons comment vous pouvez garder l’extension sans avoir leur code, 2 solutions :

  1. Vous supprimez littéralement le code indiqué dans “Dans le code” depuis widget.php.
  2. Vous ajoutez un mu-plugin pour tout dehooker.

L’inconvénient du point 1 est que la prochaine version (avec une bonne numérotation uniquement) va remettre le code en place s’ils l’ont laissé. L’avantage est que c’est facile à faire.

L’inconvénient du point 2 est qu’il faut (savoir) créer un mu-plugin. L’avantage est que c’est pérenne !

Point 1

  • Ouvrez depuis votre FTP le fichier /widget-logic/widget.php,
  • Supprimez les lignes de codes indiquées dans la 1ère capture de “Dans le code” plus haut,
  • Enregistrez.

Point 2

  • Créez sur votre FTP le fichier /wp-content/mu-plugins/secupress-widget-logic-fix.php,
  • Collez le code suivant :
  • <?php // SecuPress
    add_action( 'wp_head', 'secupress_fix_widget_logic_603_1' );
    function secupress_fix_widget_logic_603_1() {
    wp_dequeue_script( 'widget-logic_live_match_widget' );
    }

    add_action( 'plugins_loaded', 'secupress_fix_widget_logic_603_2' );
    function secupress_fix_widget_logic_603_2() {
    remove_action('enqueue_block_assets', 'widget_logic_widget_enqueue_block_editor_assets');
    remove_action('init', 'widget_logic_init_block');
    remove_action('enqueue_block_assets', 'widget_logic_enqueue_block_editor_assets');
    remove_action('wp_loaded', 'widget_logic_add', 999);
    remove_filter('rest_pre_dispatch', 'widget_logic_clearing', 10, 3);
    remove_filter('render_block', 'widget_logic_block_render', 10, 2);
    }

    add_action( 'wp_loaded', 'secupress_fix_widget_logic_603_3' );
    function secupress_fix_widget_logic_603_3() {
    unregister_widget( 'Widget_Logic_Live_Match_Widget' );
    }
    secupress-widget-logic-fix.php
  • Enregistrez.

Et vous, vous utilisez cette extension ?

0 commentaire