Символьная уязвимость: как простое сообщение приводит к ошибкам в телефоне

    image
    Кадр из фильма “Матрица” (1999)

    На фоне возможностей современных смартфонов легко забыть, что мобильная связь — это очень старая технология. Одна только концепция передачи коротких текстовых сообщений была разработана более 30 лет назад. Если бы люди занялись созданием SMS в 2018 году, то, вероятно, не стали бы ограничивать одно сообщение 160 символами (в 7-битной кодировке).

    Связь наследует не только ограничения, заложенные при создании. Многие ошибки, скрытые и явные, ждут своего часа годами, начиная с далекого мобильного прошлого. Со временем к ним добавляются новые аппаратные или программные недочёты. Современный смартфон — это своего рода «кремниевое творение Франкенштейна», компоненты которого создаются сторонними компаниями, чей код не полностью контролируют Apple и Google.

    В таких условиях не удивляет, что один из самых главных недостатков современной связи (а также мобильных приложений и железа) — это наличие простых уязвимостей, приводящих к выводу из строя различных устройств. Достаточно нескольких символов, чтобы буквально погасить экран самого современного гаджета стоимостью более $1000. Год за годом уязвимость эксплуатируется вновь и вновь. И сегодня мы подробнее рассмотрим, как это происходит.

    SMS of death


    image
    (с)

    Хакеры, исследователи и просто любопытные разработчики всё чаще переключаются с простой социнженерии на поиск более редких атак, которые не требуют сложного взаимодействия с пользователями. Многие уже с настороженностью относятся к ссылкам, полученным от неизвестных контактов. Но большинство по-прежнему доверяют простым текстовым сообщениям, полученным в виде 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, рабочий стол телефона.

    Наследие прошлого


    image
    (с)

    Уязвимость существует ровно столько же, сколько существуют текстовые сообщения в мобильной сети. Некоторая особенность работы с символами сразу закладывалась как «фича», чтобы получить доступ к расширенным данным о сети или телефоне с помощью специальных кодов. Например, сейчас на 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 означали, что вслед за ними на экране будет выведено изображение. Если вместо символов, которые интерпретатор позже сможет преобразовать в изображение, указать произвольную последовательность байтов, обычно не используемую для кодирования изображений, то в большинстве случаев это приведет к зависанию телефона.

    Самые масштабные уязвимости


    image
    (с)

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

    Другая атака затронула 95 % устройств на Android — около 950 миллионов гаджетов в 2015 году. Ошибка, получившая название ”Stagefright” в честь медиа-библиотеки, оказалась одной из самых больших дыр в системе безопасности Android версий 2.2 и выше.

    Чтобы украсть данные или перехватить управление над микрофоном и камерой, требовалось лишь отправить мультимедийное сообщение в виде MMS с вредоносным ПО. При этом пользователь мог не знать, что его устройство скомпрометировано — вредоносное MMS можно было удалить дистанционно. Уязвимость крылась в коде C++ библиотеки Stagefright, обрабатывавшей несколько популярных медиаформатов с ошибочным обращением к памяти.

    Две стороны одной уязвимости


    image

    Обычно речь идет об узконаправленных атаках, которые затрагивают лишь одну версию приложения или только одну платформу. Но бывают исключения. Так, специально для браузера Safari на устройствах Apple был создан сайт crashsafari.com, URL-адрес которого с помощью сгенерированной очень длинной строки символов в поле адреса перезагружал браузер, а с ним и всё устройство. Однако устройства Android, на которых использовался браузер Chrome, также начинали работать нестабильно и сильно нагревались.

    Была еще одна ошибка, сработавшая одновременно для iOS и Android. Текстовое сообщение из четырех символов, расставленных в определенной последовательности, приводило к проблемам на iOS 10. Это белый флаг в эмодзи, невидимый символ VS16 (вариативный сектор 16), ноль и еще один символ эмодзи — радуга. iPhone зависал, как только получал текст, даже если пользователь не открывал или не читал сообщение.

    Команда VS16 автоматически объединяет несколько смайликов в один специфический, который невозможно найти в стандартном наборе эмодзи. После получения гаджетом подобного сообщения iMessage пытается совместить два смайлика в один, но VS16 включает в связку еще и цифру ноль, отчего устройство не справляется с обработкой команды и зависает.

    Оказалось, что некоторые телефоны Android также подвержены этой ошибке. Однако её удалось использовать только в WhatsApp: устройство зависнет, если в WhatsApp открыть вредоносное сообщение.



    Складывается впечатление, что символьная уязвимость остается самой распространенной и долгоживущей ошибкой всех мобильных телефонов. Но есть верный способ защиты — не пропускать обновления безопасности и самостоятельно следить за актуальностью установленной версии ОС.
    Yota 187,78
    Компания
    Поделиться публикацией
    Похожие публикации
    Комментарии 11
    • +1
      На моем iPhone, приложение вылетело от этой статьи.
      • +1
        У вас запятая, лишняя.
      • +1
        Так, специально для браузера Safari на устройствах Apple был создан сайт crashsafari.com, URL-адрес которого с помощью сгенерированной очень длинной строки символов в поле адреса перезагружал браузер, а с ним и всё устройство. Однако устройства Android, на которых использовался браузер Chrome, также начинали работать нестабильно и сильно нагревались.

        Не рискуйте перейти по ссылке — в Firefox 59.0.2 на Windows 10 моментально загружает процессор, память, диск так что курсор мыши не сдвинуть. После ресета огнелис попытается вновь открыть эту вкладку.

        • +1
          Для тех кому интересно: там пустая страница с вот таким кодом
          source
          var total = "";
          for( var i = 0; i < 100000; i++ ) {
                total = total + i.toString();
                history.pushState(0,0, total );
          }
          


          Понятное дело что оно кладёт любой браузер, даже не мобильный. Хотя опера, например, попыталась предупредить мол не надо туда ходить
          • 0
            Почему в браузерах нет защиты от этого? Ну окей, попытался джаваскрипт там что-то намутить, ну исчерпал выданную ему память. Почему должен падать весь браузер целиком?
            • 0
              Обычно оно так и есть, падает только один таб, если JS выедает больше положенного. Но в данном же случае идёт атака на API самого браузера (history api), что затрагивает весь браузер, а не одну вкладку. Ну, по крайней мере мне так кажется.
          • 0
            Появляется окно о зависшем сценарии, жму остановить и закрываю вкладку. Firefox ESR 52.7.2.
          • +1
            Одна только концепция передачи коротких текстовых сообщений была разработана более 30 лет назад. Если бы люди занялись созданием SMS в 2018 году, то, вероятно, не стали бы ограничивать одно сообщение 160 символами (в 7-битной кодировке).

            SMS разрабатывалось в рамках уже сложившейся системы ОКС-7. К моменту создания SMS, уже десять лет как телефония плавно переходила на семёрку. Ограничение на 160 символов просто ложилось на уже созданную систему сигнализации, что в принципе позволяло (и действительно позволило в 90-е годы) гнать текстовые сообщения с сотового на сотовый через промежуточные АТС, которые знать не знают ни о какой мобильной связи. В некотором смысле, SMS обходятся операторам бесплатно, поскольку используют каналы, разработанные в других целях и поддерживаемые независимо от самих смсок.
            • 0

              Я помнится ломал огнелиса и хромь достаточно простой вещью: "играющим" тегом video и анимацией его же высоты и положения через transform: translate с помощью jquery animation...


              Всё это просиходило на вендре 7, которая сначала зависала, а потом просто улетала в синий экранчик. Причём всё это можно было повторить и на других компах, но точного кода этого "перегрузчика" у меня не сохранилось… Я тогда как раз с этим и боролся "наживую", то есть без git)

              • +1
                По моему, код прорисовки символов должен быть устроен достаточно просто. То есть его возможно верефицировать формальными средствами. Судя по количеству уязвимостей, заняться этим было бы полезно.
                • 0
                  На смартфонах под старым Андроид и с процессором MediaTek была уязвимость: при получении SMS с одним символом "=" телефон перезагружался. На работе показал, потом мне несколько раз его перезагружали :)

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое