Символьная уязвимость: как простое сообщение приводит к ошибкам в телефоне
Кадр из фильма “Матрица” (1999)
На фоне возможностей современных смартфонов легко забыть, что мобильная связь — это очень старая технология. Одна только концепция передачи коротких текстовых сообщений была разработана более 30 лет назад. Если бы люди занялись созданием SMS в 2018 году, то, вероятно, не стали бы ограничивать одно сообщение 160 символами (в 7-битной кодировке).
Связь наследует не только ограничения, заложенные при создании. Многие ошибки, скрытые и явные, ждут своего часа годами, начиная с далекого мобильного прошлого. Со временем к ним добавляются новые аппаратные или программные недочёты. Современный смартфон — это своего рода «кремниевое творение Франкенштейна», компоненты которого создаются сторонними компаниями, чей код не полностью контролируют Apple и Google.
В таких условиях не удивляет, что один из самых главных недостатков современной связи (а также мобильных приложений и железа) — это наличие простых уязвимостей, приводящих к выводу из строя различных устройств. Достаточно нескольких символов, чтобы буквально погасить экран самого современного гаджета стоимостью более $1000. Год за годом уязвимость эксплуатируется вновь и вновь. И сегодня мы подробнее рассмотрим, как это происходит.
SMS of death
(с)
Хакеры, исследователи и просто любопытные разработчики всё чаще переключаются с простой социнженерии на поиск более редких атак, которые не требуют сложного взаимодействия с пользователями. Многие уже с настороженностью относятся к ссылкам, полученным от неизвестных контактов. Но большинство по-прежнему доверяют простым текстовым сообщениям, полученным в виде SMS или через мессенджер.
Отсутствие ссылки на вредоносный сайт не означает, что ошибку нельзя инициировать другим способом. Мобильные приложения для корректной работы должны понимать и правильно отображать тысячи символов из сотен языков. А если это редкие языки с необычным написанием? Идеальное поле для возникновения уязвимостей.
Большую известность получила ошибка, связанная с воспроизведением символов Unicode для индийского языка телугу. Проблема возникала на некоторых версиях iOS в приложениях, использующих дефолтный шрифт San Francisсo. Получив всего несколько символов జ్ఞా, пользователь терял управление над многими приложениями в iOS, включая почту и Facebook. Если один из символов телугу появлялся во всплывающих уведомлениях, то блокировался SpringBoard — приложение, отвечающее за главный экран в iOS.
Ошибка изменения символов, приводящая к краху системы, кроется в особенности языка телугу, бенгали и некоторых других диалектов. Она заключается в последовательном построении иероглифов из элементов письма — глифов, при этом имеется определенное расположение символов, не характерное для языка. К сбою приводит преобразование соединительных суффиксов в согласных: когда вторую согласную букву слоговой алфавитной письменности телугу присоединяют к первой согласной для объединения без значительного изменения формы слова. Вследствие несовместимости глифов возникает ошибка, которую не может обработать процессор устройства.
Другое текстовое сообщение — للصبللصبرر ॣ ॣ h ॣ ॣ 冗 — также приводит к сбою в iPhone. Часть подобных ошибок связана с особенностью сокращения длинных сообщений на экране. Если некоторые символы поместить в середине текстового сообщения, написанного на нелатинском языке, включая арабский и китайский, то удастся вызвать сбой системы и перезагрузку телефона.
В перечисленных случаях виновником был не просто Unicode, а Core Text — система, которую Apple использует для вывода символов на экран телефона на основе найденных в Unicode тегов. Core Text генерирует глифы и позиционирует их относительно друг друга. Правила наложения глифов один на другой четко описаны в форматах TrueType и OpenType.
В случае ошибки Core Text «думает», что Unicode «просит» его сделать то, что он буквально не может сделать — отобразить несуществующий символ и создать бесконечное количество графем. Когда Core Text пытается сделать то, что, как ему кажется, означает инструкция, процесс быстро начинает использовать всё свободное количество ОЗУ. iPhone «видит», что используется слишком много памяти, и закрывает «виноватый» процесс — Springboard, рабочий стол телефона.
Наследие прошлого
(с)
Уязвимость существует ровно столько же, сколько существуют текстовые сообщения в мобильной сети. Некоторая особенность работы с символами сразу закладывалась как «фича», чтобы получить доступ к расширенным данным о сети или телефоне с помощью специальных кодов. Например, сейчас на Android код * # * # 4636 # * # * открывает доступ к разнообразной информации, включая расширенные показания батареи и данные по Wi-Fi подключению.
Возможно, вы застали тот момент (2002 год), когда сотовые телефоны Siemens «убивались» простым текстовым сообщением, содержащим символы вроде "%English" (либо другое слово из языкового меню телефона вместе с кавычками и символом %).
Когда интерпретатор телефона получал SMS-сообщение и приступал к разбору его текста, он сталкивался с записью, идентичной какой-либо сервисной команде. Текст %English интерпретировался телефоном как команда смены языка меню. Телефон пытался выполнить эту команду, но не мог, так как процессор был занят непосредственным чтением текста сообщения.
Многие модели Nokia, Siemens, Motorola, LG были подвержены атакам через SMS со специальными текстами. Используя определенные комбинации Unicode-символов, можно было удаленно отключить или «подвесить» телефон.
Модели Nokia 6210, 3310, 3330 можно было удаленно отключить, послав SMS-сообщения с одним из следующих текстов:
0x04 0x05 0x15 0х8А
%RPT
%I:::::.M:::::.G
Модели Motorola с350 и с100 зависали от такого текста:
0x04 0x05 0x15 0х8А
Кроме того, активно эксплуатировалась возможность передавать графику через SMS. В коде изображения прописывались специальные символы, которые телефон не мог «прочитать», что приводило к краху системы:
%IMG………………
………………………
…………………….
Символы %IMG означали, что вслед за ними на экране будет выведено изображение. Если вместо символов, которые интерпретатор позже сможет преобразовать в изображение, указать произвольную последовательность байтов, обычно не используемую для кодирования изображений, то в большинстве случаев это приведет к зависанию телефона.
Самые масштабные уязвимости
(с)
Все устройства под управлением пятой версии Android были подвержены уязвимости, при которой происходили отказ системы и разблокирование без ввода пароля на экране блокировки. Для этого достаточно было перегрузить поле ввода пароля большим количеством символов.
Другая атака затронула 95 % устройств на Android — около 950 миллионов гаджетов в 2015 году. Ошибка, получившая название ”Stagefright” в честь медиа-библиотеки, оказалась одной из самых больших дыр в системе безопасности Android версий 2.2 и выше.
Чтобы украсть данные или перехватить управление над микрофоном и камерой, требовалось лишь отправить мультимедийное сообщение в виде MMS с вредоносным ПО. При этом пользователь мог не знать, что его устройство скомпрометировано — вредоносное MMS можно было удалить дистанционно. Уязвимость крылась в коде C++ библиотеки Stagefright, обрабатывавшей несколько популярных медиаформатов с ошибочным обращением к памяти.
Две стороны одной уязвимости
Обычно речь идет об узконаправленных атаках, которые затрагивают лишь одну версию приложения или только одну платформу. Но бывают исключения. Так, специально для браузера Safari на устройствах Apple был создан сайт crashsafari.com, URL-адрес которого с помощью сгенерированной очень длинной строки символов в поле адреса перезагружал браузер, а с ним и всё устройство. Однако устройства Android, на которых использовался браузер Chrome, также начинали работать нестабильно и сильно нагревались.
Была еще одна ошибка, сработавшая одновременно для iOS и Android. Текстовое сообщение из четырех символов, расставленных в определенной последовательности, приводило к проблемам на iOS 10. Это белый флаг в эмодзи, невидимый символ VS16 (вариативный сектор 16), ноль и еще один символ эмодзи — радуга. iPhone зависал, как только получал текст, даже если пользователь не открывал или не читал сообщение.
Команда VS16 автоматически объединяет несколько смайликов в один специфический, который невозможно найти в стандартном наборе эмодзи. После получения гаджетом подобного сообщения iMessage пытается совместить два смайлика в один, но VS16 включает в связку еще и цифру ноль, отчего устройство не справляется с обработкой команды и зависает.
Оказалось, что некоторые телефоны Android также подвержены этой ошибке. Однако её удалось использовать только в WhatsApp: устройство зависнет, если в WhatsApp открыть вредоносное сообщение.
Складывается впечатление, что символьная уязвимость остается самой распространенной и долгоживущей ошибкой всех мобильных телефонов. Но есть верный способ защиты — не пропускать обновления безопасности и самостоятельно следить за актуальностью установленной версии ОС.