Kontrola homografov IDN

Dve mená môžu byť napísané rozdielnymi znakmi a stále sa čítať rovnako. apple.com a аpple.com — kde prvé písmeno je cyrilské malé a — sú pre sieť rozdielne mená a pre čitateľa to isté slovo. Táto stránka rozloží meno a povie, ktorým z týchto dvoch je: rozdelí meno na štítky, dekóduje každý štítok xn-- späť na znaky, ktoré obsahuje, spočíta bajty voči limitom DNS, pomenuje každý zamieňateľný znak spolu s písmom, z ktorého si ho požičal, a celé meno zredukuje na tvar, ktorý napodobňuje. Hlási, čo nájde, aj čo nenájde, rovnako podrobne, takže čistá odpoveď znamená, že kontroly prebehli a prešli, a nie že sa nič neskúmalo.
Všetko spracovanie prebieha lokálne v prehliadači — zadané meno sa nikdy neodosiela a nerieši.

Nové v tejto téme? IDN homografy vysvetlené jednoducho — čo robí punycode a čo nerobí, prečo prehliadač niekedy zobrazí xn-- a prečo je táto stránka skôr súborom kontrol než verdiktom.
Čítať vstup ako: Najprv zredukovať meno na NFC
ČÍTA SA AKO —
FORMULÁR DNS (čo dostane resolver) —
VEĽKOSŤ —
Zatiaľ nič nebolo skontrolované. Zadá sa alebo vloží meno vyššie — jedno meno naraz — alebo sa stlačí Načítať príklad. Stránka prečíta holé meno, meno vložené z URL alebo celú URL a oznámi, ktoré z nich spracovala. Každá kontrola, ktorú vykoná, je uvedená pod výsledkom, vrátane tých, ktoré nič nenašli.
Čo je IDN homograf?
Homograf je slovo napísané jedným spôsobom a čítané iným. V doménovom mene trik zvyčajne stojí jeden znak: apple.com má sedem latinských písmen, kým аpple.com začína znakom U+0430, cyrilským malým písmenom a, ktoré sa vykreslí rovnakým tvarom v každom bežnom písme. Pre sieť ide o dve rozdielne mená. Pre oko je to to isté slovo a len jedno z nich patrí Apple.

Názvy boli prvé dve desaťročia DNS iba v ASCII, a preto sa všetko o nich meria v bajtoch a písmenách: štítky z písmen, číslic a spojovníkov, najviac 63 bajtov každý, najviac 255 bajtov celkom. Medzinárodné názvy domén (IDN) vznikajú vtedy, keď sa pravidlá otvoria zvyšku Unicode, a punycode (RFC 3492) je pravidlo zápisu, ktoré udržiava starý mechanizmus v chode: štítok obsahujúci čokoľvek mimo ASCII sa zapíše ako štítok xn--, teda reťazec ASCII s rovnakými znakmi v zredukovanej podobe. 中文.com sa prenáša ako xn--fiq228c.com a oba zápisy označujú ten istý hostiteľ.

Podstatná vec je, čo punycode nerobí. Mení zápis a nič iné. Nemá názor na to, či by sa аpple.com mal dovoliť vedľa apple.com, a nemožno sa ho na to opýtať, pretože táto otázka sa týka očí a písiem, nie bajtov. O tom, ktoré znaky predá register, rozhodne register; o tom, ako zobrazí meno, ktoré považuje za bezpečné, rozhodne prehliadač; a o tom, či kliknúť, rozhodne čitateľ. Táto stránka odpovedá na otázku pod všetkými tromi: z akých znakov sa toto meno skutočne skladá a čo z neho robí, že sa číta tak, ako sa číta?

Prípady, voči ktorým je táto stránka overená

Každý riadok nižšie spúšťa táto stránka pri načítaní a znova tlačidlo Samotest, a stránka musí hlásiť presne to, čo riadok hovorí — tie isté nálezy, tá istá úroveň, tvar DNS, rovnaký počet bajtov, nič viac ani menej. Práve preto má čistá odpoveď tu nejakú hodnotu: cesta kódu, ktorá prepustí obyčajné meno, je tá istá, ktorá zachytí triky uvedené nižšie.

Aký je to prípad Úroveň Meno tak, ako prichádza Čo musí stránka hlásiť

