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

Чтобы упростить пост, будет использоваться термин «Instagram*» вместо «Meta*» или «Facebook*».

Примечание. Если статья покажется интересной, то вот тут я пишу об iOS-разработке и о том, что с ней связано.

Что делает Инстаграм*?

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

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

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

Почему это так важно?

Apple активно работает против такого рода отслеживания:

  • Начиная с iOS 14.5 прозрачность отслеживания приложений дает пользователю возможность контролировать ситуацию:

  • Приложения должны получить разрешение пользователя, прежде чем отслеживать его данные в приложениях, принадлежащих другим компаниям.

  • Safari уже блокирует сторонние файлы cookie по умолчанию.

  • Google Chrome скоро откажется от сторонних файлов cookie.

  • Firefox только что объявил о внедрении Total Cookie Protection по умолчанию для предотвращения любого межстраничного отслеживания.

  • Некоторые интернет-провайдеры раньше внедряли свой собственный код отслеживания/рекламы на все веб-сайты, однако они могли делать это только для незашифрованных страниц. С появлением HTTPs по умолчанию это больше не вариант. Подход, который использует приложение Instagram* & Facebook*, работает для любого сайта, независимо от того, зашифрован он или нет.

Instagram* намеренно работает над системой разрешений App Tracking Transparency, которая была разработана для предотвращения именно этого типа сбора данных. После его представления Meta* объявила:

Простое предупреждение Apple об iPhone обходится Facebook* в 10 миллиардов долларов в год

Facebook* пожаловался, что Apple App Tracking Transparency отдает предпочтение таким компаниям, как Google, потому что App Tracking Transparency «вырезает браузеры из подсказок отслеживания, которые Apple требует для приложений».

Веб-сайты, которые вы посещаете на iOS, не вызывают запросы на отслеживание, поскольку встроены функции защиты от отслеживания.

Daring Fireball и MacWorld.

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

Facebook* атаковал своих пользователей сообщениями, умоляя их снова включить отслеживание. Он угрожал антимонопольным иском против Apple. Это заставило малые предприятия защищать отслеживание пользователей, утверждая, что когда гигантская корпорация шпионит за миллиардами людей, это форма развития малого бизнеса.

—  EFF - Facebook* Says Apple is Too Powerful. They’re Right.

FAQs для тех, кто не является разработчиками

  • Может ли Instagram*/Facebook* читать все, что я делаю в Интернете? Нет! Instagram* может читать и просматривать ваши действия в Интернете только тогда, когда вы открываете ссылку или рекламу в своих приложениях.

  • Действительно ли Facebook* крадет мои пароли, адреса и номера кредитных карт? Нет! Я не собрал все данные, которые отслеживает Instagram*, но хотел продемонстрировать, какие данные они могут получить без вашего ведома. Как было показано в прошлом, если компания может получить доступ к данным бесплатно, не спрашивая разрешения у пользователя, она будет отслеживать это.

  • Как я могу защитить себя? Для получения полной информации прокрутите статью до конца. Резюме: всякий раз, когда вы открываете ссылку из Instagram* (или Facebook*, или Messenger), не забудьте щелкнуть точки в углу, чтобы вместо этого открыть страницу в Safari.

  • Инстаграм* делает это намеренно? Я не могу сказать, как решения принимались внутри. Все, что я могу сказать, это то, что создание вашего собственного браузера в приложении требует нетривиального времени для программирования и обслуживания, значительно больше, чем просто использование конфиденциальности и удобной альтернативы, которая уже была встроена в iPhone за последние 7 лет.


Meta* Pixel

Внешний файл JavaScript, который внедряет приложение Instagram* (pcm.js в документации), представляет собой метапиксель, а также некоторый код для создания моста для связи с хост-приложением. Это не просто пиксель/изображение, а реальный код JavaScript, который выполняется:

Meta* Pixel — это фрагмент кода JavaScript, который позволяет отслеживать действия посетителей на вашем сайте. Он работает, загружая небольшую библиотеку функций, которую вы можете использовать всякий раз, когда посетитель сайта совершает действие, которое вы хотите отслеживать […]

Meta* Pixel может собирать следующие данные: […]

Данные о нажатиях кнопок — включают все кнопки, нажатые посетителями сайта, метки этих кнопок и любые страницы, посещенные в результате нажатия кнопок.

