TunnelBear внедряет ESNI


В течение последних нескольких месяцев TunnelBear были заняты внедрением поддержки расширения стандарта ESNI (Encrypted Server Name Indicator) протокола TLS в нашем Android-приложении. Ниже мы расскажем, почему расширение ESNI является важным компонентом конфиденциальности в сети интернет в будущем, как мы встроили его в наше приложение под Android, а также как оно помогает нашим пользователям, испытывающим проблемы из-за блокировок, получить доступ к открытому интернету.

Новый рубеж в области конфиденциальности в интернете
Для начала давайте разберёмся, что происходит, когда вы нажимаете кнопку Connect в VPN-клиенте TunnelBear.

Чтобы установить VPN-соединение с одним из наших VPN-серверов, ваш клиент TunnelBear должен знать IP-адрес соответствующего VPN-сервера. Чтобы узнать, к какому серверу он должен подключиться, клиент посылает HTTPS-запрос на api.tunnelbear.com, запрашивая список серверов и их IP-адреса. В большинстве случаев всё работает отлично. Но что происходит, если api.tunnelbear.com попал в список заблокированных в вашей сети адресов?
Большинство режимов интернет-цензуры носят целевой характер, то есть призваны блокировать только определенный контент, обеспечивая при этом доступ к так называемому приемлемому контенту. Чтобы система такого типа работала, она должна быть в состоянии определить, какой контент содержится в онлайн-запросе, что стало намного сложнее, поскольку всё больше и больше интернет-трафика шифруется с использованием протокола TLS. При использовании протокола TLS 1.3 все содержимое и бо́льшая часть метаданных каждого запроса шифруются, но некоторые поля остаются незашифрованными. Эти незашифрованные поля могут быть прочитаны цензором и затем использованы для обоснования блокировки соответствующего запроса. Одним из таких незашифрованных полей, как правило, используемых для блокировки, является расширение индикатора имени сервера (Server Name Indicator — SNI).
Что такое SNI и зачем он нужен, если его можно использовать для облегчения цензуры? Отвечаем. Многие веб-сайты и сервисы в интернете сегодня размещаются в общей среде, например, CloudFlare. Вместо того, чтобы присваивать каждому серверу отдельный публичный IP-адрес, для доступа к серверам используют меньшее количество общих IP-адресов, принадлежащих CloudFlare, которые затем перенаправляют запросы через свою сеть на соответствующий сервер. Иными словами, SNI позволяет одному серверу размещать несколько веб-сайтов по HTTPS-протоколу. При этом поле SNI не шифруется и, следовательно, позволяет цензорам отслеживать вашу историю онлайн-запросов.


Целью ESNI, или Encrypted SNI, является предоставление средства шифрования поля SNI таким образом, чтобы оно не могло быть прочитано цензором или другой третьей стороной, но всё же при этом могло быть использовано для облегчения совместного хостинга

Как мы это сделали
Мы понимали, что внедрение ESNI будет масштабным проектом, поэтому решили сначала проверить возможности его развёртывания в рамках небольшого теста и так оценить его эффективность. Наш эксперимент состоял в отправке трёх тестовых запросов от нашего Android-приложения при каждом запуске: стандартного API-запроса без применения методов обхода цензуры, запроса с использованием существующих методов обхода цензуры и запроса с использованием ESNI.
Для выполнения запросов ESNI мы использовали ветвление OpenSSL, разработанное проектом DEfO (Developing ESNI for OpenSSL — «Разработка ESNI под OpenSSL»). Для каждого набора тестовых запросов нами был сгенерирован уникальный идентификатор, чтобы наглядно увидеть, какие из них из каждого набора успешно прошли к нашим серверам. Затем мы сравнили, насколько эффективен каждый из применённых нами методов. Эксперимент оказался успешным и продемонстрировал нам, что для значительной части пользователей ESNI может обеспечить более надёжный доступ к нашему API.
В ходе испытания также были выявлены некоторые проблемы с совместимостью устройств с использованием ветвления OpenSSL от DEfO, так как на некоторых устройствах нами регистрировалось увеличение частоты отказов. Как только мы определили, что ESNI может помочь в наших усилиях по борьбе с цензурой, мы удалили тестовый код, чтобы пользователи не заметили никаких затруднений.
Имея под рукой проверенную на практике концепцию, мы перешли к следующему этапу — обеспечению поддержки ESNI для каждого сетевого запроса в приложении. ESNI всё ещё находится на ранней стадии развития, и рабочая группа Internet Engineering Task Force (IETF) ещё не завершила работу над его спецификацией, поэтому очень немногие сетевые библиотеки поддерживают этот стандарт. В браузере от Mozilla реализована его поддержка в библиотеке сервисов сетевой безопасности NSS (Network Security Services), но поскольку NSS имеет дело только с низкоуровневыми сетевыми протоколами, нам пришлось бы поверх неё создать отдельную HTTP-библиотеку для использования её возможностей в нашем приложении. Вместо этого мы решили рассмотреть возможности обновления нашей текущей HTTP-библиотеки, OkHttp, для поддержки ESNI-запросов. OkHttp работает с несколькими провайдерами безопасности, и после оценки вариантов мы решили модифицировать библиотеки Google Conscrypt и BoringSSL для добавления возможностей поддержки ESNI.
Мы сделали изменения с открытым исходным кодом и надеемся, что они будут приняты в обеих библиотеках, чтобы другим разработчикам было проще начать пользоваться ESNI.

