Des milliers de blogs WordPress vulnérables à cause d’un outil dédié aux images (0-day)

7
134

C’est le blogueur Mark Maunder qui a découvert cette vulnérabilité qui pourrait bien mettre en péril énormément de sites utilisant le CMS WordPress. plus particulièrement ceux qui utilisent un thème qui contient l’utilitaire TimThumb, dédié au images.

Il s’avère que Mark Maunder a vu son blog victime d’un piratage et c’est à cette occasion que ce dernier à découvert la faille. Elle se situe dans un add-on WordPress, présent dans de nombreux thèmes, appelé TimThumb.

Timthumb est un script PHP de 864 lignes qui assiste avec le redimensionnement automatique des images, le thumbmailing, etc. (Il ne possède pas le code de manipulation d’images mais utilise la bibliothèque tiers GD.)

Si vous possédez un site sous WordPress et que vous avez un fichier nommé timthumb.php (parfois renommé en thumb.php) dans votre installation, vous pouvez être potentiellement à risque. Depuis votre console SSH, vous pouvez utiliser la commande suivante pour localiser le script : find / -type f -name timthumb.php -print .

En traquant le mécanisme qui a permis son intrusion, Maunder a identifié trois problèmes principaux avec timthumb.php : les paramètres par défaut non initialisés; absence de filtrage des variables, et un mauvais choix de permissions de fichiers pour les fichiers temporaires.

D’ailleurs, des failles XSS ont déjà été signalées par avant…

Par défaut, la version vulnérable de timthumb autorise des images à partir de sites externes à être accessible à partir de votre serveur. La liste par défaut n’est probablement pas surprenante :

// external domains that are allowed to be displayed on your website$allowedSites = array (	'flickr.com',	'picasa.com',	'img.youtube.com',	'upload.wikimedia.org',);

Mais une meilleure solution serait une liste vide par défaut, afin que les utilisateurs qui veulent permettre à des fichiers externes d’êtres sourcés par leurs propres serveurs doivent prendre des mesures pour permettre cette fonctionnalité.

Si vous utilisez WordPress et timthumb et que vous n’avez pas besoin de cette fonctionnalité, Maunder suggère simplement d’éditer le code de timthumb.php et d’y mettre $allowedSites = array(); afin de prévenir les inclusions de fichiers distants.

Deuxièmement, timthumb.php vérifie le bon sens d’URL à distance – pour vérifier qu’il est réellement dans la liste des sites autorisés – en recherchant les domaines autorisés, quelque part dans la partie hôte de l’URL, plutôt que de s’assurer qu’ils étaient de la partie hôte :

$isAllowedSite = false;foreach ($allowedSites as $site) {        if (strpos (strtolower ($url_info['host']), $site) !== false) {                $isAllowedSite = true;        }}

Ce code signifie qu’un site au nom douteux tel que picasa.com.badsite.example passerait le test, tout simplement parce qu’il contient la chaine picasa.com. De toute évidence, ce n’est pas ce qui était prévu.

Enfin, timthumb.php stock les fichiers qu’il a générés dans un répertoire de cache, qui est à l’intérieur du répertoire. Cela est mauvais, parce que les fichiers générés à partir d’un contenu externe non autorisé deviennent exécutables.

Donc, si le fichier cache n’est pas une image innocente, mais un script PHP de type PHP Shell (dans le cas Maunder, l’attaquant a utilisé un outil de console distant malveillant appelé Alucar), vous êtes piraté.

Si vous êtes un développeur web :

  • Ne pas faire confiance au contenu externe par défaut. Forcez vos utilisateurs à faire ce qu’ils veulent vraiment.
  • Vérifier, tester, vérifier, tester, vérifier et tester à nouveau votre code de désinfection d’URL. Construisez une suite de tests efficaces et vérifiez votre code avec celle-ci à chaque fois que vous effectuez une mise à jour.
  • Conserver les fichiers qui ne sont jamais supposés être utilisés comme des données – en particulier des fichiers distants – en dehors de l’arborescence du répertoire et du code exécutable.

Si vous possédez une installation WordPress :

Vérifiez si l’un des blogs que vous hébergez utilise le script timthumb.php et mettez-le à jour vers la dernière version. Le strpos douteux ci-dessus a été remplacé par un resserrement correspondant basé sur une expression régulière, comme ceci :

$isAllowedSite = false;foreach ($allowedSites as $site) {	if (preg_match ('/(?:^|\.)' . $site . '$/i', $url_info['host'])) {		$isAllowedSite = true;	}}

Cela ne résout pas tous les problèmes décrits par Maunder, mais c’est toujours une vulnérabilité en moins !

Un grand merci à M. Maunder pour l’étude de l’attaque sur son site et de l’avoir transformé en un outil de formation pour aider le reste d’entre nous à éviter un problème similaire !

Un exploit a été mis en ligne sur Exploit-DB et une nouvelle version de TimThumb (v 1.34) est disponible.

Important : le service WordPress.com n’utilise pas l’outil TimThumb.

Les commentaires sont fermés.