Ako táto stránka rozhoduje
  1. Meno sa vyberie z toho, čo sa vložilo. Holé meno sa použije tak, ako je; z URL sa vyberie hostiteľ a schéma, port, cesta a dotaz sa vypustia a stránka oznámi, ktorý z týchto dvoch prípadov nastal, namiesto toho aby potichu analyzovala lomku, akoby bola súčasťou mena.
  2. Vyčistí sa tak, ako by to urobil klient. Riadiace znaky, znaky nulovej šírky a značka poradia bajtov sa vypustia, úplná šírková alebo ideografická bodka sa počíta ako bodka a koncová bodka je koreň, nie chyba. Každý znak odstránený alebo inak interpretovaný takýmto spôsobom sa hlási, pretože potichu vypustená medzera nulovej šírky je presne to, o čom treba byť informovaný.
  3. Meno sa rozdelí na štítky a každý sa zmeria. Štítok nesmie byť prázdny, nesmie začínať ani končiť spojovníkom a nesmie mať dva spojovníky na pozíciách tri a štyri, pokiaľ nejde o štítok xn--. Každý štítok sa meria v bajtoch UTF-8 voči hornej hranici 63 bajtov a celé meno voči 255.
  4. Každý štítok xn-- sa dekóduje späť na jeho znaky. Dekódovaný štítok sa potom zakóduje druhýkrát a porovná s tým, čo sa zadalo. Štítok, ktorý tento prechod nevydrží, nie je štítok, za ktorý sa vydáva, a ten, ktorý sa dekóduje na riadiaci znak alebo na nič, sa hlási ako taký, namiesto toho aby bol potichu vypustený.
  5. Zisťuje sa, čo je každý znak. Jeho kódový bod, jeho bajty UTF-8, písmo, ku ktorému patrí, či sa nachádza v skupine znakov, ktoré sa kreslia rovnako, a čo sú ostatné členy tejto skupiny. Práve tu prestáva byť cyrilské a „písmenom“ a stáva sa „písmenom, ktoré má tvar latinského“.
  6. Meno sa zredukuje na tvar, ktorý napodobňuje. Každý zamieňateľný znak sa nahradí znakom, ktorý pripomína, čím sa аpple.com zmení na apple.com. Toto zredukované čítanie je najužitočnejší riadok na stránke, pretože apple.com je niečo, s čím sa dá konať, kým „cyrilské a“ nie je.
  7. Zbierajú sa nálezy a hlási sa najhorší z nich. Nálezy sa hlásia raz každý, so štítkami, v ktorých sa vyskytujú. Meno, ktoré len pôsobí neobvykle, vytvára poznámky namiesto nálezov: zmiešanie písma Han a Kana alebo koncová koreňová bodka je bežný zápis, nie dôvod na obavy.

Úrovne a to, čo tvrdia

žiadna nič tu nestálo za zmienku — nízka to isté meno napísané druhým spôsobom — stredná znak, ktorý DNS nenesie, alebo taký, ktorý sa redukuje na obyčajné písmeno — vysoká meno vytvorené tak, aby sa čítalo ako iné meno, alebo také, ktoré sa vôbec nedá odoslať.

Úroveň je najhoršie, čo by nálezy mohli znamenať, nie pravdepodobnosť a nie úsudok o stránke. Úplne poctivé meno môže mať stredný stupeň, pretože obsahuje jeden znak mimo abecedy názvov hostiteľov, a nepriateľské meno môže dostať vysoký stupeň aj len kvôli cyrilskému písmenu. Zoznam pod úrovňou vysvetľuje prečo, jeden riadok na každý nález, a práve tento zoznam stojí za prečítanie.

Kontroly, ktoré vykonáva, jedna po druhej

Tabuľka nižšie je zostavená zo zoznamu, z ktorého stránka hlási, takže riadok tu a nález vo výsledku sa nemôžu rozchádzať. Kontrola, ktorá nič nenašla, je uvedená ako nie: zmyslom tabuľky je, aby bolo vidieť, že otázka bola položená a zodpovedaná, a nie hádať, či vôbec padla.

Kontrola Najhoršie, čo to môže znamenať Čo hľadá

Ten istý zoznam riadi poznámky, ktoré nemajú vôbec žiadnu úroveň: štítok bez bodky, koncová koreňová bodka, doména najvyššej úrovne, ktorá nie je ASCII, oddeľovač iný než bodka, meno s veľkými písmenami, znaky odstránené pri čistení a URL zredukovaná na hostiteľa.

Limity, ktoré vynucuje DNS

Meno je zoznam štítkov a každý z nich sa počíta v bajtoch, nie v znakoch. Tento rozdiel je celý dôvod, prečo existuje punycode: 中文 sú dva znaky a šesť bajtov, a ich tvar xn-- má pätnásť znakov, takže zakódovaný tvar musí vyhovieť limitu. Stránka uplatňuje obe hranice a hlási, ktorú z nich prekročilo.

Limit Hodnota Čo sa stane na okraji
Prečo prehliadač niekedy zobrazí xn--

Možno si niekto všimol, že meno napísané čínsky alebo cyrilikou sa niekedy v adresnom riadku objaví ako nezmysel xn-- namiesto znakov, ktoré by sa čakali. Je to prehliadač, ktorý odmieta zobraziť pekný tvar, nie zlyhanie registrácie na strane stránky. Prehliadač uplatňuje vlastné pravidlo na meno, ktoré ešte nikdy nevidel, a toto pravidlo existuje z rovnakého dôvodu, pre aký existuje celá táto stránka: zobrazenie аpple.com ako аpple.com je presne to, čo útočník chce, takže neznáme meno so zmiešaným písmom sa zobrazí vo svojom zakódovanom zápise, kým ho prehliadač neuvidí dostatočne často na to, aby mu dôveroval.

