Часто приходиться слышать о том, что крупные корпорации вроде Google, Facebook или LG следят за каждым пуком несчастных пользователей. И исследовав некоторое из их software, я должен признать что таки да — они следят.
Вчера я исследовал самый свежий (на момент написания этой статьи) официальный iOS-клиент Twitter версии 5.13.1. Мне, кроме всего прочего, было интересно посмотреть на трафик между клиентом и сервером. Поскольку клиент Twitter использует certificate pinning, его трафик довольно трудно перехватить с помощью Fiddler2 и подобных программ. Поэтому я написал
И знаете что я увидел? Клиент Twitter, кроме своих обычных запросов (регистрация пользователя, авторизация, твит и т.п.) часто… нет, не так… очень часто отсылал на сервер POST запросы на некий загадочный URL
Типичный запрос на

Посмотрев пару десятков таких запросов, я примерно понял общую структуру:
Конечно самое интересное тут было в JSON в теле запроса. Во всех запросах это был массив элементов следующего вида:
Например, когда я нажимал кнопку «Sign in» (ещё не логинился, просто кпопку жмакал), на сервер уходил запрос с примерно таким JSON:
Я смотрел другие запросы (их было много, да), и похоже что поля
Вероятно, поля
Вот собственно и всё. В конце статьи надо бы что-то сказать такое умное, но в четыре часа ночи в голову ничего не приходит. Разве что мне не нравится как Twitter через своё приложение следит почти что за каждым моим движением и знает в подробностях что, когда и (учитывая заголовок
А ещё мне не нравится что это приложение своими бесконечными «шпионскими» запросами сжирает мой драгоценный (в буквальном смысле) GPRS трафик. Хорошо я хоть не в роуминге, а то с этими Twitter'овскими экспериментами за пару дней без штанов можно остаться… ладно, чего-то я разбурчался: «не нравится, не нравится...» Пойду спать наверное.
Всем хорошей пятницы :)
P.S. Извините если заголовок кому-то показался желтоватыми. Всем спасибо за мнения в комментариях, получается интересное обсуждение. На данный момент точки зрения комментирующих разделились: кому-то не нравится такой дотошный и детальный трекинг со стороны официального клиента Twitter. Другие говорят что мол ничего страшного, сайты например давным давно собирают статистику действий пользователя, да и приложения уже тоже. Мммм… я даже не знаю. В случае с сайтами у пользователя есть хотя бы теоретическая возможность побороться за свою приватность (с помощью того же Ghostery например). А у приложений из App Store закрытые исходники, HTTPs, у некоторых certificate pinning и нет галочки «не следи за мной». Получается что шансов предотвратить сбор статистики о действиях рядового пользователя у этого самого рядового пользователя почти никаких. Хотя может действительно ничего страшного, просто это я уже старый и отстал от жизни, и надо бы привыкать к дивному новому миру. Но все-таки надеюсь что нет.
Вчера я исследовал самый свежий (на момент написания этой статьи) официальный 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 и нет галочки «не следи за мной». Получается что шансов предотвратить сбор статистики о действиях рядового пользователя у этого самого рядового пользователя почти никаких. Хотя может действительно ничего страшного, просто это я уже старый и отстал от жизни, и надо бы привыкать к дивному новому миру. Но все-таки надеюсь что нет.