Apple и Google отслеживают все ваши Push-уведомления. Но Tuta защищает вас от этого с 2017 года.

Мы здесь для того, чтобы остановить слежку со стороны таких корпораций, как Google и Apple. Именно поэтому мы заменили FCM от Google на собственную систему уведомлений и свели к минимуму данные уведомлений Apple. Читайте дальше, чтобы узнать, почему это важно.

Когда мы переделывали клиент Tuta в 2017 году, мы строго придерживались нашей миссии - освободить всех от принудительного использования сервисов Google. Новые данные показывают, что это был отличный ход, поскольку Google и Apple контролируют все ваши push-уведомления. Именно поэтому мы также публикуем наше приложение для Android на F-Droid, делая его одним из немногих приложений для электронной почты, доступных без службы push-уведомлений Google. Это был настоящий вызов, поэтому давайте объясним, как нам это удалось.


Предоставление возможности всем желающим покинуть Gmail

Наша цель в Tuta - дать всем возможность перейти на безопасный почтовый сервис, который уважает ваши данные и ваше право на конфиденциальность. Для нас очень важно, чтобы каждый мог полностью отказаться от Gmail.

Поэтому избавление от сервисов push-уведомлений Google было нашим главным приоритетом при создании безопасного почтового приложения с нуля. Мы очень рады, что нам удалось заменить GCM Google на push, так что приложение Tuta не имеет никакой связи с Google. Это защищает вас от массивной экосистемы Google по отслеживанию рекламы, а также от правительственного шпионажа без разрешения.

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

Apple и Google отслеживают все ваши Push-уведомления

7 декабря 2023 года агентство Reuters опубликовало потрясающие разоблачения, свидетельствующие о том, что правительства по всему миру шпионят за пользователями Apple и Google, отслеживая push-уведомления, которые приходят на их устройства. Впервые об этой альтернативной форме слежки стало известно после публикации открытого письма, направленного сенатором США Роном Уайденом в Министерство юстиции США.

Эти уведомления позволяют спецслужбам и правоохранительным органам связывать уже собранные метаданные с аккаунтами Google или Apple.

Tuta уже много лет назад знала об этом потенциальном риске, и в 2017 году мы полностью заменили службу уведомлений Google на собственную службу push-уведомлений. Если вы используете Tuta на Android, данные push-уведомлений не передаются Google. С нами ваша конфиденциальность в безопасности.

Мы также поддерживаем установку приложения Tuta на устройства Android через F-Droid, что позволяет использовать программу, не сообщая Google о том, что вы ее используете. При установке Tuta через F-Droid ваши push-уведомления также не будут подвержены такой форме сбора данных и слежки.

На устройствах Apple мы еще не представили свой собственный сервис push-уведомлений, но это планируется сделать в будущем. В настоящее время все push-уведомления на устройствах iOS отображают только минимальную информацию, информируя вас о том, что пришло новое письмо, чтобы ограничить возможный объем данных, которые могут быть собраны при попытках правительственной слежки.

Как мы заменили GCM

GCM (или, как он называется сейчас, FCM, Firebase Cloud Messaging) - это сервис, принадлежащий Google. Мы в Tuta использовали FCM для нашего старого приложения для Android. К сожалению, FCM включает в себя код отслеживания Google для аналитики, который мы не хотели иметь в нашем защищенном приложении.

И, что еще более важно: Чтобы иметь возможность использовать FCM, вы должны отправлять все свои данные уведомлений в Google. Кроме того, вам придется использовать их собственные библиотеки. Из-за соображений конфиденциальности и безопасности, которые, естественно, связаны с этим, мы не отправляли никакой информации вместе с уведомлениями в старом приложении (что, понятно, вызвало жалобы наших пользователей). Поэтому в старом приложении push-уведомление говорило только о том, что вы получили новое сообщение, без каких-либо ссылок на само письмо или на почтовый ящик, в который оно было помещено.

FCM довольно удобен в использовании, с течением времени Google внесла изменения в Android, которые усложнили отказ от использования их сервиса для уведомлений. С другой стороны, отказ от службы уведомлений Google избавил бы нас от необходимости устанавливать на телефоны пользователей сервисы Google Play.

Задача заменить Google FCM

Приложения Tuta - это Libre-программное обеспечение, и мы хотим предоставить настоящую альтернативу Gmail с открытым исходным кодом, что для нас включает в себя публикацию нашего приложения для Android на F-Droid. Мы хотели, чтобы наши пользователи могли использовать Tuta на любом ROM и любом устройстве, без вмешательства сторонних сервисов, таких как Google.

Мы решили принять вызов и создать свой собственный сервис push-уведомлений.

Когда мы начали разрабатывать нашу систему push-уведомлений, мы преследовали несколько целей:

  • она должна быть безопасной
  • должна быть быстрой
  • она должна быть энергоэффективной.

Мы изучили, как другие компании (Signal, Wire, Conversations, Riot, Facebook, Mastodon) решают подобные проблемы. У нас было несколько вариантов, включая WebSockets, MQTT, Server Sent Events и HTTP/2 Server Push.

Замена FCM на SSE

