Magento : faille de sécurité sur les données clients

Faille de sécurité Magento sur les données clients

Une faille de sécurité affecte le processus de commande de certaines versions de Magento Community et Enterprise. L’exploitation de la faille permet la récupération des adresses clients enregistrées sur le site, c’est à dire :

  • identité : prénom, nom, civilité
  • société, téléphone, fax
  • adresse complète : rue, code postal, ville, région, pays
  • date de création et de mise à jour de l’adresse client

Exemple de données brutes récupérées librement :

Pour vous permettre d’en savoir plus sur son fonctionnement et sur la manière de la corriger, cet article va présenter :

A propos de la faille de sécurité

Quelles sont les versions de Magento affectées ?

La faille concerne :

  • toutes les versions de Magento Community jusqu’à 1.3.3.0 (incluse)
  • Magento Enterprise 1.6

Bien que les versions affectées soient relativement anciennes, un certain nombre de sites en production sont toujours basés sur celles-ci. Un test réalisé sur un échantillon de 1.300 sites révèle que 30 à 40% des sites Magento pourraient être concernés par la faille.

Les sites basés sur Magento Community >= 1.4.0.0 ou Magento Enterprise >= 1.7.0.0 ne sont pas affectés.

Pourquoi publier un Advisory sur cette faille ?

Lors d’un récent audit sur un site Magento, une analyse de logs serveurs nous a permis de constater que des tentatives d’exploitation de la faille avaient été effectuées. Certaines personnes a priori mal intentionnées ont donc connaissance de la vulnérabilité, alors même que les victimes potentielles ignorent tout du risque.

D’autre part, s’il corrige les failles qui lui sont signalées, l’éditeur ne communique pas pour autant sur le sujet. Nous n’avons pu trouver aucune communication concernant cette faille. Nous n’avons pas non plus pu trouver d’informations non-officielles via les sites communautaires.

Enfin, même lorsque l’éditeur corrige les failles, il ne fournit pas pour autant de patch, ce qui laisse potentiellement un grand nombre de sites Magento vulnérables sans solution facilement applicable.

La faille est-elle corrigée dans les versions récentes ?

Oui, dans les versions récentes de Magento, la faille est bien corrigée. Plus précisément, la vulnérabilité est corrigée :

  • à partir de Magento Community 1.4.0.0
  • à partir de Magento Enterprise 1.7.0.0

Pour information :

  • La version 1.5.0.0 de Magento C.E. et la version 1.10 de Magento E.E./P.E. étaient affectées par une faille de sécurité majeure, les modifications appropriées ont été effectuées et ont donné lieu à Magento C.E. 1.5.0.1 et Magento E.E. 1.10.0.1 ; les versions affectées étant retirée du téléchargement.
  • Bien que la faille clients est corrigée dans les versions récentes, la version 1.3.3.0 n’a pas fait l’objet d’un patch et n’a pas été retirée du téléchargement.

Comment la faille peut-elle être exploitée ?

Etape 1 : créer un panier

La première étape consiste à créer un panier sur un site Magento concerné par la faille. Il n’est pas nécessaire d’être logué en tant que client, la faille est exploitable en tant que simple visiteur.

Magento customers security issue - Step 1

Etape 2 : se rendre sur le checkout (non obligatoire)

On peut alors se rendre sur la première page du processus de commande. Notez que cette étape n’est pas obligatoire.

L’url de la page est alors la suivante.

 Etape 3 : exploiter la faille et récupérer les informations clients

L’exploitation se fait alors par le biais de l’url suivante :

où id est un chiffre correspondant à un numéro d’adresse client dans la base Magento, par exemple 1, 2, 3 ou 999 (incrémental de pas 1).

Magento nous proposera de télécharger un fichier au format JSON. Dans le cadre de ce test sur un Demo Store, on obtiendra un fichier contenant les informations suivantes.

Un script permettrait d’automatiser l’extraction et la mise en forme des données par un appel successif aux urls suivantes :

Un patch rapide à appliquer

Localisation de la faille dans le code

Le fichier responsable de la faille est :

S’il n’a pas été modifié, le fichier contient à la ligne 223 le code suivant :