Почему важно широкомасштабное внедрение
Для того чтобы ESNI был эффективным, он нуждается в широкомасштабном внедрении. Несмотря на то, что цензор не может увидеть, к какому сайту вы подключаетесь с включённым ESNI, он всё же может сказать, что вы пользуетесь зашифрованным полем SNI. Если TunnelBear и другие антицензурные инструменты являются единственными приложениями, использующими ESNI, цензору довольно легко предположить, что любой трафик, использующий ESNI, пытается обойти его блокировку и, следовательно, должен быть заблокирован.
К сожалению, именно это и произошло на материковой части Китая, где цензоры активно блокируют трафик ESNI, что ещё больше увеличивает необходимость широкого внедрения этого стандарта в других странах.
Для того, чтобы это работало в крупных масштабах, большая часть интернет-трафика должна использовать ESNI, чтобы трафик TunnelBear, так сказать, смешался с толпой. Ситуация обстоит почти так же, как и сразу после появления HTTPS: тогда многие сети, которые хотели считывать ваш трафик, просто блокировали HTTPS. Сегодня это становится всё менее и менее практичным по мере того, как с увеличением объёмов применения HTTPS из-за блокировки этого протокола всё большее число популярных сайтов оказываются вдруг недоступны пользователям. Чтобы помочь другим приложениям легко добавлять поддержку ESNI, мы опубликовали результат нашей работы с открытым исходным кодом, что позволяет добавить поддержку ESNI к OkHttp.
Вы также можете помочь ускорить внедрение, включив ESNI в Firefox (см. инструкции здесь). Чем больше пользователей регулярно используют ESNI, тем эффективнее он будет бороться с цензурой, способствуя построению демократичного интернета для всех. Мы надеемся, что добавив поддержку ESNI в BoringSSL, мы также сможем ускорить добавление ESNI в Chromium.

Что это значит для пользователей, сетевые коммуникации которых подвергаются цензуре
Сам по себе ESNI не предотвратит всю цензуру, но зато облегчит пользователям, испытывающим на себе последствия цензуры, подключение к сервису TunnelBear. В ходе проведенного нами тестирования мы обнаружили, что результаты варьируются в зависимости от провайдера, но использование ESNI, как правило, примерно соответствует или чуть менее эффективно по сравнению с существующими методами уклонения от цензуры. Тем не менее, более важным выводом является то, что примерно для 25% подвергнутых цензуре пользователей ESNI работает, в то время как другие наши антицензурные методы — нет.

Важно отметить, что не существует единого инструмента, который мог бы позволить полностью уйти от цензуры, но мы полагаем, что, грамотно сочетая различные инструменты в зависимости от ситуации, мы можем максимально приблизиться к практически полной победе над блокировками. ESNI даёт нам еще один эффективный инструмент, который мы можем использовать для победы над интернет-цензурой.
О TunnelBear
TunnelBear — это простое и удобное приложение для работы с VPN (virtual private network — «виртуальная частная сеть»), которое позволяет безопасно и конфиденциально просматривать веб-страницы. TunnelBear защищает данные о просмотренных сайтах от хакеров, интернет-провайдеров и любых попыток отслеживать сетевую активность пользователя. Компания считает, что у каждого должен быть доступ к открытому интернету без цензуры и ограничений, где бы пользователь ни находился.