Journal Campagne d'hameçonnage, Firefox et Chrome vulnérables.

Posté par  (site web personnel) . Licence CC By‑SA.
31
17
avr.
2017

Bonjour Nal<

Quelques mots rapides pour prévenir d'une faiblesse dans les navigateurs Firefox et Chrome pour leurs versions actuelles (respectivement 52 et 57.) : il s'agit d'un problème avec l'usage de l'unicode dans l'enregistrement de domaines permettant de faire passer ceux-ci pour d'autres domaines. Firefox et Chrome n'y voient que du feu.

Concrètement : on clique sur un lien malicieux (qui lui même présente un nom légitime lors du passage de la souris en survol) qui nous amène vers un site malicieux, et nos navigateurs affichent le nom de domaine légitime. Si le site malicieux présente un chiffrement fiable alors nous verrons même le petit cadenas vert indiquant que tout va bien. Depuis quelques jours un exemple est donné par le site "wordfence" :

L'image de la barre d'adresse de firefox visitant le site légitime :

L'image de la barre d'adresse de firefox visitant le site malicieux :

Difficile dès lors de se douter que quelque chose ne va pas, mais alors pas du tout. On imagine sans peine ce que cela donne avec un nom de domaine unicode qui se fait passer pour le domaine d'une banque…

Pour éviter ce comportement de Firefox, éditez sa configuration ainsi :
about:config -> network.IDN_show_punycode = true