Мы остановились на SSE (Server Sent Events), потому что это казалось простым решением. Под этим я подразумеваю “простое в реализации, простое в отладке”. Отладка такого рода вещей может стать серьезной головной болью, поэтому не стоит недооценивать этот фактор. Еще одним аргументом в пользу SSE была относительная энергоэффективность: Нам не нужны были восходящие сообщения, и постоянное соединение с сервером не было нашей целью.

Итак, что же такое SSE?

SSE - это веб-интерфейс, который позволяет серверу отправлять события подключенным клиентам. Это относительно старый API, который, на мой взгляд, недостаточно используется. Я никогда не слышал о SSE, пока не познакомился с федеративной сетью Mastodon: Они используют SSE для обновления временной шкалы в реальном времени, и это отлично работает.

Сам протокол очень прост и напоминает старый добрый опрос: Клиент открывает соединение, а сервер держит его открытым. Отличие от классического опроса в том, что мы держим это соединение открытым для нескольких событий. Сервер может посылать события и сообщения с данными; они просто отделяются друг от друга новыми строками. Поэтому единственное, что нужно сделать клиенту, - это открыть соединение с большим таймаутом и прочитать поток в цикле.

SSE подходит для наших нужд лучше, чем WebSocket (он дешевле и быстрее сходится, поскольку не является дуплексным). Мы видели множество приложений для чатов, которые пытались использовать WebSocket для push-уведомлений, и это не казалось энергоэффективным.

У нас уже был опыт работы с WebSocket, и мы знали, что брандмауэры не любят keepalive-соединения. Чтобы решить эту проблему, мы использовали тот же обходной путь для SSE, что и для WebSocket: Мы отправляем пустые сообщения “heartbeat” каждые несколько минут. Мы сделали этот интервал регулируемым со стороны сервера и случайным, чтобы не перегружать сервер.

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

Следует отметить, что приложение Tuta поддерживает несколько аккаунтов, и это создало для нас проблему: Мы хотели, чтобы на каждом устройстве было открыто только одно соединение. После нескольких итераций мы нашли дизайн, который нас удовлетворил. Каждое устройство имеет только один идентификатор. При открытии соединения клиент отправляет список пользователей, для которых он хочет получать уведомления. Сервер проверяет этот список на соответствие записям пользователей и отсеивает недействительные.

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

Для получения уведомлений мы используем возможности Android. Мы запустили фоновую службу, которая держит соединение с сервером открытым, аналогично тому, как это делает процесс FCM. Еще одна сложность была вызвана режимом Doze, появившимся в Android M. Doze, который включается после периода бездействия, помимо прочего, не позволяет фоновым процессам получить доступ к сети. Как вы понимаете, это мешает нашему приложению получать уведомления.

Мы решили эту проблему, попросив пользователей сделать исключение из оптимизации батареи для нашего приложения. Это работает довольно хорошо. Похожая проблема, но не связанная с Doze, - это оптимизация батареи, выполняемая конкретным производителем. Чтобы продлить время автономной работы своих устройств, производители телефонов, например Xiaomi, по умолчанию включают строгую оптимизацию батареи. К счастью, пользователи могут отключить их, но мы должны лучше об этом рассказать.

Еще одна проблема была вызвана изменениями в Android O. Одно из них - ограничение фоновых процессов: Если ваше приложение не видно пользователю, фоновые процессы будут остановлены, и вы не сможете запустить новые.

Изначально мы думали, что решить эту проблему можно, показывая постоянное уведомление с минимальным приоритетом, которое видно в желобе уведомлений, но не в строке состояния. В Oreo это не сработало: Если вы попытаетесь запустить фоновую службу и использовать для ее уведомления минимальный приоритет, приоритет уведомления повышается до более высокого (видимого все время), и в дополнение к этому система показывает еще одно постоянное уведомление: “Приложение X расходует заряд батареи”.

Изначально мы планировали объяснить пользователям, как они могут скрыть эти постоянные уведомления, но это было не очень удобно для пользователей, поэтому нам пришлось искать лучшее решение. Мы воспользовались механизмом Android Job, чтобы периодически запускать наш сервис (по крайней мере, каждые 15 минут), а также стараемся поддерживать его в рабочем состоянии после этого. Мы не ставим WakeLocks вручную - система делает это за нас. Мы смогли полностью отказаться от постоянных уведомлений. Даже если уведомления иногда приходят с небольшой задержкой, они всегда будут получены, а электронные письма будут приходить мгновенно.

В итоге нам пришлось немного потрудиться, но это того стоило. Мы освободили наших пользователей от требования Google Play Services. Наконец-то каждый может получить приложение Tuta на F-Droid. Теперь система сочетает в себе и энергоэффективность, и скорость.

Заключительная мысль: Каждый пользователь должен иметь возможность выбрать “Поставщика уведомлений” для каждого приложения.

Разве не было бы здорово, если бы пользователь мог просто выбрать “поставщика push-уведомлений” в настройках телефона, а ОС сама бы управляла всеми этими сложными деталями? Таким образом, каждому приложению, которое не хочет, чтобы его контролировал владелец платформы, не нужно было бы изобретать систему заново? Она может быть зашифрована из конца в конец между приложением и сервером приложений. В этом нет никакой технической сложности, но пока наши системы контролируются крупными игроками, которые этого не позволяют, мы должны решать эту проблему сами.

Для свободного и открытого интернета нам нужно перестать отдавать все наши частные данные крупным корпорациям. Вот почему мы говорим: #NoMoreGoogle