Названия полей формы — включает имена полей веб-сайта, такие как электронная почта, адрес, количество и т. д., когда вы покупаете продукт или услугу. Мы не фиксируем значения полей, если вы не включите их как часть расширенного сопоставления или необязательных значений.

– документация разработчиков (Июнь 2022)

«Meta* pixel позволяет отслеживать активность посетителей на вашем веб-сайте». Вот в чем проблема: поставщик веб-сайта совершенно нормально решает внедрить meta* pixel для отслеживания активности посетителей. Однако в данном случае оператор веб-сайта не давал согласия на установку Meta* Pixel. Кроме того, у провайдера веб-сайта даже нет возможности отказаться.

Дисклеймер

У меня нет списка точных данных, которые Instagram* собирает. У меня есть доказательства того, что приложения Instagram* и Facebook* активно запускают команды JavaScript для внедрения дополнительного JS SDK без согласия пользователя, а также отслеживают выбор текста пользователем. Если Instagram* уже делает это, они также могут внедрить любой другой код JS. Само приложение Instagram* хорошо защищено от атак «human-in-the-middle», и только изменив двоичный файл Android, удалив привязку сертификата и запустив его в симуляторе, я смог проверить часть его веб-трафика.

Даже тогда большая часть фактических данных имела еще один уровень шифрования/сжатия. Понятно, что они действительно не хотят, чтобы вы исследовали, какие данные отправляются обратно в API. Я решил не тратить на это больше времени.


В целом цель этого проекта заключалась не в том, чтобы получить точный список данных, которые собираются, а в том, чтобы выделить проблемы с конфиденциальностью и безопасностью, вызванные использованием браузеров в приложениях, а также доказать, что такие приложения, как Instagram* уже используют эту лазейку.

Подводя итог рискам и недостаткам встроенных браузеров в приложениях:

  • Конфиденциальность и аналитика: Хост-приложение может отслеживать буквально все, что происходит на веб-сайте, каждое касание, ввод данных, поведение при прокрутке, какой контент копируется и вставляется, а также отображаемые данные, такие как онлайн-покупки.

  • Кража учетных данных пользователя: физических адресов, ключей API и т. д.

  • Реклама и рефералы: Хост-приложение может размещать рекламу на веб-сайте или заменять ключ API рекламы, чтобы украсть доход от хост-приложения, или заменять все URL-адреса, чтобы включить ваш реферальный код (это случалось раньше).

  • Безопасность: браузеры потратили годы на оптимизацию безопасности UX в Интернете, например, показ статуса шифрования HTTP, предупреждение пользователя о схематичных или незашифрованных веб-сайтах и ​​многое другое.

  • Внедрение дополнительного кода JavaScript на сторонний веб-сайт может вызвать проблемы и сбои, что может привести к поломке веб-сайта.

  • Пользовательские расширения браузера и блокираторы контента недоступны.

  • Диплинки не работают в большинстве случаев.

  • Часто нет простого способа поделиться ссылкой через другие платформы (например, через электронную почту, AirDrop и т. д.).

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

Тестирование различных приложений

Instagram* iOS

Messenger iOS

Facebook* iOS

Instagram* Android

WhatsApp по умолчанию открывает iOS Safari, поэтому там проблем нет.

Как это работает

Насколько мне известно, нет хорошего способа отслеживать все команды JavaScript, которые выполняются хост-приложением iOS (хотелось бы услышать, есть ли лучший способ). Я создал новый простой файл HTML с некоторым кодом JS, чтобы переопределить часть документа. методы:

Я создал новый простой файл HTML с некоторым кодом JS, чтобы переопределить часть документа. методы:

document.getElementById = function(a, b) {
    appendCommand('document.getElementById("' + a + '")')
    return originalGetElementById.apply(this, arguments);
}

Открытие этого HTML-файла из приложения Instagram* для iOS дало следующее:

Instagram* iOS

Сравнивая это с тем, что происходит при использовании обычного браузера или, в данном случае, Telegram, который использует рекомендуемый SFSafariViewController:

Сравнение с Telegram

Как видите, обычный браузер или SFSafariViewController не запускает JS-код. SFSafariViewController — это отличный способ для разработчиков приложений показывать сторонний веб-контент пользователю, не выходя из приложения, сохраняя при этом конфиденциальность и удобство для пользователя.

