Такие разные Android AppLinks, WebLinks, DeepLinks. Разбираемся и пытаемся сломать

Введение

Всем привет! На связи Юрий Шабалин и Веселина Зацепина ( @VeselinaZatsepina) эксперты по безопасности мобильных приложений в компании Стингрей.С каждым годом мобильные приложения становятся всё более сложными и взаимосвязанными, предлагая пользователям бесшовный опыт взаимодействия. Одной из ключевых частей этого опыта являются ссылки, которые могут направить пользователя прямо на определённый экран приложения или на конкретный контент. Однако многие (как и мы до того, как написать эту статью) путают такие термины, как Deep Links, Web Links и App Links, что может привести к ошибкам в реализации и уязвимостям.

68d97b58ed4bc04b0cd8ca93ce2eb82a.png

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

Надеемся, что эта статья поможет вам (как и нам в свое время) разобраться с различиями этих механизмов и даст почву для размышлений, как еще их можно проверить.

Какие бывают типы ссылок?

Прежде чем углубляться в безопасность и проблемы, важно понять, какие вообще бывают типы ссылок (links), которые мы можем создать в приложении Android:

 — Deep links

 — Web links

 — Android App Links

На рисунке 1 показана взаимосвязь между этими типами ссылок. Далее мы разберём каждый тип немного подробнее.

Рис. 1. Взаимосвязь между типами ссылок

Рис. 1. Взаимосвязь между типами ссылок

Deep links

Deep Links — это URI любой схемы, которые позволяют направить пользователя в конкретную часть приложения. Такие ссылки могут выглядеть, например, как myapp://path или superapp://path/to/resource. Чтобы реализовать поддержку Deep Links в Android, необходимо добавить соответствующий intent-filter в манифест приложения, который определит, какая Activity будет обрабатывать данную ссылку.

Вот пример кода, реализующего Deep Link:


    
        
        
        

        
    

Когда пользователь нажимает на Deep link, может появиться диалоговое окно «устранения неоднозначности». Оно возникает, когда несколько приложений на устройстве зарегистрированы для обработки одной и той же ссылки. Диалоговое окно позволяет пользователю выбрать нужное приложение для открытия ссылки. Оно обеспечивает свободу выбора для пользователя, однако может создавать неудобства и риски, если он выберет ненадежное приложение. Избежать появления этого окна можно, используя App Links и подтверждая право собственности на домен, что делает ваше приложение обработчиком по умолчанию для конкретного типа ссылок. Но об этом чуть позже.

На рисунке 2 показано диалоговое окно после того, как пользователь нажимает на ссылку.

Рис. 2. Диалоговое окно выбора приложений

Рис. 2. Диалоговое окно выбора приложений

Web links

Web Links — это ссылки, которые используют стандартные схемы HTTP и HTTPS и ведут к веб-контенту. На устройствах с Android 12 и выше нажатие на такую ссылку всегда открывает её в браузере, если она не привязана к конкретному приложению (то есть, если приложение не зарегистрировано как обработчик этой ссылки в системе, что позволяет Android автоматически передавать управление ссылкой этому приложению).

На более старых версиях Android, если несколько приложений зарегистрированы для обработки одной и той же веб-ссылки, появляется диалоговое окно «устранения неоднозначности». Это окно позволяет пользователю выбрать нужное приложение для открытия ссылки. Например, если у пользователя установлены два приложения, способные обрабатывать одну и ту же ссылку, система предложит выбрать, какое из них открыть. Такая ситуация представляет риск для пользователя, если одно из приложений является ненадежным. Злоумышленник может попытаться использовать эту возможность и обманом заставить пользователя выбрать его приложение.

В следующем фрагменте кода показан пример объявления Web link:


    
        
        
        

        
    

Android App Links

App Links, доступные на Android 6.0 (уровень API 23) и выше, представляют собой Web links, которые используют схемы HTTP и HTTPS и содержат атрибут autoVerify. Этот атрибут позволяет нашему приложению назначить себя обработчиком по умолчанию для определенного типа ссылки. Поэтому, когда пользователь нажимает на App Link, наше приложение открывается немедленно, если оно установлено, и диалоговое окно «устранения неоднозначности» не отображается.

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

В следующем фрагменте кода показан пример объявления App Link:


    
         
         
         

         
         
         

 

Android App Links имеют значимое преимущество: поскольку они используют HTTP URL-адреса, которые ссылаются на домен вашего веб-сайта, никакое другое приложение не может использовать ваши ссылки. Одним из требований для Android App Links является подтверждение права собственности на ваш домен. В связи с этим пользователи, у которых не установлено приложение, просто переходят на ваш веб-сайт вместо приложения — никаких 404, никаких ошибок. Далее мы поговорим о процессе подтверждения права собственности на домен и посмотрим, возможно ли что-то сломать.

