Авторы приложения тестируют модуль обхода блокировок в странах-цензорах

Популярная социальная сеть была запрещена в России в 2022 году. Для многих поклонников приложения это стало настоящим ударом, а трафик Instagram* понес огромные потери: по данным Brand Analytics на октябрь 2022 года, количество авторов (блогеров) сократилось с 38 млн до 17 млн за год, а количество отправленных сооб��ений упало со 135 млн до 40 млн за тот же период. Теперь, вероятно, владельцы соцсети ищут новые способы вернуть свою аудиторию. Одним из них может стать работа Instagram* с уже встроенным модулем обхода блокировок в странах-цензорах.

Что использует Instagram*

Во время тестирования обновленной версии приложения Instagram* одним из сотрудников компании i2crm было установлено, что приложение работает в обычном режиме без использования VPN-сервиса. Для выяснения причины компания обратилась к стороннему специалисту по реверс-инжинирингу.  В результате реверса мобильного приложения удалось обнаружить, что в Android-версии Instagram* 260.0.0.23.115 arm64 появился модуль Psiphon.

Что такое реверс-инжиниринг

 Реверс-инжиниринг (обратная разработка) — это исследование некоторого готового устройства или программы, а также документации на него, с целью понять принцип его работы.

Реверс-инжиниринг приложения: как именно был обнаружен модуль Psiphon

Сервис Psiphon имеет открытый код, который опубликован на веб-хостинге для IT-проектов GitHub. Для обнаружения модуля, прежде всего, необходимо было ознакомиться с документацией по внедрению модуля в Android-приложение:

Было установлено, что для работы модуля Psiphon на смартфоне требуется несколько условий, а именно: 

Первый этап

С помощью архиватора 7-zip был открыт apk-файл Instagram*, в котором были обнаружены файлы.

Среди этих данных были интересны:

  • AndroidManifest.xml — он предоставляет подробную информацию о приложении;

  • файлы classes.dex — classes9.dex — это скомпилированный java-код;

  • папка lib — нативные библиотеки.

Файл AndroidManifest.xml содержит много информации о приложении, но в данной ситуации специалистов интересовали разрешения на доступ в сеть. Так как приложение Instagram* активно использует интернет-соединение, то проверку разрешений можно пропустить, сделав вывод, что условие по доступу в сеть выполняется.

Второй этап: Java-код

Далее требовалась распаковка apk-файла в декомпиляторе Bytecode-viewer. В нем был обнаружен класс модуля Psiphon.

На этом этапе Java-часть в apk-файле Instagram* была обнаружена, что подтвердило второе условие для поддержки модуля Psiphon.

Данное расширение указывало на то, что файл является скомпилированным (преобразованным) java-кодом. Чтобы понять, что внутри java-кода, специалистам потребовалось преобразовать его в исходный вид, т.е. декомпилировать. В изначальном java-коде и был обнаружен модуль для обхода блокировок Psiphon.

Третий этап: работа с нативной библиотекой

«Заглянуть» внутрь java-кода и обнаружить класс модуля Psiphon удалось с помощью Bytecode-viewer. Реверс apk-файла позволил найти dex-файлы, а при их последующей декомпиляции обнаружить класс модуля Psiphon.

Далее, чтобы понять, как обеспечивается работа модуля на Android, необходимо было найти java-метод, который загружает нативную библиотеку. Когда этот метод был найден, специалисты занялись поиском нативной библиотеки. С ее помощью нужно было установить, какая часть кода отвечает за загрузку этой библиотеки на смартфон. 

Нативная библиотека для 64-разрядных arm-процессоров в репозитории располагается также в открытом доступе на GitHub здесь и имеет имя «libtun2socks.so».

Для подтверждения использования модуля специалисты исследовали java-код и обнаружили метод «startRouting()», который отвечает за загрузку нативной части модуля.

В методе «startRouting()» был обнаружен интерфейс, в который передается имя нативной библиотеки. Сам интерфейс использует системный Android api-метод «loadLibrary()». Этот метод является кодом самого Android и отвечает за загрузку нативной библиотеки в память устройства и делает ее экспортированные функции доступными для java-кода. В свою очередь это дает возможность взаимодействия со скомпилированным С/С++ кодом из java. 

Вот так выглядит та же функция в декомпилированном java-коде:

При распаковке приложения расположение библиотек в каталоге обычно выглядит так: lib\<архитектура процессора>.

Однако по данному пути libtun2socks.so обнаружить не удалось. Поэтому пришлось заглянуть assets\lib, где приложение Instagram* также может хранить нативные библиотеки.

В папке находились два файла:

  • libs.spo -— архив с библиотеками;

  • metadata.txt — перечень библиотек с указанием sha-256 хэша и размера каждого файла.

Но и в metadata.txt нативная библиотека снова не была обнаружена. Все, что было известно изначально — Instagram* при первом запуске приложения автоматически распаковывает архив libs.spo в защищенную часть памяти устройства /data/data/com.instagram.android/lib-compressed/.

