image

Серьезная уязвимость (CVE-2017-13156) в Android позволяет злоумышленникам изменять код в приложениях, не затрагивая их подписи. Корень проблемы состоит в том, что файл может быть действительным файлом APK и действительным файлом DEX одновременно. Назвали его уязвимостью Януса в честь римского бога двойственности.

Уязвимость Януса


Уязвимость Janus связана с возможностью добавления дополнительных байтов в файлы APK и DEX-файлы. С одной стороны, файл APK представляет собой zip-архив, который может содержать произвольные байты в начале, перед его zip-записями (в общем случае, между его записями zip). Схема подписи JAR учитывает только записи zip. Он игнорирует любые дополнительные байты при вычислении или проверке подписи приложения. С другой стороны, файл DEX может содержать произвольные байты в конце, после регулярных разделов строк, классов, определений методов и т.д. Таким образом, файл может быть действительным файлом APK и действительным файлом DEX одновременно.

image

Другим ключевым элементом является, казалось бы, безобидная особенность виртуальной машины Dalvik / ART. Теоретически, среда выполнения Android загружает файл APK, извлекает его DEX-файл и затем запускает его код. На практике виртуальная машина может загружать и выполнять как файлы APK, так и файлы DEX. Когда он получает файл APK, он все еще смотрит на магические байты в заголовке, чтобы решить, какой тип файла он есть. Если он находит заголовок DEX, он загружает файл как файл DEX. В противном случае он загружает файл как файл APK, содержащий запись zip с файлом DEX. Таким образом, он может неправильно интерпретировать файлы DEX / APK.

Злоумышленник может использовать эту двойственность. Он может добавить вредоносный файл DEX в файл APK, не затрагивая его подпись. Затем среда выполнения Android принимает файл APK как допустимое обновление законной более ранней версии приложения. Тем не менее, Dalvik VM загружает код из вложенного файла DEX.

Угроза


Несмотря на то, что приложения для Android самозаверяются, проверка подписи важна при обновлении приложений Android. Когда пользователь загружает обновление приложения, среда выполнения Android сравнивает свою подпись с подписью исходной версии. Если совпадают подписи, среда выполнения Android продолжает установку обновления. Обновленное приложение наследует разрешения исходного приложения. Поэтому злоумышленники могут использовать уязвимость Janus, чтобы ввести в заблуждение процесс обновления и получить непроверенный код с мощными разрешениями, установленными на устройствах ничего не подозревающих пользователей.

Можно представить несколько серьезных сценариев. Злоумышленник может заменить доверенное приложение с высокими привилегиями (например, системным приложением) измененным обновлением, чтобы злоупотреблять его разрешениями. В зависимости от целевого приложения это может позволить хакеру получить доступ к конфиденциальной информации, хранящейся на устройстве, или даже полностью захватить устройство. В качестве альтернативы злоумышленник может передать модифицированный клон чувствительного приложения в качестве законного обновления, например, в контексте банковского дела или связи. Клонированное приложение может выглядеть и вести себя как оригинальное приложение, но вводить вредоносное поведение.

Формат zip-файла является архаичным и подвержен таким проблемам, как уязвимость главного ключа и уязвимость Янус. Неоднозначные почтовые файлы, вероятно, приводят к подобным уязвимостям в разных контекстах и ??в разных системах. Основной причиной является избыточность в формате. При разработке форматов данных, протоколов, структур данных и кода в целом всегда следует стремиться избегать избыточности. Любые расхождения приводят к ошибкам или к худшему.

Сфера охвата и смягчение последствий


Любой сценарий по-прежнему требует от пользователя установки вредоносного обновления из источника, находящегося за пределами магазина Google Play. Возможно, относительно легко обмануть некоторых пользователей, потому что приложение все равно может выглядеть точно так же, как и оригинальное приложение, и имеет соответствующую подпись. Для экспертов общие инструменты обратного проектирования не показывают введенный код. Пользователи всегда должны проявлять бдительность при загрузке приложений и обновлений.

Уязвимость Janus влияет на последние Android-устройства (Android 5.0 и новее). Приложения, подписанные с использованием схемы подписки APK v2 и работающие на устройствах, поддерживающих самую последнюю схему подписки (Android 7.0 и новее), защищены от этой уязвимости. В отличие от схемы v1, эта схема v2 рассматривает все байты в файле APK. Старые версии приложений и более новые приложения, работающие на старых устройствах, остаются восприимчивыми. Разработчики должны, по крайней мере, всегда применять схему подписи v2.

Приложения Android, использующие механизм обнаружения несанкционированного доступа DexGuard, лучше защищены от клонирующих атак. Механизм выполняет дополнительные проверки, чтобы убедиться, что защищенные приложения не были изменены каким-либо образом. Мы рекомендуем использовать обнаружение несанкционированного доступа и другие уровни защиты DexGuard против обратного проектирования и клонирования.

Комментарии (8)


  1. sheknitrtch
    11.12.2017 01:53

    Мне нравится современная тенденция давать имена уязвимостям: HeartBleed, ShellShock, Bashdoor. В названии этой уязвимости андроида появляется двусмысленность, если убрать первую букву.


  1. Revertis
    11.12.2017 02:38
    +1

    Самое замечательное в таких уязвимостях то, что миллиард устройств никогда не получит обновления, закрывающего уязвимости :-/


    1. khim
      11.12.2017 19:40
      -1

      Тоже мне, удивили. А миллиард домашних роутеров, которые никогда никто обновлять не будет?

      Интересно скорее какого размера потребуется «жареный петух» и кого он должен будет клюнуть, чтобы об этом вообще задумались бы?

      P.S. Хотя может и не будет никакого «петуха»: как-то же эпоху до ssh/ssl с передачей паролей открытым текстом пережили — и катастрофы таки не случилось…


  1. DrZlodberg
    11.12.2017 09:05

    Уязвимость Janus влияет на последние Android-устройства (Android 5.0 и новее).
    Не понятно, влияет ли она на «предпоследние» устройства (4+) которых ещё хватает.


    1. Waldesbv Автор
      11.12.2017 09:21

      Уязвимость затрагивает приложения, использующие схему подписи APK Signature Scheme v1 (Android 5.0 и выше). Так что за свои старые девайсы не стоит переживать.


      1. khim
        11.12.2017 19:42

        За них не стоит переживать по другой причине: количество известных дыр в старых ядрах Linux'а таково, что никакой Janus им не нужен… хотя конкретно вот этой уязвимости — у них нет.


  1. receiver
    11.12.2017 17:17

    Подавляющее большинство приложений не использует вторую схему, что печально. Раз статья пиарная, будет справедливым сказать: «пользуйтесь DexProtector!»


    1. Revertis
      11.12.2017 19:58

      Интересно почему они не используют вторую схему. Ведь для этого нужно просто собирать проект системой сборки по умолчанию — Gradle. Он сам подписывает двумя вариантами, без проблем.