- PVSM.RU - https://www.pvsm.ru -

Взлом с помощью Юникода (на примере GitHub)

Взлом с помощью Юникода (на примере GitHub) - 1Юникод [1] исключительно сложен. Мало кто знает все хитрости [2]: от невидимых символов и контрольных знаков до суррогатных пар и комбинированных эмодзи (когда при сложении двух знаков получается третий). Стандарт включает 216 кодовых позиций в 17-ти плоскостях [3]. По сути, изучение Юникода можно сравнить с изучением отдельного языка программирования.

Неудивительно, что веб-разработчики упускают из вида некоторые нюансы. С другой стороны, злоумышленники могут использовать особенности Юникода в своих целях, что и делают.

Специалист по безопасности Джон Грейси продемонстрировал на примере GitHub [4] баг проверки адреса электронной почты для восстановления забытого пароля. Подобные баги можно встретить и на других сайтах.

Джон Грейси объясняет, что такое «коллизия трансляции знаков», когда два разных знака после конвертации транслируются в один и тот же знак.

В данном случае он использовал турецкий символ 'ı' ('i' без точки), который транслируется в латинскую 'i', так что почтовый адрес John@Gıthub.com после обработки превращается в John@Github.com:

'ß'.toLowerCase() // 'ss'
'ß'.toLowerCase() === 'SS'.toLowerCase() // true

// Note the Turkish dotless i
'John@Gıthub.com'.toUpperCase() === 'John@Github.com'.toUpperCase()

Такие коллизии можно найти по всем плоскостям Юникода: вот полный список [5].

Нас интересуют в первую очередь те знаки, которые транслируются в латинские символы. Таких всего одиннадцать вариантов. На третьем месте в таблице как раз турецкий знак 'i' без точки.

Знак Кодовая точка Результат
ß 0x00DF SS
ı 0x0131 I
ſ 0x017F S
0xFB00 FF
0xFB01 FI
0xFB02 FL
0xFB03 FFI
0xFB04 FFL
0xFB05 ST
0xFB06 ST
0x212A k

GitHub позволял злоумышленнику получить пароль от чужого аккаунта, потому что процедура восстановления забытого пароля работала некорректно.

В рамках этой процедуры выполнялось сравнение введённого адреса электронной почты с адресом, который хранится в базе. Алгоритм проверки:

  1. Введённый адрес переводится в нижний регистр с помощью метода toLowerCase.
  2. Введённый адрес сравнивается с адресом в базе зарегистрированных пользователей.
  3. Если найдено совпадение, пароль из базы данных высылается на введённый адрес.

Очевидно, разработчики не знали о коллизии трансляции адресов при использовании метода toLowerCase.

В данном случае исправить ошибку просто. Достаточно высылать пароль не на введённый адрес, а на адрес из базы данных.

Конечно, это не полное исправление ошибки, а только быстрый патч. Более полным решением будет трансляция в Punycode для проверки: John@Gıthub.comxn—john@gthub-2ub.com. Punycode был разработан для однозначного преобразования доменных имен в последовательность ASCII-символов. Адрес электронной почты можно проверять таким же способом, но большинство веб-приложений этого не делает.

За найденную уязвимость Джон Грейси получил денежное вознаграждение и 2500 очков в рейтинг [6], хотя ему ещё далеко до главного гитхабовского хакера Александра Добкина <img src=404 onerror=alert(document.domain)> [7]: пользователь с таким необычным именем заработал уже 30 750 очков, в том числе за выполнение произвольного кода на серверах GitHub, на которых генерируются страницы GitHub Pages.

Взлом с помощью Юникода (на примере GitHub) - 2
Сбой в мессенджере при получения эмодзи с чёрной точкой (Messenger в iOS, WhatsApp под Android)

Связанные с Юникодом баги имеют такое свойство, что их можно встретить в любом приложении, которое обрабатывает текст, введённый пользователем. Уязвимости есть и в веб-приложениях, и в нативных программах под Android и iOS. Одним из самых известных стал баг iOS от 2015 года [8], когда несколько знаков Юникода в текстовом сообщении вызывали сбой операционной системы. В прошлом году похожий юникодовский баг обнаружили в iOS 11.3, он известен как «чёрная точка» [9]. Похожий сбой происходил в приложении WhatsApp под Android, если прикоснуться к эмодзи.

Взлом с помощью Юникода (на примере GitHub) - 3 [10]

Автор: GlobalSign_admin

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/unicode/340652

Ссылки в тексте:

[1] Юникод: https://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4

[2] все хитрости: https://eng.getwisdom.io/awesome-unicode/

[3] плоскостях: https://ru.wikipedia.org/wiki/%D0%9F%D0%BB%D0%BE%D1%81%D0%BA%D0%BE%D1%81%D1%82%D1%8C_(%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4)

[4] продемонстрировал на примере GitHub: https://eng.getwisdom.io/hacking-github-with-unicode-dotless-i/

[5] полный список: https://eng.getwisdom.io/awesome-unicode/#onetomanycasemappings

[6] 2500 очков в рейтинг: https://bounty.github.com/researchers/jagracey.html

[7] Александра Добкина <img src=404 onerror=alert(document.domain)>: https://bounty.github.com/researchers/adob.html

[8] баг iOS от 2015 года: https://appleinsider.com/articles/15/05/26/bug-in-ios-notifications-handling-crashes-iphones-with-a-simple-text

[9] «чёрная точка»: https://appleinsider.com/articles/18/05/09/black-dot-unicode-bug-crashes-ios-messages-app-using-invisible-characters

[10] Image: https://www.globalsign.com/ru-ru/lp/ny-code-signing-35-off/

[11] Источник: https://habr.com/ru/post/481318/?utm_source=habrahabr&utm_medium=rss&utm_campaign=481318