I've seen people in security saying URLs with Cyrillic characters are dangerous.
Users are often told, to check URLs before clicking on them and/or before entering sensitive information. If an email purporting to come from mybank has a link to mybank.com, then it's probably ok to follow that link. If it has a link to evilsite.cn then the user should probably not follow it. Thus attackers look for ways to make URLs that look legitimate, but are not.
Some characters are logically distinct but rendered in a manner that is difficult or even impossible to distinguish from each other. Even in ASCII this can be a problem, 1 (digit 1) can look similar (or even identical) to l (lowercase letter l). 0 (digit zero) can look similar or identical to O (capital letter O).
However, within ASCII hostnames such opportunities were quite limited for two reasons.
Firstly the way the browsers displayed URLs tended to make the distinctions between o and 0 and l and 1 more distinct than they might otherwise be. Browsers tended to display URLs in lower case, so there was a clear visual distinction between 0 and o and they tended to use proportional fonts where 1 and l had substantially different widths.
Secondly the number of available substitutions was quite small. For example substituting 0 for o and 1 for l in google gives only 8 permutations. Easily a small enough number for google to register them all.
Adding internationalisation to hostnames made the problem worse in two ways.
- Each additional letter that an attacker can substitute, doubles the number of domains that the defender must potentially keep control of to avoid homoglyph attacks on the name.
- Some characters from the Cyrillic alphabet (and to a lesser extent the Greek alphabet) look literally identical to Latin letters when rendered in most common fonts.
If you ever type such characters on a browser you'd see they break into crazy unrecognizable URLs that have nothing to do with the original name.
What you are seeing there is the browsers mitigation against the attack.
To maintain compatibility with existing infrastructure, internationalised domain names were/are implemented by encoding the unicode strings into ASCII ones using a process known as punycode.
When your browser sees an internationalised domain name string that it deems suspicious, it displays the encoded punycode string instead of the internationalised string. Firefox's algorithm for this is documented at https://wiki.mozilla.org/IDN_Display_Algorithm
These threats are not unique to domain names, they come up anywhere where Unicode characters are used as user-supplied identifiers. If you are designing a system with user supplied identifiers you should think very carefully about what characters you will allow. Taking into account both technical and human factors.
Another mitigation you will see in browsers against confusing URLs is to highlight the part of the hostname that is allocated by a public registery in a darker colour. This helps mitigate against stuff like mybank.com.some.long.and.meaningless.string.example.com/another/long/and/meaningless/string where the operator of the site is burried in the middle of the URL.