Серьезная уязвимость (CVE-2017-13156) в Android позволяет злоумышленникам изменять код в приложениях, не затрагивая их подписи. Корень проблемы состоит в том, что файл может быть действительным файлом APK и действительным файлом DEX одновременно. Назвали его уязвимостью Януса в честь римского бога двойственности.
Уязвимость Януса
Уязвимость Janus связана с возможностью добавления дополнительных байтов в файлы APK и DEX-файлы. С одной стороны, файл APK представляет собой zip-архив, который может содержать произвольные байты в начале, перед его zip-записями (в общем случае, между его записями zip). Схема подписи JAR учитывает только записи zip. Он игнорирует любые дополнительные байты при вычислении или проверке подписи приложения. С другой стороны, файл DEX может содержать произвольные байты в конце, после регулярных разделов строк, классов, определений методов и т.д. Таким образом, файл может быть действительным файлом APK и действительным файлом DEX одновременно.
Другим ключевым элементом является, казалось бы, безобидная особенность виртуальной машины 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 против обратного проектирования и клонирования.
Автор: Waldesbv