Таким образом, третье условие было не выполнено (наличие нативной библиотеки libtun2socks.so). Из первых трех условий можно сделать вывод, что использование модуля невозможно из-за отсутствия ключевой библиотеки.  

Специалисты решили проверить, добавили ли разработчики только код модуля или уже начали его активное внедрение.

Вызов java-кода Psiphon-модуля из java-кода Instagram* на примере установки в Android-приложение

Чтобы понять, как именно устанавливается модуль Psiphon в Android-приложение, можно рассмотреть пример из открытых источников

Создание модуля происходит с помощью метода newPsiphonTunnel(), его код выглядит так:

Метод newPsiphonTunnelImpl() выглядит так:

При установке модуля в Android встречается еще одна нативная библиотека gojni. При реверс-инжиниринге она не была замечена. При повторном изучении репозитория был обнаружен maven aar- модуль для интеграции Psiphon в проекты Android Studio. 

Далее при открытии aar-файла архиватором 7-Zip специалисты нашли искомую библиотеку и ресурсы.

На основании этого можно сделать такой вывод: для работы Psiphon модуля требуется libtun2socks.so и libgojni.so. 

После проведенных установок специалисты снова вернулись к Instagram* и зафиксировали пути, где хранятся библиотеки:

  • /data/data/com.instagram.android/lib-compressed/

  • <apk>/lib/<архитектура процессора>

    Библиотека вновь не была обнаружена. Тогда была сделана попытка найти Instagram*- код, который ссылается на метод newPsiphonTunnel().

При этой операции был найден вызов из кода Instagram* искомого Psiphon модуля. Данное исследование с установкой модуля Psiphon в Android показало, что в целом модуль не используется полноценно, а, как и предполагалось, находится на этапе внедрения. Вероятно, этот сервис компания Meta* может использовать в дальнейшем для того, чтобы избежать блокировок Instagram* со стороны стран-цензоров.

Что представляет собой сервис Psiphon?

VPN-сервис Psiphon разработан в 2006 году в Университете Торонто. Он предназначен для обхода цензуры со стороны госрегуляторов в таких странах, как Китай и Иран. Подробно о принципах работы VPN-сервисов можно прочитать в этой статье

Psiphon имеет сложный механизм, и его трафик почти невозможно поймать, например, через системы фильтрации DPI. Он предоставляет доступ в интернет через прокси-сервер в другой стране, а если сервер становится недоступным, то меняет его автоматически. Теперь, по-видимому, Instagram* решил «зашить» модуль обхода блоки��овок непосредственно в приложение, чтобы избавить пользователей от необходимости искать варианты зайти в него.

Опасен ли модуль Psiphon с точки зрения передачи данных между пользователями Instagram*? Его создатели могут видеть домены, к которым происходит доступ, но не могут видеть пользовательские данные. Это объясняется тем, что модуль — это локальный прокси-сервер, на который перенаправляется зашифрованный Instagram*-трафик. Однако для его чтения недостаточно перехвата, требуется еще расшифровка. Иными словами, модуль может получать данные в обобщенном виде и использовать, например, для настройки рекламного трафика, но не может получать историю браузера и файлов cookies.

Почему Instagram* не использует методы Telegram

Трафик Instagram* блокируется с 14 марта 2022 года интернет-провайдерами России по требованию Генпрокуратуры РФ. Приложение не может самостоятельно обходить блокировки, как это делает Telegram, используя разные IP-адреса.

Telegram для обхода блокировок использует моментальное изменение IPv4-адресов на хостингах Amazon, Google, DigitalOcean. Если заблокировать эти адреса принудительно, то неизбежно произойдет сбой в работе других сайтов и приложений, базирующихся на данных хостинга. Этот способ не используется в Китае, где перечисленные сервера заблокированы госрегулятором.

Также Telegram использует IPv6-адреса, которые регулирующие органы пока не умеют массово выявлять и блокировать. Еще одним способом защиты от возможных блокировок является возможность proxy-подключений через протоколы SOCKS5 и MTProto и ботов автоматической настройки от провайдеров услуг proxy и VPN.

Передача сообщений между пользователями Telegram осуществляется напрямую по протоколу P2P с использованием встроенного Proxy, подобного Tor. Заблокировать такой протокол возможно лишь по конечным IP-адресам пользователей, то есть фактически отключив от сети всех.

Заключение

Исследование работы модуля Psiphon в Android-версии Instagram* 260.0.0.23.115 arm64 было проведено двумя способами: с помощью реверс-инжиниринга приложения и методом вызова java-кода Instagram* на примере установки в Android-приложение. Изучение было проведено с помощью информации, полученной из открытых источников и ресурсов.

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

*Meta Platforms Inc. (Facebook, Instagram) — признана экстремистской, ее деятельность запрещена на территории России.