Cette méthode prend en paramètre un ID d’adresse, par exemple 1, 2, 3 ou 999. C’est cet ID d’adresse qui est passé en paramètre dans l’url http://{{base_url}}/checkout/onepage/getAddress/address/id qui permet l’exploitation de la faille.

Comment son nom l’indique, une adresse client est associée à un client. Dans cette méthode, aucune vérification sur le droit de récupération de l’adresse n’est effectuée. Concrètement, peu importe qui demande l’adresse, Magento retournera toujours l’information, à la seule condition qu’un id d’adresse lui soit fourni.

Afin de corriger la faille, il suffit de remplacer la méthode originale par le code suivant :

Ce code est tout simplement issu de Magento 1.4.0.0. Dans ce code, la méthode vérifie si l’adresse demandée appartient bien au client qui en fait la demande. Si ce n’est pas le cas, une notification d’interdiction d’accès est retournée.

Fichier correctif

Si vous ne souhaitez pas appliquer manuellement le correctif proposé ci-dessus, et si vous avez l’assurance que le fichier incriminé n’a pas été modifié, vous pouvez le remplacer par le fichier disponible à l’adresse suivante :

Rappel : le fichier incriminé est :

Faut-il mettre à jour Magento ?

Comme le correctif proposé est issu des versions récentes de Magento, on peut l’implémenter directement dans le coeur. Une fois le correctif implémenté, aucune autre action n’est nécessaire. Il est recommandé de mettre à jour son site Magento régulièrement, ne serait-ce que pour bénéficier de potentielles corrections de bugs techniques ou failles.

Questions/réponses au sujet de la faille

Cette faille touche-t-elle un grand nombre de sites ?

Il est très probable que la quasi-totalité des sites Magento réalisés ces derniers mois mettent en oeuvre une version de Magento non concernée par la faille.

Cependant, d’après des estimations préliminaires, qui pourront être affinées, 30 à 40% des sites Magento en production seraient toujours sur une version antérieure ou égale à la 1.3.3.0. S’il y a environ 100.000 sites Magento dans le monde, cela représente entre 30.000 et 40.000 sites dont la base clients serait librement récupérable.

Y’a-t-il vraiment des sites Magento basés sur d’anciennes versions ?

Un certain nombre de très gros projets Magento ont commencé sur la version Community de Magento, à l’époque ou la version Enterprise n’existait pas : de gros sites sont donc concernés par la vulnérabilité. Malheureusement, et nous avons pu le vérifier, cela signifie que des sites parmi les principales références mondiales de Magento sont concernés.

La migration d’un site Magento d’une version à l’autre peut demander un travail important, a fortiori quand le développement n’a pas été fait dans les règles de l’art. Ceci est d’autant plus vrai que les changements entre Magento 1.3 et Magento 1.4 ne sont pas anodins.

Quels sont les risques encourus par les sites affectés par la faille ?

L’exploitation de la faille permet de télécharger une base clients Magento quasi-complète, hors emails. Cela pose deux problèmes principaux évidents :

  • la base clients a une valeur financière voire stratégique, celle-ci peut être récupérée dans un but d’exploitation ou de revente et potentiellement exploitée par un concurrent
  • la plupart des juridictions prévoient que les sites e-Commerce ont l’obligation de protéger les informations personnelles des clients

En France, l’article 226-17 du code pénal indique que “Tout responsable de traitement informatique de données personnelles doit adopter des mesures de sécurité physiques (sécurité des locaux), logiques (sécurité des systèmes d’information) et adaptées à la nature des données et aux risques présentés par le traitement. Le non-respect de l’obligation de sécurité est sanctionné de 5 ans d’emprisonnement et de 300 000 € d’amende.”

Comment une telle faille peut-t-elle arriver dans Magento ?

Le socle technique de Magento est solide, le framework de développement (Zend) et les méthodes de programmation mises en oeuvre assurent un très bon niveau de sécurité, par rapport à d’autres solutions e-Commerce open source développées en PHP. La solution Magento est donc “nativement protégée” d’un certain nombre de failles de sécurité parmi les plus courantes.

