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()
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.
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:
- L'adresse saisie est en minuscules à l'aide de la méthode toLowerCase.
- L'adresse saisie est comparée à l'adresse dans la base de données des utilisateurs enregistrés.
- 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.com
→
xn—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.

