Перейти к основному содержимому
Возможность

Каждая сессия — это собственная изолированная среда просмотра

Каждая сессия ZeroLeak открывает защищаемое приложение в собственном контексте браузера — совершенно новом профиле без общих cookie, хранилища или состояния сессии. Пользователь может переходить только на разрешённые домены, не может открыть новую вкладку или всплывающее окно, а сами отрендеренные пиксели несут средства защиты от автоматизации до того, как достигнут экрана пользователя.

Когда два пользователя обращаются к одному защищаемому приложению через ZeroLeak, они не должны видеть данные сессий друг друга, разделять cookie или каким-либо образом влиять на состояние просмотра друг друга. Ни один пользователь также не должен сбежать с домена защищаемого приложения — кликнув по вредоносной ссылке, открыв нежелательное всплывающее окно или перейдя туда, где политика не разрешает. Изоляция контекста браузера — это слой, который всё это обеспечивает. Каждая сессия работает в собственном контексте браузера без общего состояния; строгий список разрешённых доменов перехватывает попытки навигации до их совершения; новые вкладки и всплывающие окна блокируются в источнике; а сам поток отрендеренных пикселей несёт постоянные низкоуровневые модификации, мешающие внешним инструментам автоматизации читать сессию или взаимодействовать с ней.

На сессию
Изолированный контекст браузера — собственные cookie, собственное хранилище, собственное состояние, без совместного доступа
Список разрешений
Принуждение доменов на слое запросов, слое ссылок и слое опроса SPA
Режим киоска
Нет новых вкладок, нет всплывающих окон, нет контекстного меню — одна сессия, одна разрешённая поверхность

Общее состояние браузера — это утечка; неконтролируемая навигация — это побег

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

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

Изоляция контекста браузера закрывает и то, и другое. Каждая сессия работает в собственном контексте браузера без общего состояния. Сам браузер обеспечивает список разрешённых доменов, до которых сессия может добраться, и блокирует каждый канал, которым пользователь мог бы воспользоваться, чтобы уйти в другое место — новые вкладки, всплывающие окна, клики по ссылкам на неразрешённые домены, программную навигацию самой страницей.

Изоляция в браузере, принуждение на границе

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

Контекст браузера на каждую сессию без общего состояния

Каждая пользовательская сессия открывается в собственном изолированном контексте браузера — совершенно новом профиле с собственной cookie-банкой, собственным локальным хранилищем, собственным состоянием сессии. У двух пользователей одного защищаемого приложения полностью независимые браузеры; ничто из одной сессии не видно другой. Завершение сессии полностью уничтожает контекст; никакое состояние не выживает.

Строгий список разрешённых доменов, принуждаемый в момент навигации

Каждая попытка навигации перехватывается до исполнения. Слой запросов блокирует неразрешённые домены на сетевом уровне; клики по ссылкам внутри страницы перехватываются на слое рендеринга; навигации одностраничных приложений (pushState, replaceState) перехватываются опросом. Сессия не может добраться до домена вне списка разрешений — пытается ли пользователь сделать это намеренно или страница сама по себе.

Новые вкладки, всплывающие окна и контекстное меню правого клика блокируются

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

Средства защиты от автоматизации, применяемые к отрендеренным пикселям

Под видимым контентом поток отрендеренных пикселей несёт постоянные низкоуровневые модификации — случайный шум, тонкие сдвиги цвета, микросмещение элементов, субпиксельную вибрацию. Они не влияют на то, что видит пользователь, но нарушают работу инструментов автоматизации (скриптов Selenium, Puppeteer, экранных скрейперов), пытающихся читать сессию или взаимодействовать с ней вне официального входного канала.

Что обеспечивает слой изоляции

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

Полностью изолированный контекст браузера на каждую сессию

Каждая сессия работает в собственном контексте браузера — конструкции уровня Chromium, дающей сессии собственную cookie-банку, собственное локальное хранилище, собственную регистрацию service worker, собственные разрешения, собственное состояние сессии. Две сессии одного защищаемого приложения не разделяют ничего на уровне браузера.

Перехват запросов на сетевом уровне

Каждый запрос навигации — главный документ, поддокумент, fetch, XHR — проходит через перехватчик, проверяющий целевой домен по списку разрешений сессии. Неразрешённые домены блокируются до установления соединения. Нет гонки между кликом пользователя и проверкой навигации.

Опрос навигации одностраничных приложений