Kde sa meno objaví Čo sa zobrazí Prečo

Čo táto stránka nerobí
Ide o súbor kontrol, nie o verdikt a nie o zoznam blokovaných stránok. Uvádza, z čoho sa meno skladá; nemá žiadnu predstavu o tom, čo stránka robí. Meno môže prejsť všetkými kontrolami a napriek tomu byť phishingová stránka; a meno môže byť označené ako meno so zmiešaným písmom a byť úplne bežnou webovou stránkou patriacou niekomu, kto píše vo svojom jazyku. Skupiny tvarov sú ručne zostavenou podmnožinou zamieňateľných znakov podľa UTS #39, takže dvojicu znakov, ktorú táto stránka nepozná, neoznámi. Nič sa tu nerieši, nesťahuje ani nevyhľadáva: meno, ktoré sa zadá, nikdy neopustí prehliadač, čo zároveň znamená, že stránka nemôže vedieť, či meno existuje.
Odkiaľ pochádzajú pravidlá

Punycode je RFC 3492 a samotest na tejto stránke ako svoju prvú kontrolu spúšťa jedenásť vzorových štítkov uvedených v tomto dokumente, takže kodér tu je overovaný voči príkladom v norme, nie voči sebe samému. Pravidlá spracovania, ktorými prechádza IDN, sú RFC 5891 s tabuľkami znakov RFC 5892 a vrstva kompatibility, ktorú prehliadače skutočne uplatňujú, je UTS #46 s príznakom netranzitívnosti; táto stránka hovorí, čo tieto pravidlá robia, namiesto toho aby sa tvárila, že ich implementuje, a redukcia, ktorú uplatňuje — NFC, potom malé písmená, potom RFC 3492 — je rovnaká krátka postupnosť, ktorú klient vykoná pred odoslaním mena. Skupiny tvarov, pásma písiem a tabuľky neviditeľných znakov v tejto rodine stránok boli napísané ručne pre túto rodinu: normy sú pomenované, aby ich bolo možné prečítať, a žiadny text z nich sa tu nereprodukuje.

Otázky

Je meno so zmiešaným písmom vždy útok?

Nie, a považovať to za takéto by bolo nesprávne v zmysle, na ktorom záleží. Japončina píše znaky Han a Kana v tom istom slove a kórejčina píše znaky Han vnútri hangulu. Čo nemá bežné vysvetlenie, je latinka zmiešaná s cyrilikou alebo s gréckym písmom v jednom štítku, pretože tieto písma sa v žiadnom jazyku spolu nepoužívajú, a stránka vedie čiaru práve tu, namiesto toho aby označila každú zmes. Preto sú japonské a kórejské riadky v tabuľke prípadov vyššie čisté.

Prečo sa vlastné meno vyhodnotí ako stredné?

Najpravdepodobnejšie preto, že obsahuje jeden znak, ktorý abeceda názvov hostiteľov nezahŕňa — podčiarknik, medzeru, diakritiku zapísanú ako znak kompatibility — a to je stredný stupeň, pretože meno sa tak nedá odoslať v pôvodnom tvare. Stredný stupeň znamená „treba sa na to pozrieť“, nie „toto je falzifikát“. Nález pod úrovňou pomenuje presný znak a jeho pozíciu.

Hovorí mi táto stránka, či je meno nebezpečné, registrované alebo dostupné?

Nie, v každom z troch prípadov. Nikdy sa nedotkne siete a nič nerieši, takže nemôže vedieť, či meno existuje alebo kto ho vlastní, a úmyselne nič nehovorí o tom, čo stránka robí. Odpovedá na užšiu otázku, ktorú možno overiť: z akých znakov sa toto meno skladá, a ak zredukujem zamieňateľné znaky na písmená, ktoré napodobňujú, čo sa z toho číta?

Meno je v čínštine a stránka hovorí, že doména najvyššej úrovne nie je ASCII. Je niečo v neporiadku?

Nič nie je zlé. Čínska doména najvyššej úrovne sa prenáša ako samostatný štítok xn--, takže posledný štítok mena je zapísaný v zakódovanom tvare a stránka to uvádza. Poznámky nemajú úroveň, pretože opisujú skutočnosť, nie problém.

Prečo riadok „číta sa ako“ niekedy ukáže to isté meno, aké bolo zadané?

Pretože stránka zobrazí zredukované čítanie len vtedy, keď redukcia skutočne niečo zmení. Ak je každý znak v mene už tvarom, ktorý napodobňuje, zredukované čítanie a meno sú ten istý reťazec a nie je čo hlásiť.

Čo je A-štítok a U-štítok?

A-štítok je ASCII tvar, ktorý sa prenáša: xn--fiq228c. U-štítok je ten istý štítok zapísaný v písme, ku ktorému patrí: 中文. Sú to dva zápisy jedného štítka a stránka pri každom dekódovanom štítku zobrazí oba, aby bolo vidieť, čo sa za zakódovaným štítkom skrýva.