StrandHogg 2.0 — новая опасная уязвимость Android. Вот как это может повлиять на пользователей и как разработчики могут защитить от него свои приложения.
Сейчас 22:00. Знаете ли вы, где находятся ваши занятия? Появилась новая уязвимость, которой можно воспользоваться на миллионах устройств Android, и она тоже довольно неприятная. Короче говоря, этот недостаток дизайна позволяет злоумышленнику представить свою собственную активность (страницу) поверх активности другого приложения, потенциально заставляя пользователя выдать свои личные данные. Уязвимость получила название StrandHogg 2.0 и недавно была раскрыта Промон, норвежская охранная фирма.
Уязвимость StrandHogg 2.0 теоретически затрагивает все устройства Android, работающие под управлением версий Android от Honeycomb (3.0) до Android 9 Pie (9.0). На основе последняя статистика распространения версий Android, что означает, что около 91,8% всех Android-устройств уязвимы для StrandHogg 2.0.. Уязвимость была присвоена CVE-2020-0096 и получил
уровень серьезности «критический». Для работы он не требует каких-либо специальных разрешений и может функционировать практически полностью без взаимодействия с пользователем. Все, что пользователю нужно сделать, — это открыть приложение со спрятанным в нем вредоносным кодом, и тогда он станет уязвим для атаки.Компания Promon любезно предоставила нам свое приложение для проверки концепции и его исходный код, чтобы мы могли наилучшим образом объясните, как работает эксплойт, почему он важен для пользователей и как разработчики могут защитить свои приложения. против этого.
Как это работает
Предположим, вы используете Gmail и нажимаете веб-ссылку. Если вы перейдете на экран последних приложений, вы можете заметить, что веб-страница находится «внутри» Gmail. В предварительном просмотре отображается веб-сайт, но значок и имя приложения по-прежнему взяты из Gmail. Это происходит, когда приложение/действие запускает другое приложение/действие в той же задаче. А теперь представьте, что вы не специально открыли эту ссылку. Для вас это выглядит как часть приложения Gmail. Именно такое поведение использует StrandHogg 2.0.
Здесь нам придется опустить некоторые детали, но вот примерно то, как работает этот эксплойт. Предположим, что злоумышленник хочет получить логин пользователя Gmail.
- Пользователь загружает вредоносное приложение (конечно, не зная, что оно вредоносное) и открывает его.
- В фоновом режиме приложение открывает Gmail, помещает поверх него похожее действие входа в систему, а затем запускает другое действие.
- Пользователь открывает Gmail и видит нечто похожее на экран входа в Gmail, но на самом деле это фишинговая деятельность злоумышленника.
Последнее действие, запущенное на шаге 2, может быть любым, что позволяет избежать подозрений. Приложение может имитировать сбой и вернуться на главный экран или просто открыть основное действие, как будто ничего не произошло. Единственное подозрительное, что может увидеть пользователь, — это множество анимаций открытия при запуске всех действий. Хуже всего: это даже не будет выглядеть так, будто Gmail был открыт.
Конечно, злоумышленник может сделать больше, чем просто показать поддельный экран входа в систему. Вместо этого вредоносное приложение может отображать запрос на получение разрешений, обманным путем заставляя пользователя предоставить нежелательные разрешения. Хотя запрос каких-либо специальных разрешений, таких как «Доступность», может вызвать у пользователя подозрения, с помощью чего-то вроде «Доступ к хранилищу» можно нанести большой ущерб.
Технические биты
Следующий раздел представляет собой общий обзор того, как работает StrandHogg 2.0. Promon не опубликует полную информацию в ближайшие несколько месяцев, поэтому мы не можем рассказать, как именно реализован этот эксплойт. Однако есть некоторые технические детали, о которых мы можем поговорить.
Короче говоря, StrandHogg 2.0 захватывает Android Context.startActivities()
Метод API, использующий три намерения.
- В нашем примере первое намерение запускает Gmail. Он помечен значком
Intent.FLAG_ACTIVITY_NEW_TASK
. - Второе намерение – злонамеренное. В нашем примере это похожее действие входа в систему. Это намерение не имеет флагов.
- Третье намерение – это отвлечение. Это гарантирует, что пользователь не заподозрит, что Gmail просто случайно открывается вместо приложения, которое он нажал (то есть того, которое запускает атаку). Он помечен значком
Intent.FLAG_ACTIVITY_NEW_TASK
.
Все эти намерения затем передаются в массиве в startActivities()
метод.
Ключевым моментом здесь является отсутствие флагов во втором намерении. Таким образом, мы, по сути, просто воспроизвели приведенный выше пример Gmail. Технически задача принадлежит Gmail, но самое верхнее действие принадлежит злоумышленнику. Когда пользователь затем щелкает значок главного экрана Gmail, вместо активности Gmail отображается активность злоумышленника.
Доказательство концепции
Благодаря информации, которую нам прислал Promon, мы смогли воспроизвести их концепцию. Вот запись экрана Samsung Galaxy Note8 под управлением Android 9 Pie, показывающая его в действии.
Методы и проблемы смягчения последствий
Теперь простое повторение вышеизложенного в коде на самом деле не сработает. Это не полный пример, и есть еще кое-что, что злоумышленнику нужно сделать, чтобы он заработал, о чем мы не можем рассказать. Но их не так уж сложно угадать самостоятельно, и это отчасти делает эту атаку такой опасной. StrandHogg 2.0 — относительно простой в реализации эксплойт, но его сложно устранить.
Смягчение последствий не может включать в себя просто занесение в черный список всех приложений, которые используют startActivities()
, поскольку у него есть множество законных применений. Также очень сложно автоматизировать алгоритм обнаружения. Злоумышленники могут использовать всевозможные уловки, чтобы сделать свою реализацию StrandHogg 2.0 практически невидимой для таких сервисов, как Google Play Protect. StrandHogg 1.0 требовал от злоумышленника добавить атрибут в AndroidManifest.xml вредоносного приложения, который было относительно легко обнаружить. С другой стороны, StrandHogg 2.0 полностью работает на Java/Kotlin.
Принимая во внимание обфускацию, отражение и даже просто разные стили кодирования, кажется непрактичным автоматически правильно обнаружить приложение, использующее этот эксплойт. Более того, если пользователь стал объектом атаки StrandHogg 2.0, он может даже не знать об этом. Если вы откроете Gmail и увидите экран входа в систему, вы можете просто подумать, что срок вашего сеанса истек, и, не задумываясь, ввести свои данные для входа.
Когда мы обратились в Google за ответом, представитель сделал следующее заявление:
«Мы ценим работу исследователей и выпустили исправление выявленной ими проблемы. Кроме того, Google Play Protect обнаруживает и блокирует вредоносные приложения, в том числе использующие эту технику».
Звучит хорошо, и, надеюсь, это окажет хоть какой-то эффект против атак StrandHogg 2.0. Однако стоит отметить, что Google Play Protect не обнаружить наше приложение для проверки концепции как вредоносное даже после выполнения сканирования вручную.
Промон говорит, что они "не наблюдал ни одного реального вредоносного ПО, использующего уязвимость StrandHogg 2.0.», но нет никакой гарантии, что эксплойт обнаружен впервые. По этой причине Promon рекомендует разработчикам защищать свои приложения, устанавливая активность их лаунчера. launchMode
отметьте либо singleTask
или singleInstance
. Любой из этих флагов предотвратит внедрение задач, на что и полагается StrandHogg 2.0. Однако использование в вашем действии одного из этих флагов может вызвать проблемы с определенными потоками приложений, поэтому это не всегда желательно.
Promon также продвигает свой собственный продукт «Защита внутри приложений от Promon SHIELD», который звучит как библиотека. которые разработчики приложений могут реализовать для мониторинга задач в процессе вашего приложения, чтобы выявить нерегулярные вставки. Поскольку не существует по-настоящему эффективной стратегии по устранению последствий для разработчиков или пользователей, очень важно, чтобы производители внедрили исправление для исправления этой проблемы как можно скорее.
К счастью, компания Promon следовала принципам ответственного раскрытия информации, прежде чем обнародовать этот эксплойт (и он все еще не является полностью общедоступным — Promon ждет 90 дней, прежде чем полностью раскрыть то, как StrandHogg 2.0 работает). С тех пор Google перенесла исправления для этого эксплойта на Android 8.0 Oreo, Android 8.1 Oreo и Android 9 Pie с помощью Уровень исправлений безопасности Android (SPL), май 2020 г.. Пользователи Android 10 и выше не уязвимы, хотя мы не совсем уверены, почему это так. Вероятно, это как-то связано с новыми ограничениями Android 10, касающимися запуска действий, и тем, как Google интегрировал их в стек задач. Промон говорит, что «на Android 10 атака совершенно неэффективна, а действия разбиваются на разные задачи и отдельные стеки задач в соответствии с adb shell dumpsys activity activities
."
Если производитель вашего устройства по-прежнему предоставляет обновления безопасности (подробнее см. как здесь работает процесс установки исправлений безопасности), вам следует как можно скорее приставать к ним с просьбой об обновлении. В противном случае вам просто нужно быть осторожным с тем, какие приложения вы загружаете и запускаете (хотя вам все равно следует это делать).
Более подробную информацию и варианты использования StrandHogg 2.0 см. официальное объявление на сайте Promon. Для разработчиков пользовательских ПЗУ вы можете найти соответствующие коммиты AOSP для предотвращения атак StrandHogg 2.0. здесь и здесь.
График раскрытия информации
Вот график раскрытия информации, которым Promon поделился в своем документе StandHogg 2.0:
- 4 декабря 2019 г. – Сообщили о проблеме в Google
- 4 декабря 2019 г. – Поделился PoC-«вредоносным приложением» и видео с Google.
- 4 декабря 2019 г. – Google подтвердил получение отчета
- 9 декабря 2019 г. – Google установил серьезность вывода как «Критическая».
- 9 декабря 2019 г. – Google подтверждает, что они могут воспроизвести проблему.
- 14 февраля 2020 г. – В начале марта мы сообщаем Google о приближении 90-дневного раскрытия информации и запрашиваем статус с их стороны.
- 14 февраля 2020 г. – Google отвечает, что апрель – самое ближайшее время, когда они смогут выпустить исправление.
- 14 февраля 2020 г. – Мы сообщаем Google, что работаем над смягчением последствий.
- 14 февраля 2020 г. — отвечает Гугл. Они работают над исправлениями и спрашивают, можем ли мы рассказать, какие меры по смягчению последствий мы рекомендуем.
- 17 февраля 2020 г. – Мы сообщаем Google, что можем отложить раскрытие информации до апреля. Мы запрашиваем номер CVE
- 17 февраля 2020 г. – Мы делимся нашими стратегиями смягчения последствий, а также тем, как мы видим смягчение последствий для платформы.
- 23 марта 2020 г. – Google отвечает идентификатором CVE (CVE-2020-0096).
- 23 марта 2020 г. – Google отвечает, что общедоступная версия исправления для Android будет доступна в мае.
- 23 марта 2020 г. – Google спрашивает, будем ли мы рассматривать возможность отсрочки раскрытия информации до мая
- 27 марта 2020 г. – Мы отвечаем, что отложим раскрытие информации до мая.
- 22 апреля 2020 г. – Google сообщает нам, что майский бюллетень по безопасности будет содержать исправление для уязвимости.