Верификация домена для App Links

На самом деле всё просто!

Для того чтобы приложение могло стать обработчиком по умолчанию для ссылок с вашего URL, необходимо подтвердить право собственности на домен. Это делается через Play Console и включает добавление специального файла assetlinks.json на ваш сервер.

Для этого заходим в свой аккаунт Play Console (это место, где вы публикуете свои приложения). Затем переходим в раздел «Ссылки на контент»:

188edec8c8c75fb80495cd449e66431a.png

Далее нажимаем кнопку «Добавить домен»:

a25a26d9f16d710442df72fd4e6d5cd9.png

Здесь у нас появится всплывающее окно, в котором нужно ввести домен, который вы хотите верифицировать:

68d5ca7daada582618495ca1a75fd1a1.png

После ввода домена у вас сгенерируется .json файл, который нужно будет добавить по пути, указанному ниже:

8c3051011d72f3c92a8c13762a0a8ddb.pngb05e9ded18654ceea51f8cd1a357af01.png

Переходим на свой сервер (мы будем использовать тестовый сервер) и добавляем наш сгенерированный файлик (в нашем случае просто обновляем):

b700d00812d1cf07fdcaa8842de478d1.png

Возвращаемся в Play Console и нажимаем на кнопку «Установить связь с сайтом»:

3b8c9e3bc15be465828659d2bfae2f9d.png

Если вы всё проделали верно, то увидите внизу надпись:

aea774a62752f0e2c0f9aaf6047caaa7.png

С этого момента ваш домен считается подтвержденным и App Link будет открывать только ваше приложение. Никаких диалоговых окон «устранения неоднозначности»!

Как сломать App Links?

Сломать App Link также очень просто. Достаточно внести изменения в файлик assetlinks.json (изменения, которые противоречат сгенерированному файлу) и ваш App Link превращается в Web Link со всеми вытекающими последствиями в виде диалогового окна «устранения неоднозначности».

Как проверить валидность App Links?

Поскольку апплинки можно легко сломать, нужно найти способ верификации, при котором App Link работает и домен верифицирован без нудного захода в Play Console. И такой способ есть!

Заходим в консоль на устройство, на котором установлено наше приложение, и вводим команду:

adb shell pm get-app-links com.swordfishsecurity.securenotes

Она выведет следующую информацию:

com.swordfishsecurity.securenotes:

    ID: 96a1f202-ac04-4dc1-95ad-2cb7d7b4057d

    Signatures: [33:90:0E:20:34:49:45:D2:0A:88:0D:36:D5:C1:75:70:50:BA:5C:66:44:03:79:05:E7:DF:5A:6B:7B:E2:17:BD]

    Domain verification state:

      devgymprojectdev.com: 1024

В Domain verification state могут отобразиться разные статусы. Но если мы не видим статус verified, значит что-то пошло не так и домен не верифицирован. В примере выше мы просто сломали файлик, поэтому у нас не отобразился статус verified. В нашем конкретном примере *1024 — это ошибка.

Атаки и уязвимости

Эта статья написана не просто так, а в рамках нашего внутреннего исследования, где мы пытались понять, можно ли каким-то образом обойти механизм защиты и проверки App Links. Мы проверяли различные сценарии атак, такие как подмена файла assetlinks.json на другом домене, добавление в него элементов, нарушающих корректную работу системы, и попытки зарегистрировать один и тот же домен для нескольких приложений с целью создания путаницы.

И тут должно было быть детальное описание всех атак и уязвимостей, которые возникают при ошибках в выставлении App Links. Но, к сожалению, этого не будет — не все исследования заканчиваются успешным открытием нового направления атаки. Единственное, чего нам удалось добиться — это превращение App Links в обычные Web Links, которое влечет за собой появление диалога «устранения неоднозначности». Какие-то более существенные бреши и проблемы найти не удалось. Зато мы точно для себя разобрались, как ведет себя система в случае нескольких зарегистрированных Web Links или Deep Links и как избежать диалогового окна, чтобы не вводить пользователя в заблуждение.

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

Заключение

Отсутствие подтверждения домена у App Links не приводит к серьезным последствиям. Однако, чтобы избежать появления (уже не раз упоминавшегося) диалогового окна «устранения неоднозначности»,  крайне советуем всё же верифицировать домены и использовать именно этот механизм, при котором всегда будет открываться ваше приложение и у злодеев не будет возможности запутать пользователя.

Надеемся эта статья помогла вам лучше понять разницу между разными технологиями — к ней всегда можно будет вернуться в качестве справочного материала :)

Если у вас есть вопросы или вы хотите узнать больше о безопасности мобильных приложений, не стесняйтесь обращаться к нам и следить за дальнейшими публикациями.

Спасибо!

Ссылки

  1. Android App-links

  2. Verify android applinks

© Habrahabr.ru