Отпечатки

Обнаружение протоколов: детекция установленных приложений

Как обработчики URL-протоколов вроде mailto: и slack: раскрывают установленные приложения для снятия отпечатков и как контролировать ответы на протоколы.

Документация

Нужна структурированная документация по теме Отпечатки?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

Введение

Операционные системы позволяют приложениям регистрировать пользовательские URL-схемы, также называемые обработчиками протоколов. Когда приложение вроде Slack, VS Code, Zoom или Steam установлено, оно регистрирует протокол (например, slack://, vscode://, zoommtg:// или steam://), позволяющий другим приложениям и веб-сайтам запускать его непосредственно через URL. Эта система обеспечивает глубокие ссылки, позволяя веб-сайту открыть конкретный вид приложения, присоединиться к встрече или запустить игру через простой клик по ссылке.

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

Влияние на конфиденциальность

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

Последствия для конфиденциальности значительны:

  • Инвентаризация ПО: тестируя распространенные обработчики протоколов (Spotify, Discord, Telegram, WhatsApp, Steam, Epic Games, Zoom, Teams, VS Code, Sublime Text и десятки других), веб-сайт может определить, какие приложения установлены.
  • Профилирование поведения: установленные приложения раскрывают интересы, профессию и паттерны поведения. Разработчик с vscode://, iterm2:// и docker:// представляет другой профиль, чем геймер с steam://, epicgames:// и discord://.
  • Уникальность устройства: конкретная комбинация установленных приложений весьма уникальна. Даже среди устройств с идентичным оборудованием набор установленного ПО драматически различается между пользователями.
  • Кроссбраузерное отслеживание: обработчики протоколов регистрируются на уровне ОС, а не браузера. Это означает, что один и тот же программный отпечаток сохраняется во всех браузерах на устройстве, позволяя кроссбраузерное отслеживание.

Знаковое исследование 2021 года от FingerprintJS продемонстрировало, что снятие отпечатков на основе протоколов может тестировать 32 популярных приложения за секунды, производя отпечаток, уникально идентифицирующий 95% тестовых субъектов. Техника работала в Chrome, Firefox, Edge и других браузерах. Исследование побудило производителей браузеров начать реализацию защитных мер, но фундаментальная уязвимость сохраняется во многих сценариях.

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

Техническая основа

Как работает обнаружение протоколов

Обнаружение протоколов использует поведение браузера при навигации к URL с неизвестной или зарегистрированной пользовательской схемой. Было разработано несколько техник:

Метод навигации iframe: веб-сайт создает скрытый iframe и устанавливает его src на URL пользовательского протокола (например, slack://open). Если Slack установлен, браузер пытается обработать навигацию. Если нет, iframe получает ошибку. Тайминг и поведение этого ответа различаются в зависимости от наличия обработчика.

Метод всплывающего окна: открытие window.open() с URL пользовательского протокола производит разное поведение в зависимости от регистрации обработчика. В некоторых браузерах всплывающее окно поглощается обработчиком приложения. В других оно остается как пустое окно.

Обнаружение фокуса/размытия: когда обработчик протокола запускает внешнее приложение, окно браузера теряет фокус. Отслеживая события blur и focus, веб-сайт может определить, было ли приложение успешно запущено.

Обнаружение на основе таймингов: время, затраченное браузером на обработку протокольной навигации, различается в зависимости от наличия обработчика. Установленные обработчики производят более быстрый или более медленный ответ (в зависимости от браузера), чем незарегистрированные протоколы, и эта разница в таймингах измерима.

Поведение, специфичное для браузера

Разные браузеры по-разному обрабатывают неизвестные протоколы:

  • Chrome: показывает диалог с вопросом, хочет ли пользователь открыть приложение (для известных обработчиков) или ничего не делает / показывает минимальную ошибку (для неизвестных протоколов). Наличие и поведение диалога обнаруживается программно.
  • Firefox: показывает собственный диалог обработчика для зарегистрированных протоколов и страницу ошибки для незарегистрированных. Поведение навигации раскрывает регистрацию обработчика.
  • Safari: реализовал защитные меры, ограничивающие зондирование протоколов, но обнаружение на основе таймингов все еще работает в некоторых сценариях.
  • Edge: поведение, аналогичное Chrome (на базе Chromium), с дополнительными запросами по протоколам.

Распространенные подходы к защите и их ограничения

VPN и прокси-серверы

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

Инкогнито и приватный просмотр

Режимы приватного просмотра не изменяют регистрацию обработчиков протоколов. Те же приложения установлены в инкогнито, как и в обычном окне, потому что обработчики протоколов регистрируются на уровне ОС, а не в профиле браузера.

Расширения браузера

Расширения могут попытаться перехватить протокольную навигацию:

  • Блокировка навигации iframe: расширение может блокировать все навигации по пользовательским протоколам в iframe, но это нарушает легитимные глубокие ссылки и легко обнаруживается, потому что само поведение блокировки наблюдаемо.
  • Нормализация таймингов: расширения могут добавлять задержки ко всем протокольным навигациям для нормализации таймингов, но накладные расходы перехвата расширения сами обнаруживаемы, и задержка должна быть тщательно откалибрована, чтобы не нарушить легитимные протокольные ссылки.

Защитные меры браузеров

Современные браузеры реализовали некоторые защиты:

  • Chrome добавил ограничение частоты для проверок обработчиков протоколов
  • Safari реализовал более строгие политики одного происхождения для протокольной навигации
  • Firefox добавил требования жестов пользователя для некоторых методов протокольной навигации

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

Подход BotBrowser на уровне движка

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

Нормализация таймингов

BotBrowser нормализует тайминг обработки протокольной навигации, чтобы зарегистрированные и незарегистрированные протоколы производили неотличимые сигнатуры таймингов. Это устраняет основной сигнал, используемый в снятии отпечатков на основе протоколов:

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

Однородный поведенческий ответ

Помимо таймингов, BotBrowser обеспечивает согласованное наблюдаемое поведение (состояния ошибок, события focus/blur, статус iframe) для всех попыток протокольной навигации. Браузер не раскрывает существование обработчика через какой-либо поведенческий канал.

Легитимные протокольные ссылки

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

Интеграция с профилем

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

chrome --bot-profile="/path/to/profile.enc" \
       --bot-noise-seed=42 \
       --proxy-server="socks5://user:pass@proxy:1080" \
       --user-data-dir="$(mktemp -d)"

Настройка и использование

Базовое использование CLI

Защита обработчиков протоколов автоматическая при загрузке профиля:

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

Интеграция с Playwright

const { chromium } = require('playwright-core');

(async () => {
  const browser = await chromium.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/path/to/profile.enc',
    ],
    headless: true,
  });

  const context = await browser.newContext({ viewport: null });
  const page = await context.newPage();

  await page.goto('https://example.com');
  // Запросы обработчиков протоколов будут производить однородные ответы
  // независимо от установленных на хостовой машине приложений
  await browser.close();
})();

