Как мы проверяем
Каждая сборка - против настоящей Safari
Мы не просим верить на слово. Каждое изменение Lumen собирается на Mac с настоящей Safari: профиль сравнивают с ней, ищут любой запрос мимо прокси и записывают результат.
Профиль против Safari на том же Mac
Профиль проверяется таким, каким его получаете вы: свой процесс, окно Safari и прокси в настройках. Рядом - настоящая Safari на том же Mac. Одна и та же страница измеряет обоих, а сервер на этом Mac читает их TLS и заголовки запросов. Прокси в этом замере не отвечает, а страница лежит на самом Mac и открывается напрямую - поэтому язык и часовой пояс у профиля те же, что у Safari.
User-Agent, платформа, язык и Intl, часовой пояс, число ядер. Отличается только число свойств navigator: в профиле с прокси нет navigator.credentials - ниже.
Размер экрана и его доступная часть, глубина цвета, плотность пикселей, указатель и касания.
Страница видит это как внешний размер окна минус внутренний. Размер и положение самого окна у каждого окна свои: эти 8 значений показаны, но не сравниваются.
Тот же набор заголовков в том же порядке, в каком их получил сервер от Safari.
То, что первым видит любой https-сервер: JA3, JA4, шифры и расширения.
Состояния разрешений, квота хранилища, голоса речи и сотни интерфейсов WebKit. Двенадцать отличий - интерфейсы, которые профиль с прокси выключает, и число свойств window, ниже.
Canvas - та же картинка байт в байт, WebGL - производитель, рендерер, расширения и параметры, звук, метрики шрифтов.
ApplePaySession, PaymentRequest и PushManager у профиля есть, и каждый из 17 проверяемых вызовов отвечает так же, как в Safari на этом Mac.
Что отличается - и почему
Из 507 значений отличаются 14. Мы показываем все. Одиннадцать - интерфейсы, которые профиль выключает, потому что их трафик или проверка шли бы мимо прокси. Два - числа свойств, которые от этого меняются. Одно - панели окна.
| Признаки | Сколько | Когда | Почему |
|---|---|---|---|
WebRTCRTCPeerConnection, RTCDataChannel, RTCEncodedVideoFrame, RTCRtpScriptTransform и сама функция RTCPeerConnection |
5 | и без прокси | С прокси WebRTC выключен: его UDP ушёл бы мимо прокси. Без прокси он выключен по умолчанию. |
Web Authentication (ключи доступа)PublicKeyCredential, Credential, navigator.credentials, проверка Web Authentication |
4 | с прокси | Ключи доступа лежат в iCloud Keychain владельца, одни на Safari и все профили, а проверяют их службы системы, а не профиль. Без прокси эти интерфейсы на месте. |
WebTransportWebTransport |
1 | с прокси | Работает по HTTP/3, то есть QUIC поверх UDP, а его не переносит ни HTTP-, ни SOCKS5-прокси: соединение ушло бы мимо прокси. |
| Private Click Measurementатрибуция рекламы | 1 | с прокси | WebKit отправляет отчёты об атрибуции позже и вне сеанса страницы. С прокси функция выключена, а уже сохранённые отчёты удаляются при запуске. |
Число свойств windowwindowOwnCount |
1 | и без прокси | Следствие строк выше: 1005 у профиля с прокси, 1044 у Safari. Ещё двух интерфейсов нет и без прокси - DigitalCredential и MediaSessionCoordinator: WebKit включает их только приложению с особыми правами Apple, которые есть у Safari. |
Число свойств navigatornavigatorProtoCount |
1 | с прокси | Следствие: в профиле с прокси нет navigator.credentials. |
Панели окнаgeometry.chrome |
1 | и без прокси | Сколько высоты окна занимают панели: у профиля в окне Safari это число иное, чем у самой Safari на этом Mac. |
Проверки утечек
Отдельные проверки запускают профиль за настоящими прокси на машине CI и ищут любой путь мимо них. Проверка падает при первом же запросе в обход.
Без прокси cloudflare-quic.com отвечает профилю по HTTP/3; через HTTP- и SOCKS5-прокси - по HTTP/2, и каждый запрос виден прокси. UDP у прокси даже не запрашивается.
leak_check · каждая сборка
В странице, во фреймах и в воркерах нет RTCPeerConnection. Контроль без прокси получает свой внешний адрес через STUN - значит, проверка видит утечку, когда она есть.
leak_check и самотест
Тестовая страница просит заранее разрешить имена: dns-prefetch, preconnect, заголовок Link. В захвате пакетов нет ни одного DNS-запроса к этим именам.
egress_check
Страница, фрейм и воркер обращаются к 127.0.0.1, localhost, ::1 и 0.0.0.0. Каждый запрос отклонён, слушатель на loopback не получил ни одного соединения.
самотест
Тестовый сервер отдаёт сертификат, для проверки которого система пошла бы в сеть за промежуточным. В профиле с прокси такой сертификат отклонён на рукопожатии - через прокси.
самотест
Пока профиль открывает страницу со всеми видами запросов, CI записывает каждый пакет, уходящий с машины, вместе с процессом-отправителем: 2 410 пакетов в последнем прогоне.
egress_check · pktap
Каждая запись приложения и WebKit отслеживается: профиль не пишет туда, где хранит данные настоящая Safari. В последнем прогоне - трасса из 606 017 строк.
disk_check · fs_usage
Подсказки поиска, Safe Browsing, перевод, Apple Pay и другие службы, которые ходят в сеть из своих процессов, из процесса профиля не вызываются: соединения с ними отклоняются.
самотест и захват пакетов
Что проверяется на каждой сборке
Эти шаги выполняются при каждом изменении кода. Если падает любой обязательный - сборка красная.
Все шаги сборки
| Шаг | Что проверяет | Последний прогон |
|---|---|---|
| Модульные тесты ядра | Шифрование, хранилище, синхронизация, импорт cookies, прогрев - на Linux и на macOS | 223 теста на macOS, 0 провалов |
| Скрипты в двух движках | Скрипты, которые профиль добавляет в страницу, ведут себя как встроенные функции - в V8 и в JavaScriptCore, движке Safari | пройдены |
| Самотест на настоящем WebKit | Изоляция профилей, прокси и fail-closed, шифрование при остановке, пароли, cookies, синхронизация двух Mac, прогрев, окно Safari в процессе профиля | 274 проверки, 0 провалов |
| Классы Safari | Что интерфейс Safari в профиле находит всё, на что опирается: если обновление macOS что-то уберёт, сборка это покажет | пройдено |
| Сравнение с Safari | Зонд из 448 признаков: профиль и Safari на одной машине | 434 из 448; 0 обязательных отличий |
| Утечки | QUIC, WebRTC, DNS, обращения к самому компьютеру | пройдено |
| Пакеты и диск | Каждый пакет с машины и каждая запись на диск вокруг самотеста | ни одного пакета мимо прокси |
| Журналы | В системный журнал не попадает ничего ваше в открытом виде | пройдено |
| Языки | Русский и английский интерфейс содержат одни и те же строки | пройдено |
Проверьте сами
Нужен только ваш Mac и любой прокси.
Адрес
В профиле с прокси откройте страницу, которая показывает ваш IP-адрес. Должен быть адрес прокси.
Fail-closed
Выключите прокси и обновите страницу. Она не должна открыться - и тем более показать ваш настоящий адрес.
Отпечаток
Откройте одну и ту же страницу проверки отпечатка в Safari и в профиле на этом Mac. Значения совпадут - кроме тех, что перечислены выше: их профиль выключает, чтобы ничего не ушло мимо прокси.
Если страница проверки пишет «Canvas: Spoofed», откройте её в обычной Safari 26: deviceinfo.me пишет то же самое и там. Его тест знает только старую длину PNG, а нынешний WebKit кодирует ту же картинку иначе.
Отчёты
Сырые данные сравнения с Safari и проверок утечек - JSON, который можно открыть и сравнить самому. Без логов сборки и путей сборочной машины: только то, что измерено.
Есть вопрос к проверке?
Напишите нам: если мы что-то не измеряем, мы хотим об этом знать.