Технические подробности

  • Instagram* добавляет новый listener, чтобы получать подробную информацию о каждом выборе пользователем любого текста на веб-сайте. Это, в сочетании с отслеживанием скриншотов, дает Instagram* полное представление о том, какая конкретная информация была выбрана и передана.

  • Приложение Instagram* проверяет, есть ли элемент с идентификатором iab-pcm-sdk: на удивление, я нашел очень мало информации об этом в Интернете. По сути, это кроссплатформенный SDK для отслеживания, предоставленный IAB Tech Lab, однако я недостаточно знаю об отношениях между Instagram* и IAB Tech Lab (например, этот твит).

  • Если элемент с идентификатором iab-pcm-sdk не найден, Instagram* создает новый элемент скрипта, устанавливает его источник на pcm.js, который является исходным кодом для Meta* pixel.

  • Затем он находит первый элемент сценария на вашем сайте для вставки Meta* Pixel прямо перед ним, внедряя Meta* Pixel на ваш сайт.

  • Instagram* также запрашивает iframe на вашем веб-сайте, однако я не смог найти никаких указаний на то, что они с ним делают.

Как защитить себя как пользователя?

  • Избегайте in-app-webview. В большинстве встроенных в приложение браузеров есть способ открыть отображаемый в данный момент веб-сайт в Safari. Как только вы попадете на этот экран, просто используйте эту опцию, чтобы выйти из него. Если эта кнопка недоступна, вам придется скопировать и вставить URL-адрес, чтобы открыть ссылку в браузере по вашему выбору.

  • Используйте веб-версию. Большинство социальных сетей, включая Instagram* и Facebook*, предлагают достойную мобильную веб-версию с аналогичным набором функций. Вы можете без проблем использовать приложение в iOS Safari.

Как защитить себя как провайдеру веб-сайта?

Пока Instagram* не решит эту проблему (если вообще когда-либо), вы можете довольно легко обмануть приложения Instagram* и Facebook*, чтобы они поверили, что код отслеживания уже установлен. Просто добавьте в свой HTML-код следующее:

<span id="iab-pcm-sdk"></span>
<span id="iab-autofill-sdk"></span>

Кроме того, чтобы Instagram* не отслеживал выбор текста пользователем на вашем веб-сайте:

const originalEventListener = document.addEventListener
document.addEventListener = function(a, b) {
    if (b.toString().indexOf("messageHandlers.fb_getSelection") > -1) {
        return null;
    }
    return originalEventListener.apply(this, arguments);
}

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

Приложению также легко определить, является ли текущий браузер приложением Instagram*/Facebook*, проверив user agent, однако я не смог найти хороший способ автоматически выйти из браузера в приложении, чтобы вместо этого открыть Safari. Если вы знаете решение, я хотел бы знать.

Предложения

Для Apple

Apple проделывает фантастическую работу, создавая свою платформу с учетом конфиденциальности пользователей. Один из 4 принципов конфиденциальности:

Прозрачность и контроль пользователей. Убедитесь, что пользователи знают, какие данные передаются и как они используются, и что они могут контролировать их.

– Apple Privacy PDF (Апрель 2021).

На момент написания статьи не существовало правила проверки AppStore, которое запрещало бы компаниям создавать собственные браузеры в приложениях для отслеживания пользователей, чтения их входных данных и размещения дополнительной рекламы на сторонних веб-сайтах. Однако Apple явно рекомендует использовать SFSafariViewController:

Избегайте использования web view для создания веб-браузера. Использование web view, позволяющего людям ненадолго получить доступ к веб-сайту, не выходя из контекста вашего приложения, — это нормально, но Safari — это основной способ просмотра веб-страниц. Попытка воспроизвести функциональность Safari в вашем приложении не нужна и не рекомендуется.

– Apple Human Interface Guidelines (Июнь 2022).

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

– Apple SFSafariViewController docs (Июнь 2022)

Внедрение App-Bound Domains

App-Bound Domains - это новая замечательная функция WebKit, позволяющая разработчикам обеспечить более безопасный просмотр веб-страниц в приложении при использовании WKWebView. Как разработчик приложения, вы можете определить, к каким доменам может получить доступ ваше приложение, и все веб-запросы будут ограничены ими. Чтобы отключить защиту, пользователь должен будет явно отключить ее в настройках приложения iOS.

Функция App-Bound Domains появилась в iOS 14 (~1,5 года назад), однако разработчики могут использовать ее только по желанию, что означает, что подавляющее большинство приложений для iOS не используют эту функцию.

