XSS dans Twitter pour IE <= 8

===================================

Français

For an english summary, go to the bottom of this post

===================================

Une mise à jour de Twitter a eu lieu pendant la nuit de mardi à mercredi, elle aura permis de protéger les utilisateurs d’Internet Explorer 8 d’au moins une faille XSS se trouvant dans la génération des tweets possédant des URLs contenant certaines séquences de caractères spéciaux.

En effet, lorsqu’on tweetait une URL contenant les caractères $_ (par exemple: http://www.example.com/a$_b), l’affichage du tweet partait en vrille en répliquant un certain nombre de fois l’URL et cassait les balises HTML prévues pour contenir le lien initial posté par l’utilisateur. Il faut savoir que Twitter utilise son “URL-shortener” (http://t.co) pour raccourcir les URL contenues dans un tweet et c’est dans le rendu du lien vers cette URL raccourcie que se trouvait le problème.

La réactivité de l’équipe sécurité de Twitter étant très bonne, je n’ai pas eu le temps d’analyser en détails la source de la vulnérabilité avant qu’elle ne soit patchée. Toujours est-il qu’une simple duplication du lien n’est que peu intéressante et j’ai alors cherché à faire exécuter du code par le biais de ce bug.

Pour cela, il fallait trouver un moyen de soit rajouter des balises HTML ou de profiter du fait que notre code se trouve déjà dans une balise pour y ajouter des event listener (type onload, onmouseover, …). La première solution s’est révélée impossible car les caractères < et > étaient correctement encodés. Par contre en ajoutant un guillemet (“) dans le texte du tweet, il était possible de sortir des champs prévus à cet effet et ajouter des champs à la balise HTML courante.

Afin d’exploiter complètement la faille pour obtenir une exécution de code, il fallait préparer un tweet avec un contenu similaire à celui ci-dessous.

"onmouseover=alert(1) http://www.test.com/a$_b test

Le moteur de rendu Javascript de twitter corrige par lui-même les espaces et guillemets manquants pour arriver au résultat ci-dessous. Le code est exécuté au moment où un utilisateur passe la souris au dessus de l’un des liens. Il faut savoir qu’à l’aide de styles CSS, il est possible de redimensionner le lien pour qu’il prenne toute la place et de ce fait l’utilisateur va forcément passer dessus.

N’importe qui visualisant ce tweet avec IE <= 8 (connecté à twitter ou pas) verrait le code exécuté dans son navigateur.

Après avoir découvert la faille, j’ai notifié l’équipe sécurité de Twitter (https://support.twitter.com/forms/security) avec les détails de l’attaque. Ils sont revenus vers moi moins de 10 minutes plus tard pour avoir des détails et la faille a été corrigée en moins de 12h. La mise à jour a permis d’homogénéiser le rendu des pages dans tous les navigateurs, corrigeant ainsi la faille qui n’affectait qu’Internet Explorer en version 8 ou moins.

===================================

English

===================================

A Cross-Site Scripting flaw affecting older versions of IE was discovered on Tuesday which could allow an attacker to take control of a user’s browser viewing a malicious tweet. The vulnerability was located within some of the rendering Javascript for IE versions 8 and lower.

When displaying a tweet with a link containing the characters “$_”, the rendering algorithm would repeat the link multiple times and by doing so, broke the HTML display of the tweet. By analyzing the flaw, it was possible to infer a way to execute code within the context of an infected page by abusing event listeners.

In the end, a tweet containing the following text could allow an attacker to control a victim’s browser.

"onmouseover=alert(1) http://www.example.com/a$_b test

The resulting display is showed below.

Twitter’s security team reacted very quickly when I notified them of the flaw and patched the site within a few hours of discovering the vulnerability.