Cependant, le socle technique ne protège pas des erreurs de conception, et la faille qui permet ici de télécharger les informations clients est liée à une erreur humaine.

Le fait que le code de Magento soit lisible (open-source) est-il un risque ?

La faille a été signalée à l’éditeur par le biais du bug-tracker par un membre de la communauté, puis corrigée à partir de Magento C.E. 1.4 et Magento E.E. 1.7. Il semble que le membre de la communauté en question a pu trouver la faille en lisant le code. Si le code responsable de la faille n’avait pas été lisible, il est peu probable que la faille ait été découverte. Seule l’éditeur aurait alors pû se charger d’un correctif et d’une éventuelle communication autour de celui-ci, ce qui reste à son entière discrétion.

La communauté contribue-t-elle à la sécurité de la solution ?

C’est en tout cas la communauté qui fournit aujourd’hui cet Advisory :-). Membres de la communauté, nous vous encourageons à relayer ces informations.

Par rapport à d’autres solutions, quel est le niveau de sécurité de Magento ?

Il est clair que cette faille est particulièrement critique, mais Magento se place parmi les solutions les plus sécurisées. D’autres solutions e-Commerce, open-source et en PHP, ont également été affectées par des failles de sécurité majeures et le sont certainement toujours. Il s’agit juste de trouver, corriger et communiquer autour de celles-ci pour prévenir leur exploitation.

– PrestaShop : plusieurs failles, importantes, ont été révélées dans le passé. En août 2011, une faille majeure affectant le backoffice a été constatée suite au hack du site officiel de la solution. L’éditeur a très largement communiqué autour du problème, ce qui est un très bon point. L’erreur est humaine… mais corrigeable !

– Drupal Commerce : le framework e-Commerce se basant sur Drupal, il bénéficie de ses avantages comme de ses inconvénients. Ceci comprend les failles de sécurité de Drupal. La dernière faille de sécurité majeure pour Drupal remonte au 29 juin 2011. Une faille classée “modérément critique” a été révélée le 1er février 2012. Une communication sérieuse est réalisée autour de ces failles via une page spéciale, des annonces publiques et un fil twitter dédié. Puisse Magento s’en inspirer !

Prochaines étapes

Si vous avez besoin d’aide pour appliquer le correctif, si vous souhaitez échanger sur la faille ou pour toute autre remarque, n’hésitez pas à laisser un commentaire, ou rendez-vous le sujet dédié sur Fragento.

Nous espérons que cet Advisory vous aura été utile :-).

Télécharger l’Advisory complet en PDF
Vulnérabilité sur les données clients dans Magento

Un ping pour “Magento : faille de sécurité sur les données clients

6 commentaires pour “Magento : faille de sécurité sur les données clients

  1. Bonsoir,

    1. Version 1.3.0
    Le meme decrit dans votre doc : fichier à telecharger au format JSON

    2. Version 1.3.2.1
    J’ai appliqué la solution sur 1.3.2.1 ca marche bien

    • Bonsoir,

      Bizarre, nous avons testé sur la 1.3.0 et le code est le même que pour la 1.3.2.4, le patch fonctionne sur une instance de test. Si, une fois le patch appliqué, vous observez un fonctionnement particulier, pourriez-vous fournir plus de détails ? Voulez-vous dire que malgré l’application du patch sur le controller OnepageController.php, vous obtenez toujours un JSON avec l’adresse client ? Si tel est le cas, il y a peut-être une surcharge de ce controller qui empêche vos modifications d’être prises en compte :-).

  2. Bonjour,

    merci d’avoir partagé ce problème.

    Pour ma part je teste en plus si l’adresse existe car sinon il y’a toujours téléchargement d’un fichier JSON car si adresse inexistante et client non connecté on a NULL == NULL

    if($address->getId() && Mage::getSingleton(‘customer/session’)->getCustomer()->getId() == $address->getCustomerId()) {….

    Merci

    @mokadev

    • Oui, c’est encore mieux :-)
      Comme un tel niveau de vérification n’est pas fait à partir de Magento 1.4.0.0 on a préféré fournir une solution sans perte fonctionnelle même après écrasement du fichier OnepageController.php lors de la migration ^.^

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">