Если разработчики SocialApp хотят улучшить конфиденциальность пользователей, у них есть два пути:

Использовать SafariViewController вместо WKWebView для просмотра внутри приложения. SafariViewController защищает данные пользователя от SocialApp, загружая страницы вне пространства процессов SocialApp. Используя SafariViewController, SocialApp может гарантировать своим пользователям наилучший доступный опыт конфиденциальности.


Согласие на App-Bound Domains. Дополнительные ограничения WKWebView от App-Bound Domains гарантируют, что SocialApp не сможет отслеживать пользователей с помощью API, описанных выше.

Я выделил часть "хотят улучшить конфиденциальность пользователей", так как это недостающая часть: App-Bound Domains должны быть обязательным требованием для всех приложений iOS, поскольку именно приложения социальных сетей внедряют код отслеживания.

В июле 2022 года Apple представила режим блокировки, чтобы лучше защитить людей, подверженных высокому риску. К сожалению, режим блокировки iOS не меняет способ работы веб-просмотров в приложении. Я подал радар в Apple: rdar://10735684, на что Apple ответила: "Режим блокировки не для этого".

Ответ Apple
Ответ Apple

Несколько срочных шагов, которые необходимо предпринять компании Apple

Обновите правила проверки приложений, чтобы потребовать использования SFSafariViewController или App-Bound Domains при отображении любых сторонних веб-сайтов.

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

  • Сторонние веб-сайты/контент по-прежнему могут отображаться с помощью класса WKWebView, так как они часто используются для элементов пользовательского интерфейса, или приложение фактически изменяет свой сторонний контент (например, автоматическое отключение собственных баннеров cookie).

    Я также отправил радар (rdar://38109139) в Apple в рамках моей прошлой записи в блоге.

Для Meta*

Сделайте то, что Meta* уже делает с WhatsApp: Прекратите модифицировать сторонние сайты и используйте Safari или SFSafariViewController для всех сторонних сайтов. Так будет лучше для пользователя, и так будет правильно.

Я сообщил об этой проблеме через Bug Bounty Program, где в течение нескольких часов они подтвердили, что смогли воспроизвести "проблему", однако за последние 9 недель я больше ничего не услышал, кроме просьбы подождать, пока они не подготовят полный отчет. Поскольку на мои последующие вопросы не последовало никаких ответов, и они не перестали внедрять код отслеживания на внешние сайты, я решил обнародовать эту информацию (предупредив их еще за 2 недели).

Ознакомьтесь с другими моими публикациями, касающимися конфиденциальности и безопасности.

*Meta признана в России экстремистской организацией, деятельность ее сервисов Facebook и Instagram в стране запрещена.

*Facebook и Instagram продукты компании Meta, которая признана в России экстремистской организацией, деятельность ее сервисов Facebook и Instagram в стране запрещена.


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

Авторский канал об iOS-разработке
Авторский канал об iOS-разработке

Комментарии (14)


  1. Oz_Alex
    11.08.2022 10:39
    +4

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

    А что делают рекламодатели?
    Фигачат рекламу ковровыми бомбардировками тупо по возрасту и стране.



    1. pishchin
      11.08.2022 14:39

      Скорее всего таргетированная реклама дороже. Это не значит, что она эффективнее не таргетированной, но рекламным компаниям хочется больше заработать.

      Кстати, у фейсбук* в настройках можно посмотреть рекламодателей, которые загружали им ваши контактные данные - телефоны и адреса электронной почты в основном, чтобы не показывать рекламу уже привлечённым клиентам.


      1. Oz_Alex
        11.08.2022 14:52
        +1

        Так у меня этих скринов уже где-то 40, просто ждал, когда пригодятся для Хабра. Уже ради интереса смотрю почему мне показали эту рекламу и вижу одну и ту же картину.
        А в остальных случаях помимо возраста и расположения где-то 5% в духе «Вы показали интерес к моде», когда я 20 лет хожу в джинсах и однотонной футболке или «Вы показали интерес к Adobe Creative Cloud», когда я один раз гуглил как «пропатчить» Lightroom.


  1. Aleksandr-JS-Developer
    11.08.2022 11:11
    +2

    Парой строк JS кода можно легко отслеживать движение мыши по сайту. При отслеживании раз в фиксированный промежуток времени записывать положение курсора.

    Потом наложить клики и список ивентов (логин, переход и т. д.) и можно сделать повтор (видео), как будто вы видите экран клиента, когда он делал свои действия.

    Мы такую аналитику с клиентов снимаем и вряд ли они подозревают про это.

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

    Кстати, Facebook уже эти данные собирает.

    Да что там Facebook. Однажды решил посмотреть, как мой старый смартфон Android (Xaomi Redmi 3) следит за мной.

    Поставил простенький сканнер сетевых запросов на устройство (первый в выдаче плей маркета) + сертификат для него. Вырубил все приложения (кроме сканнера), стою на главной экране.

    И вижу раз в пару секунд сетевой запрос от Android Framework с какими-то данными, похожими на гугловскую аналитику.

    {

      "a": "b6100d7610c6fd5ed4dce519eecfc8847b46d79e",

      "b": "c1dc189a8ecb9af625c768e80f86810b2e5f43fb8"

    }

    Интересно, что каждый запрос завершался со статусом 404.

    В общем в этом болоте приятного мало, но приходится копаться, чтобы хоть знать...


  1. saipr
    11.08.2022 11:59
    +4

    Приложение Instagram и Facebook для iOS отображает все сторонние ссылки и рекламу в своем приложении с помощью собственного встроенного браузера. Это создает различные риски для пользователя, поскольку хост-приложение может отслеживать каждое взаимодействие с внешними веб-сайтами, от всех данных формы, таких как пароли и адреса, вплоть до каждого нажатия.

    Есть одно хорошее решение, которое решит все ваши проблемы — напишите своё приложение, которому вы будете доверять. Другого пути нету.


  1. aamonster
    11.08.2022 12:00
    +3

    TL;DR

    Кто-то этого не понимал? Кажется, любой чайник осознаёт, что делая что-то в приложении – даёшь информацию этому приложению. Как следствие, не имею привычки логиниться в соцсети внутри приложений ("войти через фейсбук" – да ну, ввести кому-то пароль от фейсбука?) и т.п. – либо в отдельном браузере, либо в приложении самой соцсети.

    Ну а те, кто чуть в курсе насчёт WKWebView (вроде это сейчас единственный разрешённый способ показывать веб-контент) – понимают, как именно получать из него данные (оно всё же сколько-то изолировано, так что самым простым способом является использование контент-скриптов).


  1. pishchin
    11.08.2022 14:49
    +1

    Если не пользоваться встроенным в приложение браузером, то при открытии Safari приложение может же добавить в ссылку параметр- идентификатор, чтобы связать профиль в приложении с теневым профилем посещённых сайтов в Safari?

    Заметил, что если авторизоваться в приложение c аккаунтом Google или фейсбук* в приложении, то cookies прокидываются в Safari и становишься в нём тоже авторизованным - надо чистить cookies.


    1. ifap
      12.08.2022 00:03

      Заметил, что если авторизоваться в приложение c аккаунтом Google или фейсбук* в приложении, то cookies прокидываются в Safari и становишься в нём тоже авторизованным - надо чистить cookies

      Или запрещать прием third-party cookies, чего не делать просто не вижу ни одной причины.


    1. NN1
      12.08.2022 19:10

      Поэтому правильней будет скопировать ссылку, убрать из неё всё лишнее и потом зайти.

      Но даже это не поможет :)

      Потому как сам сайт может передать М*та факт захода на него и IP адрес , а далее дело техники связать заход на сайт с вашего устройства с вашим профилем :)


  1. ifap
    11.08.2022 15:16

    Кроме того, у провайдера веб-сайта даже нет возможности отказаться.

    Эмм... Content Security Policy же... нет?


    1. qw1
      12.08.2022 15:11
      +1

      Тут же речь о просмотре веба через браузер в приложениях Meta.
      А их браузер может игнорировать policy.


      1. ifap
        12.08.2022 17:10

        Ага, верно... тогда остается только блокировать по UA, если приложение еще и его не подменяет.


        1. qw1
          13.08.2022 12:06

          Бизнесу, который владеет сайтом, это невыгодно.
          Пусть мета тоже поимеет историю пользователя, зато и сайт тоже. Если блокировать, то все в проигрыше. Пользователь тыкнёт ссылку в браузере мета, сайт не работает. Подумает «ну и ладно, какой-то кривой сайт, пойду на другой».


          1. ifap
            13.08.2022 12:26

            Я рассуждал лишь о возможности, а не том, будет ли сайтовладелец ею пользоваться.