Методичка Минцифры по выявлению VPN

Я бы рассматривал ещё как вариант, просто сказать им держать туннель 24/7 – у меня те кто пользуются моим туннелем так и делают. А настроил я по этой схеме.

В долгосрочной перспективе, возможно может потребоваться резидентская нода (выход) или пускать трафик для приложений кто заблокировал warp в direct (должен быть per-app split).

Пока – должно работать с warp выходом (для большинства сайтов). От шпионов, самое главное, защищает. Пожилым людям делать, – ничего не надо.

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

В недавней статье с разбором шпионской метрики, встроенной в Max, было выявлено что он, помимо прочего, пытается определять доступность main.telegram.org. На уровне изолированного приложения с настроенным split tunneling такая проверка не страшна, но в будущем такие же метрики наверняка будут встроены в веб-приложения российских сервисов.

Split tunneling от такой атаки не поможет. В этой схеме вы обращаетесь на, допустим, скомпрометированный ozon.ru со своего домашнего ip адреса (если разделение туннелей происходит на вашем марштрутизаторе) или ip адреса вашего российского vps (входной ноды вашего multi-hop прокси, на которой происходит разделение), после чего скомпрометированный сайт проверяет доступность “запрещённого” сервиса, запустив вредоносный код в вашем браузере. Таким образом, вы даёте скомпрометированному ресурсу узнать ваш российский ip (так или иначе привязанный к личности) и факт, что из вашего браузера доступны “запрещённые” ресурсы.

В современных браузерах существуют способы, позволяющие веб-приложению определить доступность удалённого ресурса в обход CORS. Вот минимальный сниппет, определяющий доступность телеграм из вашего браузера. Полагаю, подобные метрики будут в скором будущем внедрены на скомпрометированных веб-сайтах.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Telegram availability check</title>
</head>
  <body>
    <button id="check">Check telegram availability</button>
    <div id="result"></div>
    <script>
    function checkSiteAvailability(url, timeout = 5000) {
      return new Promise((resolve) => {
        const img = new Image();
        let resolved = false;
        const startTime = Date.now();

        const timeoutId = setTimeout(() => {
          if (!resolved) {
            resolved = true;
            resolve({
              available: false,
              error: 'Timeout'
            });
          }
        }, timeout);

        img.onload = () => {
          if (!resolved) {
            resolved = true;
            clearTimeout(timeoutId);
            resolve({
              available: true
            });
          }
        };

        img.onerror = () => {
          if (!resolved) {
            resolved = true;
            clearTimeout(timeoutId);
            resolve({
              available: false,
              error: 'Failed to load'
            });
          }
        };

        let cleanUrl = url.replace(/\/$/, '');
        img.src = `${cleanUrl}/favicon.ico?nocache=${Date.now()}`;
      });
    }

    async function checkTelegramAvailability() {
      const resultDiv = document.getElementById('result');

      const url = "https://web.telegram.org";

      resultDiv.innerHTML = `Trying ${url}...`;

      const result = await checkSiteAvailability(url);

      if (result.available) {
        resultDiv.innerHTML = `${url} is available. Are you using a proxy?`;
      } else {
        resultDiv.innerHTML = `${url} is not available. Error: ${result.error || "Unexpected"}`;
      }
    }

    document.getElementById('check').addEventListener('click', checkTelegramAvailability);
    </script>
</html>

Чтобы поиграться с примером локально, сохраните сниппет в index.html и запустите веб-сервер в той же директории, например python3 -m http.server 8080. Или просто откройте файл в браузере.

Факт доступности запрещённого ресурса с устройства пользователя сам собой не доказывает факта использования средств обхода блокировок, но, учитывая комплесный подход к определению недоброжелательных пользователей в методичке Минцифры, может быть учтён в дополнение к другим косвенным доказательствам использования средств обхода.

Насколько я вижу, единственный способ избежать такой атаки - это использование двух браузеров, одного тунеллированного напрямую, а другого через удалённый прокси, даже на десктопе. Трафик до российских сервисов для второго браузера должен быть закрыт (например, с помощью blackhole outbound в xray или blocked в sing-box), чтобы предотвратить случайный клик по ссылке на скомпрометированный сайт в проксированном браузере.

Пока нашел для себя самое банальное наколенное решение - поставить для госприложений режим “isolated“ в Rethink и руками разрешить им домены/ip которые им надо, чтобы работать. По крайней мере будет видно, когда они полезут не туда, куда раньше ходили…

P.S. .. и они туда не попадут

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