Интеграция с Puppeteer

const puppeteer = require('puppeteer-core');

(async () => {
  const browser = await puppeteer.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/path/to/profile.enc',
    ],
    headless: true,
    defaultViewport: null,
  });

  const page = await browser.newPage();
  await page.goto('https://example.com');
  // Сигналы обработчиков протоколов контролируются профилем
  await browser.close();
})();

Верификация

После запуска BotBrowser с профилем проверьте защиту обработчиков протоколов:

// Тест согласованности таймингов обработчиков протоколов
async function testProtocolTiming(protocol) {
  const start = performance.now();
  const iframe = document.createElement('iframe');
  iframe.style.display = 'none';
  document.body.appendChild(iframe);

  return new Promise(resolve => {
    iframe.onload = () => {
      resolve(performance.now() - start);
      document.body.removeChild(iframe);
    };
    iframe.onerror = () => {
      resolve(performance.now() - start);
      document.body.removeChild(iframe);
    };
    iframe.src = `${protocol}://test`;
    setTimeout(() => {
      resolve(performance.now() - start);
      if (iframe.parentNode) document.body.removeChild(iframe);
    }, 500);
  });
}

// И зарегистрированные, и незарегистрированные протоколы должны
// производить схожие тайминги
const timing1 = await testProtocolTiming('slack');
const timing2 = await testProtocolTiming('nonexistentprotocol12345');
console.log('Slack timing:', timing1);
console.log('Unknown protocol timing:', timing2);
console.log('Difference:', Math.abs(timing1 - timing2));

