Hacking avec Unicode (sur l'exemple de GitHub)

Unicode est exceptionnellement complexe. Peu de gens connaissent toutes les astuces : des personnages invisibles et des personnages de contrôle aux paires de substitution et aux emojis combinés (lorsque l'ajout de deux caractères entraîne un troisième). La norme comprend 2 16 positions de code dans 17 avions . En fait, l'apprentissage d'Unicode peut être comparé à l'apprentissage d'un langage de programmation distinct.

Sans surprise, les développeurs Web négligent certaines des nuances. D'un autre côté, les attaquants peuvent utiliser les fonctionnalités d'Unicode à leurs propres fins, ce qu'ils font.

Le spécialiste de la sécurité John Gracie a présenté un exemple de bogue de vérification de courrier électronique GitHub pour récupérer un mot de passe oublié. Des bogues similaires peuvent être trouvés sur d'autres sites.

John Gracie explique ce qu'est une «collision de traduction de signe» lorsque deux caractères différents après la conversion sont traduits en le même caractère.

Dans ce cas, il a utilisé le caractère turc 'ı' ('i' sans point), qui est traduit en latin 'i', de sorte que l'adresse John@Gıthub.com mail John@Gıthub.com après traitement se transforme en John@Github.com :

 'ß'.toLowerCase() // 'ss' 'ß'.toLowerCase() === 'SS'.toLowerCase() // true // Note the Turkish dotless i 'John@Gıthub.com'.toUpperCase() === 'John@Github.com'.toUpperCase() 

De telles collisions se retrouvent sur tous les avions Unicode: voici la liste complète .

Nous nous intéressons principalement aux caractères traduits en caractères latins. Il n'y a que onze options. À la troisième place du tableau se trouve juste le signe turc «i» sans point.

SignePoint de codeRésultat
ß0x00DFSS
ı0x0131I
ſ0x017FS
0xFB00FF
fi0xFB01FI
fl0xFB02FL
0xFB03FFI
0xFB04FFL
0xFB05ST
0xFB06ST
K0x212Ak

GitHub a permis à un attaquant d'obtenir un mot de passe du compte de quelqu'un d'autre, car la procédure de récupération d'un mot de passe oublié ne fonctionnait pas correctement.

Dans le cadre de cette procédure, l'adresse e-mail saisie a été comparée à l'adresse stockée dans la base de données. Algorithme de vérification:

  1. L'adresse saisie est en minuscules à l'aide de la méthode toLowerCase.
  2. L'adresse saisie est comparée à l'adresse dans la base de données des utilisateurs enregistrés.
  3. Si une correspondance est trouvée, le mot de passe de la base de données est envoyé à l'adresse entrée .

De toute évidence, les développeurs n'étaient pas au courant de la collision de la traduction d'adresses lors de l'utilisation de la méthode toLowerCase .

Dans ce cas, la correction de l'erreur est simple. Il suffit d'envoyer le mot de passe non pas à l'adresse saisie, mais à l'adresse de la base de données.

Bien sûr, ce n'est pas une correction de bogue complète, mais seulement un correctif rapide. Une solution plus complète serait de diffuser à Punycode pour vérification: John@Gıthub.comxn—john@gthub-2ub.com . Punycode a été conçu pour convertir de manière unique les noms de domaine en une séquence de caractères ASCII. L'adresse e-mail peut être vérifiée de la même manière, mais pas la plupart des applications Web.

John Gracie a reçu une récompense en espèces et 2500 points pour la vulnérabilité, bien qu'il soit encore loin du pirate informatique principal Github Alexander Dobkin <img src = 404 onerror = alert (document.domain)> : un utilisateur avec un nom aussi inhabituel a déjà gagné 30750 points, y compris pour exécuter du code arbitraire sur les serveurs GitHub qui génèrent des pages GitHub.


Messenger se bloque lors de la réception d'emoji à point noir (Messenger sur iOS, WhatsApp pour Android)

Les bogues liés à Unicode ont une telle propriété qu'ils peuvent être trouvés dans n'importe quelle application qui traite le texte entré par l'utilisateur. Des vulnérabilités existent dans les applications Web et dans les programmes natifs pour Android et iOS. L'un des plus célèbres est le bogue iOS de 2015 , lorsque plusieurs caractères Unicode dans un message texte ont provoqué le plantage du système d'exploitation. L'année dernière, un bug Unicode similaire a été découvert dans iOS 11.3, il est connu sous le nom de «point noir» . Un plantage similaire s'est produit dans l'application WhatsApp pour Android lorsque vous touchez les emoji.






Source: https://habr.com/ru/post/fr481318/


All Articles