Общее состояние браузера — это утечка; неконтролируемая навигация — это побег
Наивный удалённый браузер разделяет один процесс браузера между многими пользователями. Cookie, установленные в одной сессии, видны в следующей; данные localStorage пересекают границы сессий; состояние аутентификации одного пользователя может быть перехвачено другим. Даже если само защищаемое приложение ведёт себя хорошо, общий браузер становится побочным каналом, обходящим любой контроль доступа на уровне приложения.
А ещё есть навигация. Пользователь, имеющий лишь право просмотра одного внутреннего дашборда, кликает внутри этого дашборда по фишинговой ссылке, открывает новую вкладку для личного аккаунта или переходит по внешней ссылке, которую открывать не собирался. Без принуждения на уровне браузера сессия сбегает с защищаемого приложения — и теперь идентификатор сессии защищаемого приложения, личность пользователя и активное состояние просмотра становятся видны там, куда ушёл браузер.
Изоляция контекста браузера закрывает и то, и другое. Каждая сессия работает в собственном контексте браузера без общего состояния. Сам браузер обеспечивает список разрешённых доменов, до которых сессия может добраться, и блокирует каждый канал, которым пользователь мог бы воспользоваться, чтобы уйти в другое место — новые вкладки, всплывающие окна, клики по ссылкам на неразрешённые домены, программную навигацию самой страницей.
Изоляция в браузере, принуждение на границе
Каждая сессия получает собственный контекст браузера внутри движка рендеринга — полностью отдельный от состояния любой другой сессии. Строгий список разрешённых доменов останавливает на слое навигации — перехват запросов, опрос навигации одностраничных приложений и перехват кликов по ссылкам вместе обеспечивают, что сессия вообще не достигает домена, на который ей не разрешено. Под этим сами отрендеренные пиксели несут постоянные низкоуровневые модификации, нарушающие работу инструментов автоматизации, пытающихся читать сессию или взаимодействовать с ней.
Контекст браузера на каждую сессию без общего состояния
Каждая пользовательская сессия открывается в собственном изолированном контексте браузера — совершенно новом профиле с собственной cookie-банкой, собственным локальным хранилищем, собственным состоянием сессии. У двух пользователей одного защищаемого приложения полностью независимые браузеры; ничто из одной сессии не видно другой. Завершение сессии полностью уничтожает контекст; никакое состояние не выживает.
Строгий список разрешённых доменов, принуждаемый в момент навигации
Каждая попытка навигации перехватывается до исполнения. Слой запросов блокирует неразрешённые домены на сетевом уровне; клики по ссылкам внутри страницы перехватываются на слое рендеринга; навигации одностраничных приложений (pushState, replaceState) перехватываются опросом. Сессия не может добраться до домена вне списка разрешений — пытается ли пользователь сделать это намеренно или страница сама по себе.
Новые вкладки, всплывающие окна и контекстное меню правого клика блокируются
Браузер киоск-стиля не позволяет пользователю открывать новые вкладки, создавать всплывающие окна или использовать контекстное меню правого клика. Каждый канал, которым пользователь мог бы воспользоваться, чтобы сбежать с защищаемого приложения, закрыт в конфигурации браузера. Пользователь работает внутри сессии, открытой для него, — и не более того.
Средства защиты от автоматизации, применяемые к отрендеренным пикселям
Под видимым контентом поток отрендеренных пикселей несёт постоянные низкоуровневые модификации — случайный шум, тонкие сдвиги цвета, микросмещение элементов, субпиксельную вибрацию. Они не влияют на то, что видит пользователь, но нарушают работу инструментов автоматизации (скриптов Selenium, Puppeteer, экранных скрейперов), пытающихся читать сессию или взаимодействовать с ней вне официального входного канала.
Что обеспечивает слой изоляции
Каждое из приведённых ниже поведений настраивается для каждого защищаемого сервиса и принуждается на слое браузера, а не в коде защищаемого приложения. Защищаемому приложению не нужно знать об их существовании — граница невидима из среды выполнения приложения.
Полностью изолированный контекст браузера на каждую сессию
Каждая сессия работает в собственном контексте браузера — конструкции уровня Chromium, дающей сессии собственную cookie-банку, собственное локальное хранилище, собственную регистрацию service worker, собственные разрешения, собственное состояние сессии. Две сессии одного защищаемого приложения не разделяют ничего на уровне браузера.
Перехват запросов на сетевом уровне
Каждый запрос навигации — главный документ, поддокумент, fetch, XHR — проходит через перехватчик, проверяющий целевой домен по списку разрешений сессии. Неразрешённые домены блокируются до установления соединения. Нет гонки между кликом пользователя и проверкой навигации.
Опрос навигации одностраничных приложений
Современные одностраничные приложения навигируют, вызывая pushState или replaceState без сетевого запроса. Простой перехватчик запросов их не уловит. ZeroLeak также с коротким интервалом опрашивает текущий URL внутри страницы, так что SPA-навигации на неразрешённые пути перехватываются и отменяются в течение секунд.
Перехват кликов по ссылкам внутри отрендеренной страницы
Элементы ссылок с неразрешённой целью, вызовы window.open(), программные изменения местоположения — все перехватываются внутри отрендеренной страницы до исполнения. Пользователь, кликнувший по ссылке, по которой нельзя перейти, блокируется в момент клика, а не после того, как сетевой запрос уже начался.
Блокировка вкладок и всплывающих окон
Браузер сконфигурирован так, что попытка создать новую цель просмотра — пользователем, страницей или скриптом — мгновенно перехватывается и отбрасывается. У сессии всегда ровно одна видимая вкладка, и это вкладка защищаемого приложения.
Тайм-аут простоя и корректное завершение
Каждая сессия отслеживает взаимодействие пользователя. Если пользователь бездействует дольше настроенного тайм-аута, сессия корректно завершается, контекст браузера уничтожается, а (при настройке) webhook уведомляет координатора, чтобы целевая политика могла обновиться. Нет брошенных изолированных браузеров, потребляющих память.
Защиты слоя рендеринга под видимым контентом
Помимо изоляции на каждую сессию и границы навигации, сам поток отрендеренных пикселей несёт постоянные низкоуровневые модификации. Их цель — нарушить работу инструментов автоматизации — скриптов, которые иначе читали бы экран сессии, идентифицировали элементы и взаимодействовали через неофициальные каналы, — не влияя на то, как страница выглядит или ведёт себя для пользователя-человека.
Случайный низкоинтенсивный пиксельный шум
Canvas-наложение непрерывно рисует низкоинтенсивный случайный шум по всей отрендеренной странице. Человеческий глаз воспринимает максимум лёгкую текстуру; OCR- и template-matching-скрипты, пытающиеся читать экран, теряют согласованные границы пикселей, на которые они опираются. Интенсивность шума и частота обновления настраиваются для каждого защищаемого сервиса.
Тонкие сдвиги цветового оттенка
Полупрозрачное наложение применяет медленно меняющийся случайный цветовой оттенок по всей отрендеренной странице. Белые и чёрные области по-прежнему эффективно выглядят для глаза белыми и чёрными, но реальные значения пикселей смещаются. Инструменты автоматизации на основе зрения, сопоставляющие по цветовым сигнатурам, теряют свои опорные точки.
Постоянное микроразмытие
В качестве экранного фильтра применяется очень лёгкое постоянное размытие. Каждый кадр немного отличается по высокочастотной детали, что затрудняет поиск устойчивых характерных точек для OCR и сопоставителей паттернов. Пользователь не воспринимает размытие на обычном расстоянии чтения.
Микросмещение элементов через инъекцию CDP
Элементы страницы случайно сдвигаются на 1–3 пикселя относительно их нормального положения. Сдвиг ниже человеческого восприятия, но нарушает работу скриптов, находящих элементы по абсолютным экранным координатам. Инструменты автоматизации не могут полагаться на устойчивое положение элемента от кадра к кадру.
Субпиксельная вибрация (анти-Selenium)
С коротким интервалом вся отрендеренная поверхность сдвигается на несколько пикселей — достаточно мало, чтобы не нарушить чтение, достаточно много, чтобы одолеть инструменты автоматизации, зависящие от устойчивых абсолютных пиксельных координат для симуляции ввода. Replay-атаки в стиле Selenium теряют свои опорные точки.
Где важна изоляция на каждую сессию
Консоли операционных технологий и SCADA
Интерфейсы критической инфраструктуры, где утечка состояния между сессиями или нежелательная навигация могут затронуть физические системы. Изоляция на каждую сессию гарантирует, что два оператора на одной консоли не увидят сессию друг друга; строгий список разрешений обеспечивает, что ни один из них не перейдёт с операционной консоли на внешнюю ссылку.
Внутренние корпоративные приложения с ролями только для просмотра
Внутренние дашборды, аудиторские интерфейсы, инструменты отчётности, к которым обращаются многие пользователи, — включая подрядчиков и внешних аудиторов. Каждая сессия — собственный браузер, политика доступа принуждается на слое навигации, а защиты слоя рендеринга сопротивляются автоматизации любого, кто пытается скрейпить экран.
Доступ к документам и дата-румам
Контекст на каждую сессию означает, что подрядчик, просматривающий один дата-рум, не сможет увидеть cookie, историю поиска или идентификаторы сессий другого подрядчика в другом дата-руме. Список разрешений обеспечивает, что сессия дата-рума никогда не уйдёт в более широкий интернет.
Исследовательские и клинические порталы
Порталы исследований, где несколько исследователей обращаются к данным пациентов под строгими границами раскрытия. Изоляция на каждую сессию принуждает границу на слое браузера; список разрешений принуждает на слое навигации; защиты рендеринга сопротивляются автоматизации любого, кто пытается скрейпить данные через канал экрана.
Часто задаваемые вопросы
Это то же самое, что режим инкогнито Chrome?
Что произойдёт, когда пользователь кликнет по ссылке на неразрешённый домен?
Как обрабатываются навигации одностраничных приложений?
Снижают ли защиты слоя рендеринга производительность страницы?
Может ли защищаемое приложение обнаружить, что работает внутри этой изоляции?
Что происходит в конце сессии?
Посмотрите изоляцию на каждую сессию в живой демонстрации
Мы запустим две сессии бок о бок на одном защищаемом приложении, покажем, что между ними ничего не утекает, попробуем выйти за пределы списка разрешений и попытаемся управлять сессией внешним инструментом автоматизации — и покажем, что произойдёт.