Twitter следит за тобой, анонимус

    Часто приходиться слышать о том, что крупные корпорации вроде Google, Facebook или LG следят за каждым пуком несчастных пользователей. И исследовав некоторое из их software, я должен признать что таки да — они следят.

    Вчера я исследовал самый свежий (на момент написания этой статьи) официальный iOS-клиент Twitter версии 5.13.1. Мне, кроме всего прочего, было интересно посмотреть на трафик между клиентом и сервером. Поскольку клиент Twitter использует certificate pinning, его трафик довольно трудно перехватить с помощью Fiddler2 и подобных программ. Поэтому я написал define-команду для GDB, которая цепляется на точку останова в [NSURLConnection start] и дампит в консоль интересные мне поля NSURLConnection непосредственно перед вызовом этого самого start. Такой нехитрый в общем-то фокус позволяет видеть что именно программа посылает на сервер ещё до того как это «что именно» будет зашифровано для дальнейше передачи по HTTPs.

    И знаете что я увидел? Клиент Twitter, кроме своих обычных запросов (регистрация пользователя, авторизация, твит и т.п.) часто… нет, не так… очень часто отсылал на сервер POST запросы на некий загадочный URL api.twitter.com/1.1/jot/client_event. Эти запросы шли на сервер почти по любому поводу. Я запустил клиент — запрос пошел. Я нажал кнопку «Sign in» (ещё не залогинился, просто кнопку жмакнул) — запрос пошел. Вылез экран логина, поле «Username» получило фокус — запрос пошел. Я свернул клиент — запрос пошел… Я конечно удивился и полез разбираться.

    Типичный запрос на api.twitter.com/1.1/jot/client_event выглядел вот так (некоторые поля я, по понятным причинам, замазал):



    Посмотрев пару десятков таких запросов, я примерно понял общую структуру:

    URL:    https://api.twitter.com/1.1/jot/client_event
    Method: POST
    Headers:
      X-Twitter-API-Version: 5
      Authorization: OAuth... ля-ля-ля, обычная OAuth авторизация, подписанная секретным ключем (без кавычек)
                     "GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU&fgFuHBbtKUk1ykYzwEKaYeNg28H0XEvztfVQCEu8GA"
      X-Twitter-Client: Twitter-iPhone
      X-Twitter-Client-Version: 5.13.1
      Geolocation: мои координаты, блин (но если выключить Location Service - это поле исчезает из запросов)
      Accept-Language: en
      X-Twitter-Client-DeviceID: ID моего девайса
      X-Client-UUID: уникальный UUID (генерируется один раз при первом старте клиента, дальше не меняется) 
      User-Agent: Twitter-iPhone/5.13.1 тут версия iOS (Apple;iPhone3,1;;;;;1)
    Body (понятное дело URL-encoded):
      lang=en&log=<cite>...тут интересный JSON (см. дальше)...</cite>&send_error_codes=1

    Конечно самое интересное тут было в JSON в теле запроса. Во всех запросах это был массив элементов следующего вида:

    [
      ...
      {
       "event_name": имя события
       "ts": UNIX timestamp,
       "format_version":2,
       "_category_":"client_event",
       "client_version":"Twitter-iPhone\5.13.1 тут версия iOS (Apple;iPhone3,1;;;;;1)"
      }
      ...
    ]

    Например, когда я нажимал кнопку «Sign in» (ещё не логинился, просто кпопку жмакал), на сервер уходил запрос с примерно таким JSON:

    [
      {
       "event_name":"iphone:login:::impression",
       "ts":1385678390003,
       "format_version":2,
       "_category_":"client_event",
       "client_version":"Twitter-iPhone\5.13.1 iOS\6.1.3 (Apple;iPhone3,1;;;;;1)"
      }
    ]

    Я смотрел другие запросы (их было много, да), и похоже что поля event_name, ts, format_version, _category_ и client_version являются обязательными. Они были у каждого элемента JSON'а, в каждом запросе. Но кроме них попадались и дополнительные поля. Например когда на экране логина поле «Username» получало фокус, в запросе уходил такой JSON:

    [
      {
       "_category_":"client_event",
       "event_name":"iphone:ddg:digits_iphone_signup_1337::experiment",
       "client_version":"Twitter-iPhone\5.13.1 iOS\6.1.3 (Apple;iPhone3,1;;;;;1)",
       "ts":1385678389354,
       "experiment_key":"digits_iphone_signup_1337",
       "format_version":2,
       "version":12,
       "bucket":"uncheck_follows"
       }
    ]

    Вероятно, поля experiment_key, version и bucket содержат какую-то дополнительную информацию о том что и как я делаю. Ну что бы ребятам в Twitter было понятнее. Что это за информация и что значат эти магические 12 и uncheck_follows, я пока не знаю, но может быть соберусь исследовать этот вопрос внимательнее.

    Вот собственно и всё. В конце статьи надо бы что-то сказать такое умное, но в четыре часа ночи в голову ничего не приходит. Разве что мне не нравится как Twitter через своё приложение следит почти что за каждым моим движением и знает в подробностях что, когда и (учитывая заголовок Geolocation) где я делаю с их программой. Вплоть до того на какую кнопку я тыцнул и когда. Наверное это какой-то нужный и полезный эксперимент по сбору моего user experience, не даром же в некоторых запросах есть поле experiment_key.

    А ещё мне не нравится что это приложение своими бесконечными «шпионскими» запросами сжирает мой драгоценный (в буквальном смысле) GPRS трафик. Хорошо я хоть не в роуминге, а то с этими Twitter'овскими экспериментами за пару дней без штанов можно остаться… ладно, чего-то я разбурчался: «не нравится, не нравится...» Пойду спать наверное.

    Всем хорошей пятницы :)

    P.S. Извините если заголовок кому-то показался желтоватыми. Всем спасибо за мнения в комментариях, получается интересное обсуждение. На данный момент точки зрения комментирующих разделились: кому-то не нравится такой дотошный и детальный трекинг со стороны официального клиента Twitter. Другие говорят что мол ничего страшного, сайты например давным давно собирают статистику действий пользователя, да и приложения уже тоже. Мммм… я даже не знаю. В случае с сайтами у пользователя есть хотя бы теоретическая возможность побороться за свою приватность (с помощью того же Ghostery например). А у приложений из App Store закрытые исходники, HTTPs, у некоторых certificate pinning и нет галочки «не следи за мной». Получается что шансов предотвратить сбор статистики о действиях рядового пользователя у этого самого рядового пользователя почти никаких. Хотя может действительно ничего страшного, просто это я уже старый и отстал от жизни, и надо бы привыкать к дивному новому миру. Но все-таки надеюсь что нет.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 51

      +19
      Немного не понял паники. А если я как автор сайта поставлю на сайт яндекс.метрику или там гугл.аналитику — то тоже буду получать информацию о кликах, инфу, который передаёт браузер, версию ОС, географические координаты (если пользователь разрешил) и т.п. И в случае с яндексом там реально карта кликов, карта движения пользователя по странице, т.е. инфа тоже передаётся часто.
        +5
        Если у пользователя стоит NoScript и гугл-аналитика забанена повально — то не будете. Только вот я сомневаюсь что есть «NoScript» для iOS, ЕВПОЧЯ.
          –1
          Логично. Но мне кажется это тоже достаточно очевидный факт…
            +3
            Зато есть куча альтернативных клиентов, или вы можете сами написать, API открыто
              0
              Да, есть. А API, даже если бы было закрыто, легко реверсируется.
            +2
            Я не паникую. Просто неприятно и все. Ну и опять же если трафик лимитирован…
              +3
              Помните, момент такой был, когда вы устанавливали приложение:

              Разрешения для приложения:


              Принять

              Вот тут вы и продались им…
              (и так с большинством приложений, когда какой-нибудь «калькулятор» требует разрешить доступ к id, адресам, вызовам и прочему)
                +1
                (печально вздыхая) Да, помню.
                  0
                  Вы используете только те программы, которые не просят доступа к Интернету? Или Вы используете и те, которые просят, и Вам совсем неинтересно, для чего они его просят?
                +2
                Только представьте, за каждым вашим клинком следит почти каждый сайт. Вот прямо в данный момент вебвизор записывает ввод текста…
                  +7
                  Ghostery
                  +15
                  Подобные инструменты аналитики встроены в очень многие мобильные приложения — где-то это Google Analytics, где-то Flurry Analytics. Причем собирают они действительно очень много информации — все перемещения по экранам приложения, клики, события, ошибки, падения приложения, версию ОС, модель девайса и прочую активность пользователя. Именно благодаря таким штукам разработчики могут понять что в их приложении хорошо, а что плохо и когда возникают проблемы у пользователей.
                  Так что не вижу поводов для паники — точно такие же инструменты уже давно используются в вебе: Яндекс Метрика или тот же Google Analytics.
                    +2
                    Всё понимаю, не паникую. Просто как-то неприятно и всё. Одно дело крашрепорты, другое — сообщения о каждом движении. Хотя на сайтах давно так, да.
                      +5
                      Для этого разработчикам так сильно нужен Geolocation?
                        –3
                        А я не удивлюсь если такой заголовок просто по умолчанию отправляется самим API iOS, а разработчики Твиттера просто не стали это отключать для этих «экспериментов».
                          +1
                          Тогда это говорит только об уровне разработчиков.
                          +5
                          может быть, чтобы увидеть проблемы типа «50% пользователей на Каймановых островах закрывают приложение, щелкнув по полю «Username» в окне регистрации»
                            –1
                            Способов проще (айпи и т.д.) нет?
                            +2
                            При первом запуске твитера на iOS у пользователя спрашивают можно ли использовать геолокацию. Не помню, написано ли там для чего, но параноики просто должны были на этом этапе запретить геолокацию
                          +19
                          Та никто и не паникует. Просто парень провел анализ сетевой деятельности оф. приложения. Полезная информация, только и всего. Спасибо!
                            –4
                            А вы случаем пользу, с очевидностью не путаете? (=
                              +8
                              Ну если для Вас очевидно, что любое оф. приложение должно вести себя так, то мне нет!
                                –1
                                Я считаю, что такую информацию обязательно должно собирать и анализировать не только любое официальное приложение, но и вообще любое приложение, которое стремится к улучшению в отношении пользователя, к улучшению в плане юзабилити и понимания того, как себя пользователь ведет и что ему надо.

                                Это такая же очевидная вещь, как Google Analytics или Яндекс.Метрика на любом вменяемом сайте.

                                В конце концов, они собирают не секретную информацию, чтобы удивляться, как это было в приведенной в тексте статье о телевизорах LG.
                                  –1
                                  Лично я считаю, что в таком приложении обязана быть галка на отправку данных. Вот тогда это будет вменяемое приложение с очевидными вещами.
                                    –1
                                    Ага. А на сайтах давайте вешать «Включить Google Analytics?».
                            +38
                            Итак, за последние 10 минут Дмитрий Анатольевич Медведев переместился из кабинета в гостиную и обратно, но всё никак не решается отправить свой твит о состоянии дел в Сирии.
                              +4
                              Забавно. Когда написали про LG — все набежали с криками, а тут тишина, все нормально.
                              По-моему, обе ситуации совершенно нормальны, разве что если делаешь галочку с отключением слежения, то нужно было и реализовать это отключение.
                              Конечно печально что разработчиков не заботит срок жизни батареи (по поводу трафика в «развитых» странах не парятся — там обычно дешевый безлимит).
                                +2
                                По-моему там народ шумел что галочка «отключить» была мелкая и не работала. Тут в комментариях пишут что всё нормально, раз галки вообще нету. Некоторые пишу что тоже так делают в своих приложениях. Ну ок, пусть. Хотя мне все равно как-то не нравится.
                                  –1
                                  Ситуация несколько разная.

                                  Во-первых, как вы верно заметили, если галочка есть — должна отключать. Иначе это явный обман.

                                  Во-вторых, тут данные собираются те же, что и собирал бы сайт, грубо говоря. Твиттер приложение сообщает имена файлов, инфу о них, даже если ты их не открывал? Я так понял нет. Стандартный набор геотаргетинга и т.п. Вот если бы он телефонные контакты без спросу пересылал, или там что-то связанное с файлами, мирно лежащих на флешке и к твиттеру не относящимися — тогда да. А так…
                                    +2
                                    > Вот если бы он телефонные контакты без спросу пересылал, или там что-то связанное с файлами, мирно лежащих на флешке и к твиттеру не относящимися — тогда да.

                                    Вот тогда бы я реально паниковал, да :) А так скорее всего, как и написано в статье, «это какой-то нужный и полезный эксперимент по сбору моего user experience». Однако мне всё равно не очень приятно, поскольку в случае например скрипта на сайте рядовой пользователь как-то может с этим побороться (ну хотя бы попробовать), а тут HTTS, certificate pinning, закрытые исходники самого приложения, нет никакой галки «остановите это!»… т.е. шансов запретить приложению «ябедничать» на свои сервера для рядового пользователя почти что и нету. И это меня крайне огорчает.
                                      +14
                                      Давно мечтаю о том, что бы можно было установленному приложению выставлять галки «вот это разрешить, а это запретить».
                                        +1
                                        Если бы мог — поставил бы два плюса за это комментарий :)
                                          0
                                          Если я ничего не путаю, такая возможность где-то есть (может в какой-то из альтернативных прошивок или просто нужно какое-то приложение поставить) — об этом вроде бы недавно в Хакере писал j123m.
                                            0
                                            И? Даже при максимальной вообразимой гибкости такой настройки — запретить клиенту твиттера HTTPS на api.twitter.com?
                                              0
                                              Нет, конечно. Но с некоторыми другими приложениями это имеет смысл.
                                              0
                                              Firewall IP (jailbreak) Вам в помощь.
                                        +1
                                        «experiment_key»:«digits_iphone_signup_1337»,

                                        1337 — это они на что намекают?
                                          +1
                                          Скорее им нужно было поставить «experiment_key»:«digits_iphone_signup_1984»
                                          0
                                          А в настройках клиента нет какой-нибудь опции типа «отсылать разработчику статистику использования для улучшения качества приложения?» На многих андроид-приложениях такой пункт есть.
                                            +1
                                            Не нашел. Можно запретить доступ к Location Service, тогда заголовок Geolocation исчезнет из запросов. Все остальное останется.
                                            +1
                                            Вероятно, поля experiment_key, version и bucket содержат какую-то дополнительную информацию о том что и как я делаю

                                            Ещё более вероятно, что это следы A/B тестинга, что вобщем-то хорошо — люди стараются улучшить клиент.

                                              0
                                              В статье я не исключаю что «это какой-то нужный и полезный эксперимент по сбору моего user experience». Но тогда получается что все пользователи Twitter — одна большая группа подопытных. Конечно это всё с благой целью, но мне всё равно как-то не очень.
                                                +1
                                                На что все они дали свое согласие. А несогласные пользуются альтернативными клиентами.
                                                  0
                                                  Согласен. Речь и не идет о чем-то незаконном. Да, по факту 99% из пользователей не читало никаких предупреждений/соглашений. Но формально они все сами дали согласие так что придраться тут не к чему — все в рамках.
                                              +1
                                              андроид версия сабжа за последние две недели обновилась раз пять, наверное. В одном из обновлений сабж попросил (ну как попросил, уведомил) доступ к смс. Зачем? Не знаю.
                                                +1
                                                Доступ к SMS нужен для какой-нибудь маленькой глубоко закопанной фичи на подобии «поделиться через SMS». Та же проблема с разрешением на интернет у каждого второго приложения (какой-нибудь калькулятор или фонарик) — без него ни краш-репорт не отправить, ни рекламу не отобразить, ни обновления проверить.
                                                +1
                                                Было бы прекрасно если бы эти прекрасные модули слежения дожидались вайфая и сливали все накопленное одним батчем.
                                                  +1
                                                  «Короткая беседа — куда, когда, зачем сумочка… Сразу у дверей, чтоб потом не беспокоить. И ключик на доску!» ©
                                                    0
                                                    Было бы, но почему то ни у Google Analytics, ни у Flurry нет такой возможности.
                                                    0
                                                    Поздравляю, вы только что, открыли a/b тестинг.
                                                      0
                                                      Про A/B тестинг уже был тред выше в комментах :)

                                                    Only users with full accounts can post comments. Log in, please.