Современные одностраничные приложения навигируют, вызывая pushState или replaceState без сетевого запроса. Простой перехватчик запросов их не уловит. ZeroLeak также с коротким интервалом опрашивает текущий URL внутри страницы, так что SPA-навигации на неразрешённые пути перехватываются и отменяются в течение секунд.

Перехват кликов по ссылкам внутри отрендеренной страницы

Элементы ссылок с неразрешённой целью, вызовы window.open(), программные изменения местоположения — все перехватываются внутри отрендеренной страницы до исполнения. Пользователь, кликнувший по ссылке, по которой нельзя перейти, блокируется в момент клика, а не после того, как сетевой запрос уже начался.

Блокировка вкладок и всплывающих окон

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

Тайм-аут простоя и корректное завершение

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

Защиты слоя рендеринга под видимым контентом

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

01

Случайный низкоинтенсивный пиксельный шум

Canvas-наложение непрерывно рисует низкоинтенсивный случайный шум по всей отрендеренной странице. Человеческий глаз воспринимает максимум лёгкую текстуру; OCR- и template-matching-скрипты, пытающиеся читать экран, теряют согласованные границы пикселей, на которые они опираются. Интенсивность шума и частота обновления настраиваются для каждого защищаемого сервиса.

02

Тонкие сдвиги цветового оттенка

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

03

Постоянное микроразмытие

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

04

Микросмещение элементов через инъекцию CDP

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

05

Субпиксельная вибрация (анти-Selenium)

С коротким интервалом вся отрендеренная поверхность сдвигается на несколько пикселей — достаточно мало, чтобы не нарушить чтение, достаточно много, чтобы одолеть инструменты автоматизации, зависящие от устойчивых абсолютных пиксельных координат для симуляции ввода. Replay-атаки в стиле Selenium теряют свои опорные точки.

Где важна изоляция на каждую сессию

Консоли операционных технологий и SCADA

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

Внутренние корпоративные приложения с ролями только для просмотра

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

Доступ к документам и дата-румам

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

Исследовательские и клинические порталы

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

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

Это то же самое, что режим инкогнито Chrome?
Концептуально похоже, но принуждается на другом слое. Режим инкогнито — это настройка профиля, которую пользователь может отключить; изоляция контекста браузера — это контейнер на каждую сессию, управляемый ZeroLeak: у пользователя нет права выбора в отношении изоляции сессии и нет элемента UI для её отключения. Пользователь не может случайно или намеренно сбежать в обычный профиль.
Что произойдёт, когда пользователь кликнет по ссылке на неразрешённый домен?
Клик перехватывается до исполнения навигации. Сессия остаётся на текущей странице и (опционально) показывает уведомление, что цель не разрешена. Событие записывается в запись сессии, чтобы оператор мог видеть, что было попыткой. Нет частичной навигации, нет запроса к третьей стороне, нет утечки идентификатора сессии на неразрешённую цель.
Как обрабатываются навигации одностраничных приложений?
Современные SPA меняют URL через pushState или replaceState, не делая сетевого запроса — простой перехватчик запросов их бы упустил. ZeroLeak запускает проверку опроса с коротким интервалом внутри страницы; если URL меняется на неразрешённый путь, сессия немедленно возвращается в безопасное состояние. Интервал опроса достаточно короток, чтобы любая неразрешённая SPA-навигация длилась максимум секунды.
Снижают ли защиты слоя рендеринга производительность страницы?
Наложение пиксельного шума использует уменьшенный по размеру canvas (обычно четверть разрешения) для низкого потребления CPU и памяти и обновляется с разумной частотой. Наложение сдвига цвета и микроразмытие — это фильтры уровня CSS. Совокупный эффект достаточно мал, чтобы запускать сотни одновременных сессий на обычном оборудовании.
Может ли защищаемое приложение обнаружить, что работает внутри этой изоляции?
Ему не нужно это делать, и оно не спроектировано в этой парадигме. Защищаемое приложение видит стандартную среду безголового браузера. Изоляция, список разрешений, ограничения киоска и защиты рендеринга работают вне среды выполнения приложения — от приложения не требуется сотрудничество с ними, и оно не может их отключить.
Что происходит в конце сессии?
Контекст браузера полностью уничтожается. Cookie, локальное хранилище, service worker'ы, кэшированные страницы, состояние в памяти — всё уходит. Следующей сессии, открытой на том же защищаемом сервисе, нечего унаследовать. При настройке webhook координатора инициируется идентификатором сессии и причиной завершения, чтобы целевая политика или системы аудита могли обновиться.

Посмотрите изоляцию на каждую сессию в живой демонстрации

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