Статья была впервые опубликована в журнале «Хакер»
Как известно, операционные системы разрабатываются людьми. Кое-кто, впрочем, уверен, что Android создали рептилоиды, однако это не так: в мобильной платформе Google на сегодняшний день обнаружено множество ошибок, допустить которые могли только представители вида homo sapiens. Некоторые из этих багов представляют собой полноценные уязвимости и могут использоваться как для несанкционированного доступа к файловой системе смартфона, так и для распространения вредоносного ПО.
Если верить официальной статистике Google, на сегодняшний день среди версий Android наиболее распространена Nougat — редакция мобильной платформы за номером 7.0 и 7.1 установлена в совокупности на 28,2% устройств. Вторую позицию уверенно занимает Android 8.0 и 8.1 Oreo с показателем 21,5%. На третьем месте закрепилась шестая версия Marshmallow — она работает на 21,3% девайсов. Android 5.0 и 5.1 Lollipop установлены суммарно на 17,9% устройств, а замыкает группу лидеров Android 4.4 KitKat с показателем 7,6% пользователей.
Согласно информации с сайта cvedetails.com, на сегодняшний день в Android насчитывается 2146 уязвимостей, при этом число выявленных багов начало экспоненциально расти примерно с 2014 года.
Не так просто оценить, сколько из перечисленных устройств вовремя получили патчи безопасности, которые закрывают уязвимости, но это явно далеко не все из них. Мало того: не все уязвимости вообще оказываются закрытыми, тем более в старых версиях, официальная поддержка которых прекращена. Проблему усугубляют производители устройств, которые зачастую не торопятся выпускать обновления.
Самая первая уязвимость Android
Самая первая уязвимость Android была обнаружена еще в октябре 2008 года в прошивке коммуникатора HTC T-Mobile G1. При просмотре веб-страниц с определенным содержимым ошибка в ПО позволяла выполнить вредоносный код, отслеживающий использование клавиатуры гаджета. Теоретически таким образом можно было реализовать кейлоггер, фиксирующий нажатия кнопок, и собирать вводимую пользователем при веб-серфинге информацию. Эта уязвимость представляла опасность только для одной-единственной модели коммуникатора, но само ее наличие наглядно показало: Android — не настолько безопасная и защищенная система, как считалось ранее.
С ростом популярности операционной системы энтузиасты и исследователи отыскивали все новые и новые баги в различных ее версиях. Безусловно, в рамках одной статьи мы не сможем охватить все две тысячи с лишним уязвимостей, обнаруженных за все время существования Android. Поэтому сосредоточимся только на самых интересных и опасных из них, причем — только в актуальных на данный момент версиях Android (тех, что сейчас еще могут встретиться в жизни).
Самым «дырявым» оказалось четвертое поколение Android, начиная с версии 4.4 KitKat. С него, пожалуй, и начнем наш обзор уязвимостей, выявленных в разное время в этой платформе.
BlueBorne
- CVE: CVE-2017-1000251, CVE-2017-1000250, CVE-2017-0781, CVE-2017-0782, CVE-2017-0785 и CVE-2017-0783
- Уязвимые версии Android: 4.4.4, 5.0.2, 5.1.1, 6.0, 6.0.1, 7.0, 7.1.1, 7.1.2, 8.0
- Для эксплуатации требуется: атакующий должен находиться на расстоянии не более десяти метров от уязвимого устройства, а на уязвимом устройстве должен быть включен Bluetooth
- Возможный результат: выполнение произвольного кода с привилегиями ядра системы, утечка данных
Это не отдельная уязвимость, а целый набор ошибок в стеке Bluetooth современных операционных систем, среди которых числится и Android. Серьезные баги содержатся в коде системной функции l2cap_parse_conf_rsp
ядра Linux, причем их можно обнаружить во всех версиях ядра, начиная с 3.3. Если в системе включена защита от переполнения стека CONFIG_CC_STACKPROTECTOR
, их использование приводит к возникновению критической ошибки в работе ядра.
Уязвимость CVE-2017-1000251 выявлена в модуле ядра под названием L2CAP, который отвечает за работу стека протокола Bluetooth. Еще одна уязвимость в стеке этого протокола получила обозначение CVE-2017-0783. Если на атакуемом девайсе включена подсистема Bluetooth, с их помощью можно удаленно передать на него специальным образом сформированные пакеты информации. Такие пакеты могут содержать вредоносный код, который выполнится в Android с привилегиями ядра системы. При этом для реализации атаки не потребуется предварительно сопрягать устройства или включать на них режим обнаружения. Достаточно, чтобы атакующий находился на расстоянии не более десяти метров от уязвимого устройства.
Поскольку взаимодействующие с протоколом Bluetooth компоненты ОС по умолчанию имеют высокие системные привилегии, эксплуатация этих уязвимостей теоретически позволяет получить полный контроль над атакуемым смартфоном и планшетом, включая доступ к хранящимся на устройстве данным, подключенным сетям и файловой системе. Также с помощью BlueBorne технически можно реализовывать атаки типа man-in-the-middle.
К BlueBorne также относят уязвимость CVE-2017-1000250 в стеке BlueZ Linux-реализации протокола Service Discovery Protocol (SDP). Эксплуатация уязвимости CVE-2017-1000250 может привести к утечке данных. Уязвимости CVE-2017-0781, CVE-2017-0782 и CVE-2017-0785 относятся к самой ОС Android, при этом с помощью первых двух вредоносное приложение может получить в системе привилегии ядра, а последняя позволяет реализовать утечку данных.
Для устранения уязвимостей BlueBorne 9 сентября 2017 года компания Google выпустила обновление безопасности. Также они не страшны устройствам, на которых используется режим Bluetooth Low Energy.
Extra Field
- CVE: нет
- Уязвимые версии Android: 2.3, 4.0, 4.1, 4.2, 4.3, 4.4
- Для эксплуатации требуется: модифицированное приложение
- Возможный результат: выполнение произвольного кода
Все приложения для Android распространяются в формате .APK и представляют собой ZIP-архив с тем отличием, что они имеют специальную цифровую подпись. Внутри находятся необходимые для работы компоненты, которые в процессе установки приложения извлекаются, а их контрольные суммы проверяются по эталонным значениям. С помощью уязвимости Extra Field злоумышленник может изменить содержимое установочного пакета APK, не повредив его цифровую подпись.
Внутри архива .APK располагается файл classes.dex, в котором содержится скомпилированный код приложения и набор служебных полей. Среди них есть:
- поле, хранящее имя файла с расширением;
- размер файла;
- поле Extra Field, в котором записан сам исполняемый код;
- таблица со списком используемых им классов.
Если в поле заголовка записать исходное значение без первых трех байт, значение длины поля Extra Field также изменится, благодаря чему появляется возможность дописать туда произвольный код, например перечислить классы, используемые троянской частью приложения. После этого можно добавить в архив, помимо оригинального classes.dex, его вредоносную копию, часть кода которой будет храниться в «расширенном» поле Extra Field оригинального classes.dex. При установке программы система прочитает содержимое видоизмененных полей, и, поскольку в них перечислены классы из модифицированного classes.dex, на устройство будет установлен именно этот файл.
Таким образом, уязвимость позволяет «подсадить» троянца в любое легитимное приложение с валидной цифровой подписью, разве что размер вредоносного модуля будет ограничен максимальным размером файла classes.dex в 65 533 байт. Уязвимость была обнаружена в начале июля 2013 года и была устранена в версиях Android, выпущенных позже этой даты.
Fake ID
- CVE: нет
- Уязвимые версии Android: 2.2, 2.3, 4.0, 4.1, 4.2, 4.3, 4.4
- Для эксплуатации требуется: приложение, подписанное специальным образом сформированной цифровой подписью
- Возможный результат: установка и запуск вредоносного приложения, утечка данных
Эту уязвимость обнаружили в Android 2.2, и она была актуальна вплоть до версии 4.4. Ошибка, соответствующая этой уязвимости, получила внутренний номер 13678484 и в основном устранялась патчами, которые выпускали сами производители устройств.
Как уже упоминалось, все .APK-файлы в Android используют цифровую подпись. Подпись приложения может быть взаимосвязана с цифровой подписью издателя программы. Все эти подписи используют инфраструктуру открытых ключей PKI (Public Key Infrastructure). С помощью цифровой подписи операционная система определяет, какие возможности и привилегии могут быть у приложения, с какими компонентами ОС оно может взаимодействовать, какие системные функции использовать, имеет ли оно право скачивать и устанавливать обновления и так далее.
Применяемые при проверке подписи приложения цифровые сертификаты (электронные документы, в которых хранится цифровой ключ) издаются специальными удостоверяющими центрами. Если система доверяет удостоверяющему центру, она автоматически доверяет и всем изданным им сертификатам, которые использует приложение.
При проверке (валидации) цифровой подписи приложения операционная система использует открытый ключ разработчика программы. Чтобы убедиться в действительности этого ключа, требуется выполнить проверку соответствующего сертификата удостоверяющего центра. Это называется проверкой цепочки сертификатов. Уязвимость заключается в том, что в процессе установки приложения ранние версии Android не выполняли такую проверку вовсе.
В качестве практической реализации уязвимости можно привести такой пример. Если приложение подписано двумя цифровыми сертификатами: подлинным и поддельным, то при его установке будет создана цифровая подпись, использующая оба сертификата. В результате приложение сможет, например, скачивать и устанавливать вредоносные обновления, которые не будут проверяться на безопасность, если разработчик подпишет их с помощью того же недостоверного сертификата.
Janus
- CVE: CVE-2017-13156
- Уязвимые версии Android: 5.1.1, 6.0, 6.0.1, 7.0, 7.1.1, 7.1.2
- Для эксплуатации требуется: модифицированное приложение
- Возможный результат: установка и запуск вредоносного приложения, утечка данных
Еще одна уязвимость за номером CVE-2017-13156, оперирующая с цифровыми подписями приложений Android, только актуальна она для более свежих версий операционной системы — 5.1.1, 6.0, 6.0.1, 7.0, 7.1.1 и 7.1.2. С использованием Janus можно внедрить в .APK-архив исполняемый dex-файл, сохранив при этом оригинальную цифровую подпись приложения. Дыра кроется в системе проверки цифровой подписи на основе JAR, на смену которой в Android 7.0 пришла технология Signature Scheme v2. Тем не менее даже в седьмом и отчасти восьмом поколении Android уязвимость могут использовать старые приложения, не применяющие новый метод верификации, а также некоторые программы, загруженные не из официального каталога Google Play.
ObjectInputStream Serialization
- CVE: CVE-2014-7911
- Уязвимые версии Android: 1.0–4.4.4
- Для эксплуатации требуется: специальное приложение или модуль приложения
- Возможный результат: аварийное завершение критически важных системных процессов
Эта уязвимость, которой подвержены все версии Android до 5.0, получила обозначение CVE-2014-7911. Ошибка кроется в механизме проверки сериализации получаемых объектов системным компонентом luni/src/main/java/java/io/ObjectInputStream
.
Сериализация — это способность некоторых объектов трансформироваться в последовательность байтов, из которой они потом могут быть восстановлены в первоначальном виде (обратная процедура называется десериализацией). Процедура сериализации обычно применяется для сохранения данных или передачи их другому процессу либо трансляции по сети.
С использованием уязвимости можно выполнить десериализацию любого объекта с открытым конструктором без параметров, даже если он не отвечает критериям для сериализации. Если этот объект использует метод finalize
, то в случае его удаления сборщик мусора вызовет этот метод, в результате чего исполняется хранящийся в объекте код. Таким образом можно атаковать системные процессы Android, вызывая их аварийное завершение, в том числе убивать критически важные системные процессы.
OpenSSLX509Certificate
- CVE: CVE-2015-3837
- Уязвимые версии Android: 4.3–5.1
- Для эксплуатации требуется: специальное приложение или модуль приложения
- Возможный результат: выполнение произвольного кода с системными привилегиями
Уязвимости OpenSSLX509Certificate, она же CVE-2015-3837, подвержены версии Android с 4.3 по 5.1 включительно. С помощью этого бага можно повысить привилегии вредоносного процесса.
Ошибка в системном компоненте OpenSSLX509Certificate
позволяет скомпрометировать системный процесс system_server
и выполнить любой код с привилегиями system (UID 1000). Таким образом можно, например, подменить любое установленное ранее приложение (кроме компонентов ОС), сохранив вместо него другую программу.
PendingIntent
- CVE: CVE-2014-8609
- Уязвимые версии Android: 4.0–4.4.4
- Для эксплуатации требуется: специальное приложение или модуль приложения
- Возможный результат: выполнение в системе любой команды
Эта уязвимость с номером CVE-2014-8609 выявлена в Android 4.0–4.4.4. Ошибка содержится в методе addAccount
файла AddAccountSettings.java
(расположенного в src/com/android/settings/accounts/
), который является частью подсистемы управления учетными записями приложений.
Некоторые приложения Android могут использовать учетные данные юзера для автоматической авторизации в различных интернет-сервисах. В этом случае пользователю достаточно указать свои логин и пароль один раз, после чего они регистрируются в специальном разделе системных настроек «Аккаунты», к которому приложение обращается всякий раз, когда ему необходимо пройти аутентификацию.
При создании такой учетной записи ОС передает приложению различные параметры, среди которых имеется параметр PendingIntent
. Из-за ошибки в реализации вызываемого при регистрации аккаунта метода addAccount
система не проверяет значения этого поля, поэтому злоумышленник может передать в PendingIntent
фактически любую команду, которая будет выполнена с теми же привилегиями, что и направившее его приложение «Настройки», — системными.
Можно сформировать команду на удаление хранящихся на устройстве файлов или последовательность байтов, которая будет воспринята системой как входящее SMS-сообщение. Например, если в параметре PendingIntent
будет передана команда android.intent.action.MASTER_CLEAR
, Android послушно выполнит полный системный сброс с уничтожением всей хранящейся на устройстве информации.
StageFright
- CVE: CVE-2015-1538
- Уязвимые версии Android: 2.2–5.1.1
- Для эксплуатации требуется: передать на устройство специальным образом скомпонованный MP4-файл
- Возможный результат: выполнение произвольного кода с системными привилегиями
Эта уязвимость актуальна для всех версий Android с 2.2 до 5.1.1. Ошибка обнаружилась в системной библиотеке Stagefright, которая обеспечивает воспроизведение медиафайлов в формате MP4.
Если на уязвимое устройство удается доставить специальным образом скомпонованный MP4-файл (например, в MMS-сообщении), то из-за ошибки в обработчике SampleTable.cpp встроенный в этот файл произвольный код будет выполнен с системными привилегиями, даже если пользователь просто откроет папку, в которой такой файл хранится.
StageFright 2.0
- CVE: CVE-2015-6602
- Уязвимые версии Android: 4.1–5.1.1
- Для эксплуатации требуется: передать на устройство специальным образом скомпонованный MP3- или MP4-файл
- Возможный результат: выполнение произвольного кода с системными привилегиями
Несмотря на схожесть названия, эта уязвимость прячется в другом компоненте — в приложении mediaserver, точнее в обработчике тегов ID3v2. Уязвимы версии Android с 4.1 по 5.1.1.
Для использования уязвимости достаточно любым способом доставить на атакуемое устройство специальным образом модифицированный MP3- или MP4-файл. Во время чтения содержащихся в таком файле тегов ID3v2 происходит переполнение буфера, в результате чего выполняется встроенный в файл произвольный код с системными привилегиями.
SIM Toolkit
- CVE: CVE-2015-3843
- Уязвимые версии Android: 5.1
- Для эксплуатации требуется: специальное приложение или модуль приложения
- Возможный результат: перехват и подмена команд, отправляемых SIM-картой операционной системе
В Android есть встроенный фреймворк SIM Application Toolkit (STK), который позволяет SIM-карте выполнять в системе определенный набор команд. Таким образом, в частности, формируется SIM-меню оператора связи.
Уязвимость позволяет перехватывать команды, отправляемые SIM-картой операционной системе, а также подменять их. Вредоносное приложение может передать классу com.android.stk.StkCmdReceiver
специально созданный объект parcelable. Получатель не проверяет подлинность отправителя, при этом действие android.intent.action.stk.command
не объявлено в манифесте как защищенное, благодаря чему можно эмулировать отсылку команд SIM-картой.
Например, если SIM-карта формирует на экране устройства сообщение с подтверждением действий пользователя, оно будет содержать кнопку ОK. Такие сообщения используются для подтверждения отправки USSD-запросов, транзакций, действий с хранящимися на карте контактами и так далее.
Вредоносное приложение может вызвать действие android.intent.action.stk.command
и отобразит на экране поверх настоящего поддельное окно, содержащее произвольный текст. При нажатии кнопки ОK вызывается метод sendResponse()
с флагом true
, и это событие — нажатие кнопки — передается SIM-карте, ожидающей реакции пользователя. При этом событие будет обработано так, как если бы оно поступило от настоящего диалогового окна.
ToastOverlay
- CVE: CVE-2017-0752
- Уязвимые версии Android: 4.0–7.1.2
- Для эксплуатации требуется: приложение с разрешением BIND_ACCESSIBILITY_SERVICE
- Возможный результат: получение полного контроля над окном типа TYPE_TOAST
Эта уязвимость была обнаружена в 2017 году и затрагивает все версии Android с 4.0 по 7.1.2 включительно. Ошибку разработчики допустили в подсистеме оверлеев — окон, способных отображаться поверх других экранных форм.
Использующему уязвимость приложению достаточно объявить в манифесте только одно разрешение — BIND_ACCESSIBILITY_SERVICE
. В обычных условиях для отображения окон типа TYPE_TOAST
, предназначенных для показа системных уведомлений, приложению требуется отправить запрос SYSTEM_ALERT_WINDOW
, однако благодаря ошибке в обработчике проверки разрешений Android AOSP вредоносная программа может обойтись без подобных формальностей. Компонент просто не выполняет проверку доступа (permission check) и операции (operation check) при обработке запроса SYSTEM_ALERT_WINDOW
для TYPE_TOAST
.
В результате использующее уязвимость приложение может безнаказанно рисовать свои окна поверх окон других программ и фиксировать нажатия на экран. Фактически оно получает полный контроль над окном TYPE_TOAST
. Какое содержимое будет отображаться в этом окне, зависит только от фантазии вирусописателей.
Cloak and Dagger
- CVE: CVE-2017-0752
- Уязвимые версии Android: 4.4.4, 5.0.2, 5.1.1, 6.0, 6.0.1, 7.0, 7.1.1, 7.1.2
- Для эксплуатации требуется: приложение с разрешениями SYSTEM_ALERT_WINDOW и BIND_ACCESSIBILITY_SERVICE
- Возможный результат: запись нажатий клавиш (кейлоггинг), утечка данных
Эта уязвимость актуальна для Android вплоть до 7.1.2. Из-за ошибки в SDK вредоносное приложение, используя разрешения SYSTEM_ALERT_WINDOW
и BIND_ACCESSIBILITY_SERVICE
, может получить практически полный контроль над операционной системой и доступ к конфиденциальной информации пользователя, а также фиксировать нажатия клавиш. «Хакер» уже подробно писал об этой уязвимости, а обнаружившие ее эксперты даже создали про нее специальный сайт.
Вкратце суть сводится к тому, что разрешение SYSTEM_ALERT_WINDOW
позволяет вывести на экран «системное окно» — View-элемент, который отобразится поверх любого другого элемента интерфейса, даже если это будет Activity из стороннего приложения. При этом перекрытые Activity об этом не узнают и продолжат работать так, как будто ничего и не произошло. Это может сделать любое приложение, если разрешение SYSTEM_ALERT_WINDOW
заявлено в его манифесте.
Разместив несколько «невидимых» системных окон друг над другом и обрабатывая нажатия на них, злоумышленник может создать кейлоггер. А с помощью разрешения BIND_ACCESSIBILITY_SERVICE
вредоносная программа способна получить доступ к другим объектам ОС и хранящимся на устройстве данным.
Выводы
Как видишь, за всю историю Android было много интересного, и мы в этой статье затронули лишь верхушку айсберга — наиболее важные, нашумевшие и зрелищные уязвимости. Достаточно начать копать, и тебе откроются и другие маленькие и большие возможности.