Bon dimanche.
Et merci aux experts de la ³bune, ici Finss<, pour avoir relayés ce lièvre là \o/
https://www.wordfence.com/blog/2017/04/chrome-firefox-unicode-phishing/

  • # Correction

    Posté par  . Évalué à 8.

    Pour éviter ce comportement de Firefox, éditez sa configuration ainsi :
    about:config -> network.IDN_show_punycode = false

    Il faut passer la valeur à "true", pas "false" (qui est la valeur par défaut).

  • # s/false/true

    Posté par  . Évalué à 2.

    Pour éviter ce comportement de Firefox, éditez sa configuration ainsi :
    about:config -> network.IDN_show_punycode = false

    Il faut passer la valeur de network.IDN_show_punycode à true afin de voir l'url «réel».

  • # Commentaire ci-dessous

    Posté par  . Évalué à 3.

    Quel est le caractère (ou les …) qui ont été remplacés ici, et par quoi ? Les divers "punycode converters" m'affichent toujours epic.com, et si je copie paste ou regarde le code source c'est l'orthographe fiable avec les caractères latins qui est affichée.
    Du coup je comprends bien le trick mais je ne vois pas où il est placé… ?

    • [^] # Re: Commentaire ci-dessous

      Posté par  . Évalué à 4.

      Je n'ai jamais rien compris au punycode mais est-ce que ce ne serait pas une représentation des caractères latin via les calculs du punycode ? (cette phrase ne veut pas dire grand chose mais j'espère que quelqu'un comprendra)

      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

      • [^] # Re: Commentaire ci-dessous

        Posté par  . Évalué à 3.

        Ma question n'était déjà pas claire, ça n'aide pas … Les navigateurs font sûrement une corrélation entre le caractère unicode et le caractère ascii le plus proche.
        Mais oui le punnycode c'est imbitable, donc je comprends qu'ils ne l'affichent pas tel quel. Et du coup ça pose les problèmes soulevés ici. La solution serait ptêt d'avertir l'utilisateur que l'URL contient des caractères non-ascii

        • [^] # Re: Commentaire ci-dessous

          Posté par  . Évalué à 4.

          Ce que je veux dire, c'est que le punycode en question correspond peut-être à de l'ascii. Je vais partir une représentation qui n'est pas du pynicode. Donc, en utilisant une méthode à la con où on remplace les caractères unicode par <4chiffres pour leur représentation unicode>. déf devient d\00E9f. On pourrait représenter le domaine abc.com par \U+00610062\0063.com. C'est peut-être la même technique qui est employée dans ce cas.

          « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

      • [^] # Re: Commentaire ci-dessous

        Posté par  (site web personnel) . Évalué à 7.

        L'astuce est ultra-simple (et connue depuis 2001 ?). Il suffit de remplacer un caractère ascii (range 31-255 ?) par un caractère y ressemblant (par exemple, des lettres de l'Alphabet_cyrillique).

        Bon courage pour faire la différence entre ces deux URL :
        https://www.аррӏе.com/
        https://www.apple.com/

        Ici, la différence subtile est sur la lettre 'l', comme le montre l'extension IDND dans Mozilla Firefox. La première URL n'est pas le site officiel, contrairement à la seconde URL.

        Le punycode sert à faire la conversion entre www.аррӏе.com (il)lisible par les humains en un truc résolvable par les DNS, comme www.xn--80ak6aa92e.com

        Capture d'écran d'IDND affichant le vrai nom de domaine derrière www.аррӏе.com

        • [^] # Re: Commentaire ci-dessous

          Posté par  . Évalué à 3.

          L'astuce est ultra-simple (et connue depuis 2001 ?). Il suffit de remplacer un caractère ascii (range 31-255 ?) par un caractère y ressemblant (par exemple, des lettres de l'Alphabet_cyrillique).

          La question original, du thread, c'est de savoir lequel justement dans ce cas ci.

          Le punycode sert à faire la conversion entre www.аррӏе.com (il)lisible par les humains en un truc résolvable par les DNS, comme www.xn--80ak6aa92e.com

          J'ai bien compris ça, c'est l'algo que je ne comprends pas, comment arrive de www.аррӏе.com à www.xn--80ak6aa92e.com.

          « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

          • [^] # Re: Commentaire ci-dessous

            Posté par  . Évalué à 3.

            • [^] # Re: Commentaire ci-dessous

              Posté par  . Évalué à 4.

              J'ai lu, mais je ne trouve pas ça clair du tout.

              « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

              • [^] # Re: Commentaire ci-dessous

                Posté par  (site web personnel, Mastodon) . Évalué à 5.

                • On met "xn--" au début de la chaîne (ce qui permet de reconnaître que c'est du punycode et évite les conflits avec les domaines existants),
                • On prend tous les caractères ASCII et on les laisse juste après le --,
                • On rajoute un - pour séparer de la suite,
                • Enfin, on prend les caractères non-ASCII (avec des accents, cyrilliques, etc) et pour chacun on insère dans la chaîne des caractères qui encodent, d'une part, le numéro unicode du caractère, et d'autre part, la position dans la chaîne initiale où il faut les insérer.

                Par exemple, аpple.com (avec un a en cyrillique), devient xn--pple-43d.com.
                On voit le xn--, le "pple" (аpple sans le а), le -, et le 43d qui dit "il faut insérer un а en position 0".

                • [^] # Re: Commentaire ci-dessous

                  Posté par  . Évalué à 8.

                  Mais comment tu traduit 43d en "il faut insérer un а en position 0" ?

                  « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

                  • [^] # Re: Commentaire ci-dessous

                    Posté par  . Évalué à 4.

                    Pareil lorsqu'il y a plusieurs zone de remplacement : pаpа.com avec les a en cyrillique, ça donne xn--pp-7kcb.com

                    J'ai lu vite fait les spécifications. Il manque une bête présentation globale du fonctionnement.

                    • [^] # Re: Commentaire ci-dessous

                      Posté par  . Évalué à 4.

                      Il y a une tentative de demystification sur wikipedia. Ca n'a rien d'évident ou de trivial, mais ca permet d'apprehender la mecanique de l'algo:

                      https://en.wikipedia.org/wiki/Punycode

                      • [^] # Re: Commentaire ci-dessous

                        Posté par  . Évalué à 2.

                        L’explication n’est pas encore d’une clarté époustouflante…

                        Quoiqu’il en soit, même si on comprend comment fonctionne le Punycode, ça reste illisible.
                        Si les navigateurs avaient la bonne idée d’afficher, plutôt que le Punycode, les caractères ASCII tels quels et les numéros Unicode (précédés d’un caractère d’échappement) pour les autres, ce serait déjà un peu plus gérable.

                        « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

                        • [^] # Re: Commentaire ci-dessous

                          Posté par  . Évalué à 2.

                          Tu connais la table Unicode par cœur?
                          Je sais pas toi, mais \uD83D\uDD95 ou A43D pour moi c'est kif kif, je sais pas ce que c'est

                          Linuxfr, le portail francais du logiciel libre et du neo nazisme.

                          • [^] # Re: Commentaire ci-dessous

                            Posté par  . Évalué à 2.

                            Tu connais la table Unicode par cœur?

                            Je sais que les caractères latins courants sont au début, avant U+0300 (et même avant U+0100 pour la plupart de ceux utilisés en français). Si j’étais russe, je suppose que j’arriverais à retenir à peu près la zone des caractères cyrilliques.

                            Je sais pas toi, mais \uD83D\uDD95

                            Donc si je vois ça dans la barre d’adresse, c’est louche, improbable que ce soit un URL légitime. Enfin si j’ai un doute, je peux toujours regarder dans la table de caractères (d’ailleurs les codes que tu as choisis ne correspondent même pas à des caractères).

                            ou A43D pour moi c'est kif kif, je sais pas ce que c'est

                            Oui, enfin un code Punycode, il faut le « dépunycoder » puis chercher quand même dans la table de caractères pour savoir ce que c’est vraiment. Une étape de plus.
                            Sans compter qu’avec le Punycode, on ne voit même pas où s’insèrent les caractères non ASCII. C’est quand même particulièrement abscons.

                            « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

                            • [^] # Re: Commentaire ci-dessous

                              Posté par  . Évalué à 3.

                              Je sais que les caractères latins courants sont au début, avant U+0300 (et même avant U+0100 pour la plupart de ceux utilisés en français). Si j’étais russe, je suppose que j’arriverais à retenir à peu près la zone des caractères cyrilliques.

                              Et ca t'avance a quoi? T'es toujours pas capable de lire le nom de domaine.

                              d’ailleurs les codes que tu as choisis ne correspondent même pas à des caractères

                              C'est pas des "caractères", c'est un emoji. C'est précisément mon point, unicode est un encodage particulièrement complique, prétendre pouvoir le lire a la volée est délirant.

                              Linuxfr, le portail francais du logiciel libre et du neo nazisme.

                              • [^] # Re: Commentaire ci-dessous

                                Posté par  . Évalué à 4.

                                C'est pas des "caractères", c'est un emoji. C'est pas des "caractères", c'est un emoji. C'est précisément mon point, unicode est un encodage particulièrement complique, prétendre pouvoir le lire a la volée est délirant.

                                Je n’ai pas besoin de me rappeler tous les caractères par cœur pour savoir que ce n’est pas le site d’une banque…

                                Après, je t’accorde que pour cr\u00E8ditmutuel.fr, il faudrait avoir la version décodée à côté pour ne pas avoir à vérifier dans la table des caractères (en l’occurrence, ce n’est pas un é mais un è, mais entre E9 et E8, on pourrait se tromper).
                                Mais si tu as xn--crditmutuel-bbb.fr et pas d’affichage de la version décodée, tu fais quoi ?

                                « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

        • [^] # Re: Commentaire ci-dessous

          Posté par  . Évalué à 2.

          Oui oui j'avais bien compris ça. Mais c'est le caractère unicode (trompeur) que je cherche. Parce que la version punycode est incompréhensible.

          • [^] # Re: Commentaire ci-dessous

            Posté par  (site web personnel) . Évalué à 6.

            $ cat /tmp/coin 
            аррӏе
            apple
            $ cat -A /tmp/coin 
            M-PM-0M-QM-^@M-QM-^@M-SM-^OM-PM-5$
            apple$
            $ hexdump -C /tmp/coin 
            00000000  d0 b0 d1 80 d1 80 d3 8f  d0 b5 0a 61 70 70 6c 65  |...........apple|
            00000010  0a                                                |.|
            00000011
            • [^] # Re: Commentaire ci-dessous

              Posté par  . Évalué à 4.

              La question, c'est quelle est le caractère non ASCII dans epic.com, autrement dit xn--e1awd7f.com.

              « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

              • [^] # Re: Commentaire ci-dessous

                Posté par  (site web personnel) . Évalué à 5.

                Même réponse : copier/coller l'info du site initial, et mêmes commandes dans un terminal.

                $ cat /tmp/coin 
                еріс
                epic
                $ cat -A /tmp/coin 
                M-PM-5M-QM-^@M-QM-^VM-QM-^A$
                epic$
                $ hexdump -C /tmp/coin 
                00000000  d0 b5 d1 80 d1 96 d1 81  0a 65 70 69 63 0a        |.........epic.|
                0000000e
                • [^] # Re: Commentaire ci-dessous

                  Posté par  . Évalué à 4.

                  Merci, j'ai dû raté un copier-coller, j'avais 65 70 69 63 dans les deux cas.

                  « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

                • [^] # Re: Commentaire ci-dessous

                  Posté par  . Évalué à 3. Dernière modification le 17 avril 2017 à 20:33.

                  Excellent, merci.

                  Avec l'hexadecimal et https://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder j'ai pu retrouver les caractères :

                      U+0435 CYRILLIC SMALL LETTER IE character (&#x0435;)
                      U+0440 CYRILLIC SMALL LETTER ER character (&#x0440;)
                      U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I character (&#x0456;)
                      U+0441 CYRILLIC SMALL LETTER ES character (&#x0441;)
                  
                  • [^] # Re: Commentaire ci-dessous

                    Posté par  . Évalué à 10.

                    Je vais faire un peu de publicité non-dissimulée, l'outil en ligne de commande univisible affiche quels points de code constituent une chaine :

                    % univisible -i << EOF
                    еріс
                    epic
                    EOF
                    е (U+0435): CYRILLIC SMALL LETTER IE
                    р (U+0440): CYRILLIC SMALL LETTER ER
                    і (U+0456): CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
                    с (U+0441): CYRILLIC SMALL LETTER ES
                    
                     (U+000A)
                    e (U+0065): LATIN SMALL LETTER E
                    p (U+0070): LATIN SMALL LETTER P
                    i (U+0069): LATIN SMALL LETTER I
                    c (U+0063): LATIN SMALL LETTER C
                    
                     (U+000A)
                    
              • [^] # Re: Commentaire ci-dessous

                Posté par  . Évalué à 10.

                La question, c'est quelle est le caractère non ASCII dans epic.com, autrement dit xn--e1awd7f.com.

                Tous.

                Ce genre d'attaque est veille comme le monde, enfin comme au moins le début des années 2000, et les navigateurs s'en protège en affichant l'URL en punycode lorsqu'ils détectent une URL qui correspond au mixed script confusable c'est à dire qu'un caractère d'un autre script a été utilisé (exemple: tu remplaces le a latin de paypal par un a cyrillique).

                La seule nouveauté ici, c'est qu'ici quelqu'un a pensé a remplacer tous les caractères du domaine par leur équivalent d'un autre script. Forcément les navigateurs ne gueulent pas par ce que c'est valide et souhaité par certains utilisateurs utilisant autre chose que les caractères latins.

                Pour ceux que ca intéresse la notion de confusable, mixed script confusables ou whole script confusables est très bien expliquée et documentée là: http://unicode.org/reports/tr39/

                Unicode est un outil formidable qui te permet de prendre en pleine face tous les problèmes issus de quelques milliers d'évolution humaine et quelques dizaines d'années d'évolution informatique. Les normalisations NFC / NFD, le dépassement des 16 bits du BMP, le bi-di, les algos de collation, de localisation et les dizaines d'autres subtilités sont des sources de joies permanentes :)

  • # représentation visuelle des noms de domaine

    Posté par  . Évalué à 8.

    Ayant été professionnellement confronté à cette problématique, je n'ai jamais trouvé de solution simple pour nos clients. Mais pour nous « geeks », je me suis dit que le salut tient dans une représentation visuelle du nom de domaine basée sur le hash cryptographique de celui-ci, mis à disposition par exemple par une ​extension du navigateur. Un peu le même mécanisme que les avatars automatiques qu'on peut trouver sur les forums.

    • [^] # Re: représentation visuelle des noms de domaine

      Posté par  . Évalué à 4.

      C'est effectivement une bonne idée. Il serait à mon avis tout à fais possible de générer une fractale de la taille de barre d'adresse assez facilement, et deux fractales sont facilement différenciables entre elles à cause des formes et des couleurs assez caractéristiques.

      bépo powered

    • [^] # Re: représentation visuelle des noms de domaine

      Posté par  . Évalué à 2.

      Et pourquoi pas afficher tout simplement les caractères non-ASCII avec une couleur de fond différent ? Par exemple dans l'exemple d'apple ci dessus, la fausse adresse s'afficherait: www . apple . com, avec la partie en gras sur fond orange au lieu de blanc.

      Ça ne marcherait pas toujours, par ex. des sites légitimes avec un é pourraient avoir cette lettre remplacée par un caractère différent mais homographe (si ça existe), mais ça permettrait au moins de faire apparaitre le problème pour les noms ASCII, soit la grande majorité des sites.

      • [^] # Re: représentation visuelle des noms de domaine

        Posté par  . Évalué à 4.

        À mon sens, c'est moins universel qu'un « avatar automatique » : ça marche très bien pour les populations utilisant nativement l'alphabet ASCII ou proche (les parties latines d'Unicode, hors ASCII, autorisées par l'AFNIC par exemple), mais les utilisateurs d'alphabets grecs, cyrilliques, etc. seraient lésés dans le sens où la plupart des domaines, y compris légitimes, seraient colorés. Il ne faut pas oublier que chez eux, c'est l'inverse (on utilise le 'o' ASCII pour imiter un 'ο' (omicron))…

    • [^] # Re: représentation visuelle des noms de domaine

      Posté par  . Évalué à 3.

      Ça ne va pas, ton image générée n'est pas mémorisable (il y aurait trop d'images à retenir, trop de domaines).
      Un avatar aléatoire, ça va bien par contre car il s'inscrit dans une discussion entre plusieurs avatars, du coup quand tu lis la conversation, tu vois que "rectangle bleu répond à cercle rouge, puis cercle rouge répond à rectangle bleu", tu les as tous sous les yeux.
      Pour un site, tu ne peux pas comparer l'image générée pour le domaine normal et le domaine légèrement modifié.

      • [^] # Re: représentation visuelle des noms de domaine

        Posté par  . Évalué à 3.

        Et surtout ça ne fonctionne que pour les domaines que tu visites régulièrement.

        Première visite, c'est mort puisque tu n'as jamais vu à quoi ça ressemble.
        Une visite tous les mois, je doute qu'on s'en souvienne (ou alors peu de gens).

  • # correction

    Posté par  (site web personnel, Mastodon) . Évalué à 10.

    Firefox et Chrome n'y voit que du feu

    Non, ce ne sont pas les navigateurs qui n'y voient que du feu : ils ne font qu'afficher le nom de domaine et le certificat qui va avec.

    C'est l'utilisateur qui n'y voit que du feu. Malheureusement.

    Après faudrait que les navigateurs détectent ce genre de tromperies, afin d'en avertir l'utilisateur. Mais là ce n'est pas évident.

    Notez qu'il restera une différence si le site d'origine a un certificat validé manuellement (Extended Validated Certificate), puisqu'alors le nom du propriétaire du site apparait à coté de l'URL. Et que pour avoir un EVC, il faut montrer patte blanche (en théorie, il faut fournir de la paperasse pour prouver que l'on possède le nom de domaine). Mais il restera des utilisateurs qui ne feront pas gaffe (surtout si ils ne sont jamais allés sur le vrai site).

    • [^] # Re: correction

      Posté par  . Évalué à 6.

      Et que pour avoir un EVC, il faut montrer patte blanche

      plus ou moins

      Mais il restera des utilisateurs qui ne feront pas gaffe

      La plupart ne font pas gaffe du tout

    • [^] # Re: correction

      Posté par  (site web personnel) . Évalué à 3. Dernière modification le 18 avril 2017 à 18:33.

      En théorie oui. En pratique peux tu dire que tu vois la différence entre : аррӏе & apple ? lorsqu'on y prête attention, on remarque la subtile différence, mais sincèrement, au jour le jour : regardes tu si précisement tout les domaines ? Ouvres tu systématiquement tout les certificats pour les regarder de tes yeux ? Tout tes utilisateurs le font aussi ?
      Non, bien probablement non.

      C'est pourquoi les navigateurs s'en protègent un peu, par exemple avec Chromium & Chrome :
      https://www.chromium.org/developers/design-documents/idn-in-google-chrome

      Mais ce n'est visiblement pas/plus suffisant. Alors bien que la vérification visuelle soit possible, et bien qu'effectivement la phrase "les navigateurs n'y voient que du feu" est incomplète, il n'en reste pas moins que des contre-mesures sont déjà en place, et que des mises à jour sont attendues.

      • [^] # Re: correction

        Posté par  (site web personnel, Mastodon) . Évalué à 5. Dernière modification le 19 avril 2017 à 14:41.

        Euh… je ne sais pas si tu as bien lu mon commentaire, mais on est d'accord hein…

        Il y a juste le fait que l'utilisation de l'expression "navigateur n'y voit que du feu" n'est pas adéquate. Ça ne veut pas trop dire grand chose. Il me semble en effet qu'un navigateur n'est pas un être vivant, il n'a pas d'yeux, il ne voit pas, il se contente de traiter les données (certes, insuffisamment dans le cas présent). Bref, une histoire de français quoi.

  • # Ça pourrait être pire

    Posté par  . Évalué à 10.

    … on pourrait être russe.

    Imaginons une banque russe qui aurait un site parfaitement légitime avec une adresse en cyrillique.
    Un « hameçonneur » fait un faux site avec un caractère latin remplaçant un caractère cyrillique identique.
    Alors le client russe méfiant active l’affichage du Punycode sur son navigateur et doit faire la différence… entre deux chaînes ASCII imbitables !

    « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.