То есть я держу локальный сокс5, а нужные домены направляю в браузере правилами в Switchy Omega.

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

Так?

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

Так зачем разрешать доступ к телеграм из браузера? Нужны дополнительные правила со связкой приложение плюс домены и ip. К телеграму доступ только из телеграма.

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

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

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

Всякое шпионское (метрики и т.п.) по идее уже есть в списках адблоков.

Возможно здесь имеются ввиду смартфоны, на которых сложно делать маршрутизацию гибко. Поэтому делают per-app (даже на iOS).

На ПК да, лучше sing-box и либо только заблокированное (с учётом всех геоблоков), либо вообще всё и решать маршрутизацию на впс (включая блок ру-сервисов, если надо).

Со смартфоном совсем жопная ситуация.

Играть в обновляемые списки - не угонишься. Скорее рано, чем поздно, подсунут проверочный домен в забугорье, который улетит в туннель по правилу.

Пока вижу два варианта:

  1. Радикальный - отдельный скрепофон

  2. локальный запароленный сокс5, но ограниченный набор ПО, которое нативно умеет к нему подключаться (телега, фф+switchy omega). Скрепософт в отдельное пространство, что бы имена пакетов не палил.

Это проще сказать чем сделать. В каждом из них может быть полно необходимых скриптов с других доменов, и скрипты все время новые. Надо работать в IT, чтобы уметь такое самостоятельно посмотреть. Или нужна постоянно пополняющаяся база таких доменов, чтобы ВПН мог автоматически их оттуда скачивать. Типа адблок но наоборот. С обновляемыми списками тоже проблема - рано или поздно один из доменов разделегируется и его перехватят, это конечно паранойя но в будущем вполне реально. Пока что думаю на впн-браузере достаточно блокировать 100-200 основных и служебных доменов известных российских сервисов. И не лазить даже ради прикола на скрепно-патриотические сайты, которые могут добровольно заняться активизмом.

что бы имена пакетов не палил.

Пакеты можно собрать самому со своими названиями.

Сценарий socks5+switchy omega нивелирует это?

Всё верно (включая форк Zero Omega) при указании пачки доменов, роутинг пойдет строго на них, а остальные добавляются строго вручную (при нажатии на кнопку “Add condition”).

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

На десктопе это вообще ультимативный беспалевный вариант (пока не вынудят ставить какое-нибудь ПО под предлогом безопасного доступа на ресурсы). На смартфоне не очень удобный, но пригодный. Цензоры будут видеть факт наличия прокси (должен быть запаролен), но не более.

В лисе есть контейнеры и расширение, которое позволяет ассоциировать прокси с контейнерами. Давно пользуюсь. Если этого будет недостаточно то виртуалка с отдельным браузером. На андроидах, все шпионские приложение либо под снос либо в изоляцию (shelter). Смысл изоляции в гарантированном замораживании активности всех подозрительныз приложений разом по одной кнопке, а не в самой дырявой излялции, хотя скрывать контакты, файлы и список установленного тоже полезно. Если нужно все одновременно то два телефона выглядит проще.

В Хроме - тоже несколько профилей пользователей можно, у каждого свой набор настроек и расширений, использую тоже + некоторые домены на основном “белом” у себя заворачиваю в прокси, чтобы быстрее грузились

Потому что носить 2-й телефон проще, хоть и дороже. А большинству в целом и наплевать.

22 из 30 самых популярных в России приложений для Android
от российских компаний детектируют VPN, а 19 их них также отправляют эту
информацию на свои серверы. К таким выводам пришли в своем исследовании эксперты проекта RKS Global. Согласно их данным, за тем, включен ли у пользователя VPN, следят следующие приложения: Яндекс Браузер, Яндекс Карты, «ВКонтакте», Мой МТС, Сбербанк
Онлайн, Т-Банк, VK Видео, Wildberries, «Кинопоиск», Ozon, «Самокат»,
RuStore, ВТБ Онлайн, Yandex Music, Avito, Альфа-Банк, 2ГИС, MegaMarket,
«Одноклассники», MAX, Rutube, VK Music. Приложения «Самокат» и MegaMarket не только выясняют, включен ли VPN, но
и получают список всех VPN-сервисов, какие только установлены
на устройстве. Максимальное число методов VPN-детекции (4 из 6)
используют Яндекс Браузер и Яндекс Карты. Яндекс Браузер, помимо
прочего, ищет на устройстве Tor. Как и зачем российские приложения ищут на телефонах пользователей VPN?

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