Что проверять:

  1. Разница в таймингах между известными и неизвестными протоколами минимальна (в пределах шума)
  2. Никаких событий focus/blur не вызывается зондированием протоколов
  3. Тестовые страницы обнаружения протоколов (вроде SchemeFlood.com) показывают однородные результаты
  4. Установленные на хостовой машине приложения не обнаруживаются через протокольные запросы

Лучшие практики

  1. Используйте полные профили. Защита обработчиков протоколов работает лучше всего как часть комплексного профиля, контролирующего все поверхности отпечатков согласованно.

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

  3. Комбинируйте с другими защитами. Обнаружение обработчиков протоколов часто используется наряду со снятием отпечатков Canvas, WebGL и шрифтов. Используйте полный профиль для покрытия всех векторов.

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

Часто задаваемые вопросы

Может ли обнаружение протоколов определить конкретные версии приложений?

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

Работает ли обнаружение протоколов на всех операционных системах?

Техника работает на Windows, macOS и Linux, но конкретное поведение различается по ОС. BotBrowser нормализует поведение независимо от ОС хоста.

Могут ли веб-сайты обнаружить защиту обработчиков протоколов?

Если защита применяется на уровне JavaScript (перехват событий навигации), сам перехват обнаруживаем. BotBrowser применяет защиту на уровне движка, делая нормализацию невидимой для скриптов страницы.

Нарушает ли это легитимные протокольные ссылки?

Нет. Защита BotBrowser нацелена на поведение зондирования, используемое для снятия отпечатков, а не на легитимную протокольную навигацию. Когда пользователь или скрипт явно переходит по протокольной ссылке в рамках нормального рабочего процесса, навигация работает нормально.

Сколько протоколов может быть протестировано в скрипте снятия отпечатков?

Современные скрипты снятия отпечатков тестируют 20-40 распространенных обработчиков протоколов. Каждый тест занимает примерно 100-500 мс в зависимости от метода, поэтому полное сканирование может завершиться за 5-20 секунд. Нормализация таймингов BotBrowser делает все тесты производящими неотличимые результаты.

Это то же самое, что атака "scheme flooding"?

Scheme flooding - это одна конкретная реализация снятия отпечатков на основе протоколов, продемонстрированная в 2021 году. Защита обработчиков протоколов BotBrowser решает проблему scheme flooding и всех других методов обнаружения протоколов, контролируя базовое поведение на уровне движка.

Итоги

Пользовательские обработчики URL-протоколов раскрывают инвентарь установленных приложений пользователя, создавая одну из самых отличительных поверхностей снятия отпечатков. Техника работает между браузерами, выживает в режимах приватного просмотра и раскрывает личную информацию о деятельности и интересах пользователя. BotBrowser контролирует поведение обработчиков протоколов на уровне движка браузера, нормализуя тайминг и поведенческие ответы, чтобы установленные приложения не могли быть обнаружены через зондирование протоколов. Смежные темы: navigator properties protection, font fingerprinting control и comprehensive profile management.

#Url#Protocol#Handler#fingerprinting#Privacy#Application-Detection

Переведите BotBrowser из исследований в продакшн

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