Современный веб состоит из множества разных технологий, которые предоставляют самые разные возможности… но ещё и создают немалое количество угроз. Современные браузеры давно стали самыми сложными приложениями на компе, обогнав по сложности даже ядро ОС (в Firefox в несколько раз больше строк кода, чем в ядре Linux или офисных пакетах). Мы проводим в браузере большую часть своего времени, так что не удивительно, что браузер находится под прицелом: его постоянно пытаются взломать, использовать в ботнете, пытаются украсть из него наши данные, прослушать его трафик, отслеживать посещаемые нами сайты и наши действия на этих сайтах.
Сейчас самое время сказать, что всё не так уж плохо, и со всеми этими проблемами можно справиться… но это не так. Из коробки браузеры уже делают немало: регулярно обновляются, стараются затыкать дыры в безопасности, внедряют новые технологии для защиты, предоставляют возможность расширять их функционал сторонними расширениями. Но серьёзной защиты из коробки нет, и вряд ли она когда-нибудь появится: она идёт в комплекте с усложнением интерфейса браузера и частичным отключением его функционала, что "ломает" сайты и вряд ли понравится обычным пользователям. Но самое печальное, что даже такой ценой невозможно полноценно защитить браузер — слишком уж он стал сложным.
Тем не менее, для усиления защиты браузера можно много чего сделать. Есть пара хороших (англоязычных) проектов, которые предлагают комплексные подходы к дополнительной защите Firefox: статья Firefox Configuration Guide for Privacy Freaks and Performance Buffs (или её вариант для обычных пользователей The Firefox Privacy Guide For Dummies!) от 12bytes.org и ghacks-user.js от Thorin-Oakenpants, earthlng и claustromaniac. Они делают упор на максимальную защиту, но пользоваться таким браузером для обычных ежедневных задач становится крайне проблематично и неудобно. На мой взгляд, стоит ограничиться умеренной защитой Firefox, чтобы соблюсти баланс между усилением защиты, сохранением работоспособности нужных нам сайтов, и затрачиваемыми на всё это усилиями.
Содержание:
Модель угроз
Безопасность (Security)
Конфиденциальность (Privacy)
Отпечатки (Fingerprinting)
Отслеживание (Tracking)
Анонимность (Anonymity)
Доступные способы усиления защиты
Расширения
CanvasBlocker
CSS Exfil Protection
Decentraleyes
ETag Stoppa
Header Editor
HTTPS Everywhere
Neat URL
uBlock Origin
uMatrix
ghacks user.js
Мне мало умеренного Hardening, хочу всё по-максимуму!
Сайт не работает — кто виноват, где чинить?
Забавные факты
Модель угроз
Для начала, давайте проанализируем модель угроз, что именно мы защищаем и от чего.
Безопасность (Security)
Это достаточно общее понятие, но в нашем случае речь о том, чтобы помешать или усложнить другим использование браузера нештатным образом: сюда входит широкий диапазон угроз от взлома браузера эксплойтами до защиты от фишинга.
Очевидно, что дыры будут всегда, поэтому 100% защиты здесь быть не может в принципе. По большей части речь о том, чтобы отключить некоторые фичи браузера или веб-технологии ради уменьшения поверхности атаки.
Конфиденциальность (Privacy)
Никто кроме отправителя и получателя не должен иметь возможность прочитать переданную информацию.
Здесь речь, в основном, об усилении защиты https-соединений. Настройки браузера по умолчанию в большей степени ориентированы на то, чтобы соединение удалось установить, даже ценой того, что потеряется возможность гарантировать его конфиденциальность.
Отпечатки (Fingerprinting)
У пользователя должна быть возможность помешать веб-сайту определить, что прошлый и текущий просмотры сайта выполнялись одним и тем же пользователем.
Здесь начинается ад. Забудьте те благословенные времена, когда достаточно было почистить куки и зайти на сайт с другого IP, чтобы он в принципе не мог связать между собой эти два посещения. Сейчас сайты имеют доступ к такому количеству разнообразных и уникальных данных о браузере, ОС и железе пользователя, что помешать им стало невозможно. Скажу честно, в процессе подготовки этой статьи я узнал много такого, что мне теперь хотелось бы "развидеть" — хотя я и до этого знал немало о происходящем в данной области, но масштабов бедствия я и близко себе не представлял.
- На сервере:
- Детали сетевого подключения (IP, MTU).
- SSL Session ID. Обычно изменяется раз в сутки. А это значит, что, например, если вы сегодня уже заходили на https://gmail.com под одним аккаунтом, а потом почистили куки etc. и сменили VPN чтобы зайти на https://gmail.com с другого IP — гугл всё-равно сможет определить, что оба посещения сделали из одного браузера.
- Всё, что разглашают HTTP-заголовки: версию браузера, ОС, язык.
- Через CSS:
- Размеры окна браузера. Причём это одна из самых уникальных характеристик браузера.
- DPI/масштаб.
- Установленные шрифты. Через CSS можно проверить наличие только заранее известных шрифтов (JS позволяет получить все шрифты), но и этого более чем достаточно — в конце концов, список всех существующих шрифтов конечен и общеизвестен.
- OS (по типичным для неё шрифтам).
- Через JS:
- Железо:
- Количество параллельных процессов браузера (concurrency).
- Производитель и модель видеокарты (через WebGL).
- Браузер:
- Название и версия.
- ОС.
- Локаль.
- Язык.
- Таймзона.
- Настройки прав доступа (доступ к местоположению, микрофону, etc.) — какие разрешены, какие запрещены, какие спросят пользователя (что тоже формирует довольно уникальный набор в соответствии с настройками пользователя).
- Используется ли режим приватного просмотра.
- Экран:
- Размеры (разрешение) экрана, доступное, внешнего окна, внутреннего окна, viewport.
- Включен ли полноэкранный режим.
- Ориентация экрана.
- Глубина цвета.
- DPI.
- Используется ли HiDPI.
- Текущий масштаб (zoom) страницы.
- devicePixelRatio.
- Хранилища данных (способы запомнить идентификатор пользователя):
- Куки.
- localStorage.
- sessionStorage.
- indexedDB.
- appCache.
- Web Worker.
- Shared Worker.
- Service Worker.
- Кэш Service Worker.
- Уведомления (notifications).
- Обычный кэш (включая фокусы с ETag, etc.).
- Fonts (ещё один из самых уникальных факторов).
- Canvas (можно получить уникальный отпечаток чтением результата отрисовки браузером).
- DOMRect.
- Intersection Observer API.
- WebGL (помимо прочего можно узнать название видеокарты).
- Audio API.
- Список разрешённых алгоритмов шифрования и версий TLS.
- Железо:
После взгляда на этот список требуемое законом от веб-сайтов уведомление пользователей об использовании кук выглядит форменным издевательством.
Существует два подхода к защите: уменьшение энтропии отпечатков (чтобы у многих пользователей отпечаток совпадал) и увеличение энтропии (чтобы отпечаток одного пользователя каждый раз отличался от предыдущего). Обычно уменьшение энтропии работает лучше, но более-менее полноценно его можно реализовать только в Tor-браузере, потому что для этого необходимо сильно ограничить возможности пользователей по индивидуальной настройке браузера, а браузеры общего назначения этого себе позволить не могут. Что касается увеличения энтропии, то основная проблема в том, что факт рандомизации отпечатка можно определить (сделав два отпечатка подряд), после чего вместо конкретного значения отпечатка начинает использоваться признак "подделывает отпечаток", что само по себе помещает вас в очень узкую категорию пользователей и упрощает получение уникального для вас отпечатка.
Для нас всё это означает, что даже пытаться препятствовать сбору наших отпечатков нет смысла, если только это нельзя получить "бесплатно" — не жертвуя работоспособностью сайтов и юзабилити браузера.
Отслеживание (Tracking)
Не должно быть возможности связать между собой просмотры разных веб-сайтов одним пользователем, если только он сам не сообщил одному сайту информацию о своём аккаунте на другом сайте.
Обычно отслеживание осуществляется через подключение ресурсов (JS/CSS/image) одного и того же стороннего сайта на множестве других сайтов. Казалось бы, использование расширений для блокирования трекеров и рекламы должно решить эту проблему… но, увы, это не так. Да, это помогает, но суровая правда в том, что сайты торгуют этими данными, так что даже если вы посетили два сайта на которых заблокированы все сторонние ресурсы, то эти сайты всё-равно могут продать данные о ваших посещениях одной и той же рекламной сети, что позволит ей связать эти посещения между собой (учитывая вышеупомянутые возможности получения уникального отпечатка пользователя — это не составит проблемы).
Тем не менее, блокировать сторонние ресурсы всё-равно стоит — это ускоряет загрузку сайтов, избавляет от рекламы, затрудняет и удорожает отслеживание, а так же сокращает источники атак на браузер.
Анонимность (Anonymity)
Не должно быть возможности связать просмотр веб-сайта с реальной личностью пользователя, если он не регистрировался на этом сайте под своим настоящим именем и не заходил на него с IP-адреса, зарегистрированного на него провайдером.
Учитывая возможности получения отпечатков и отслеживания — анонимность пользователя, который хоть одному из посещённых сайтов позволил узнать его реальную личность, превращается в фикцию.
Усиление анонимности выходит за рамки нашей задачи. Вкратце, имейте в виду: никакой анонимности при использовании вашего основного браузера нет, и никогда не будет. Нужна анонимность — смотрите в сторону специализированных виртуалок (с настройками по умолчанию и без сохранения результатов на диске после выключения виртуалки), VPN+Tor и Tor-браузера вместо обычного Firefox.
Доступные способы усиления защиты
Итак, что же мы можем предпринять? В порядке возрастания сложности использования:
- Можно использовать встроенные возможности браузера по контролю и изоляции веб-сайтов на индивидуальной основе:
- Контейнеры.
- Приватное окно.
- Управление правами доступа для веб-сайтов.
- Блокирование сторонних кук и известных трекеров.
- Удаление сохранённых веб-сайтами данных/кэша.
- Можно установить разнообразные расширения.
- Можно поковыряться среди нескольких тысяч доступных настроек браузера в
about:config
и изменить некоторые из них.
С первым пунктом всё тривиально, но хотелось бы особо отметить контейнеры. Это относительно новая фича Firefox, которая позволяет изолировать группу сайтов в одном контейнере от группы сайтов в другом. По сути, использование разных контейнеров в одном браузере должно работать так же, как одновременное использование нескольких разных браузеров — но сделать это более удобным для пользователя. Изоляция контейнеров всё-таки немного слабее, чем при использовании разных браузеров, но она достаточно хороша и контейнерами вполне можно пользоваться. Тем не менее, контейнеры сами по себе не усиливают защиту ни одного из пунктов, рассмотренных в нашей модели угроз — максимум, они незначительно препятствуют получению отпечатка пользователя за счёт изоляции хранилищ данных (куки, кэш, etc.).
Расширения попадаются самые разные — одни достаточно установить и они будут работать не требуя внимания и тонкой настройки, другие необходимо постоянно настраивать чтобы восстановить работоспособность новых сайтов, а третьи сами являются угрозой для безопасности, конфиденциальности и отслеживания. Поэтому стоит очень тщательно отнестись к выбору устанавливаемых расширений, их политикам приватности и их обновлениям.
Что касается изменения настроек about:config
— это самый сложный способ усиления защиты. Слишком уж много этих настроек, слишком мало информации о том, что может сломаться при изменении каждой настройки, слишком не очевидный эффект у большинства из них, плюс каждая новая версия Firefox приносит с собой кучу новых настроек и удаляет часть старых.
Расширения
Подумайте, стоит ли использовать автоматическое обновление расширений (его можно выключить на about:addons
). Есть множество причин, почему его стоит отключить (но обновлять их всё-равно необходимо, просто вручную и внимательно отслеживая изменения, в т.ч. политики приватности):
- Разработчики регулярно решают начать монетизировать расширение способами, которые, в контексте этой статьи, вам точно не понравятся.
- Разработчики иногда продают расширения, и их новый владелец обычно вносит в них изменения, которые так же вряд ли вам понравятся.
- Расширения изредка "угоняют" у разработчика.
- Новые версии могут ломать совместимость с вашей текущей конфигурацией и/или глючить.
Некоторые расширения используют CSP для реализации отдельных фич. К сожалению, в данный момент архитектура Firefox такова, что модифицировать CSP при загрузке веб-сайта сможет только одно из расширений — и вы не можете заранее быть уверены, которое из них. Поскольку очень критично гарантировать корректную работу uMatrix, то необходимо внимательно проконтролировать настройки других расширений, чтобы убедиться что в них отключены все фичи, которые используют CSP:
- uBlock Origin: Выключить
Панель управления → Настройки → Поведение по умолчанию → [ ] Блокировать сторонние шрифты
(точно не уверен, но логично предположить что для индивидуальных сайтов это тоже лучше не включать). - HTTPS Everywhere: Выключить
Иконка → [ ] Шифровать все подходящие сайты (EASE)
. - CanvasBlocker: Выключить
Настройки → Прочие → [ ] Block data URL pages
(чтобы этот пункт увидеть необходимо включитьНастройки → [✓] Экспертный режим
).
Если вы решите не ограничиваться установкой расширений, и поставите описанный ниже user.js
, то учтите дополнительные нюансы:
- Рекомендуемый вариант настроек
user.js
требует использования расширения uMatrix. - Некоторые настройки в
user-overrides.js
нужны для того, чтобы не сломать работу некоторых расширений — подкорректируйте их в соответствии с тем, какие расширения установлены у вас.
CanvasBlocker
- Ссылка: https://addons.mozilla.org/ru/firefox/addon/canvasblocker/
- Защищает: Отпечатки.
- Описание: Мешает снимать отпечатки через разные API: Canvas, WebGL, Audio, History, Window (по умолчанию отключено — может ломать сайты), DOMRect.
- Использование: Работает автоматически, внимания не требует. Показывает отдельную иконку в конце адресной строки на сайтах, которые пытаются использовать защищаемые API (через неё можно отключить блокирование на конкретном сайте).
- Иконка: Можно скрыть в расширенное меню.
- Настройка:
[✓] Экспертный режим [✓] Block data URL pages` (конфликт по CSP с uMatrix)
CSS Exfil Protection
- Ссылка: https://addons.mozilla.org/ru/firefox/addon/css-exfil-protection/
- Защищает: Конфиденциальность.
- Описание: Блокирует атаки типа CSS data exfiltration (кража данных со страницы через использование специфических CSS-селекторов).
- Использование: Работает автоматически, внимания не требует.
- Иконка: Можно скрыть в расширенное меню.
- Настройка: Не требуется.
Decentraleyes
- Ссылка: https://addons.mozilla.org/ru/firefox/addon/decentraleyes/
- Защищает: Отслеживание.
- Описание: Защищает от отслеживания «бесплатными» CDN. Содержит популярные файлы, которые обычно запрашиваются через CDN, и отдаёт их браузеру без выполнения реального сетевого запроса на CDN. Побочный эффект — немного ускоряет загрузку сайтов.
- Использование: Работает автоматически, внимания не требует.
- Иконка: Можно скрыть в расширенное меню.
- Настройка: Не требуется.
К сожалению, у меня он подвешивает интерфейс Firefox пока в фоне грузятся некоторые сайты, так что пришлось его пока выключить.
ETag Stoppa
- Ссылка: https://addons.mozilla.org/ru/firefox/addon/etag-stoppa/
- Защищает: Отпечатки.
- Описание: Удаляет заголовок
ETag:
из ответа сервера. - Использование: Работает автоматически, внимания не требует.
- Иконка: Отсутствует.
- Настройка: Не требуется.
Вместо использования этого расширения можно добавить правило в Header Editor (имеет смысл если он используется и для других правил):
- Rule type: Modify response header
- Match type: All
- Execute type: Custom function
- Custom function:
for (const a in val) { if (val[a].name.toLowerCase() === 'etag') { val[a].value = ''; } }
Header Editor
- Ссылка: https://addons.mozilla.org/ru/firefox/addon/header-editor/
- Защищает: Зависит от того, как им пользоваться.
- Описание: Позволяет задать собственные правила для блокирования или перенаправления запросов, а так же изменения заголовков запроса или ответа.
- Использование: Работает автоматически, внимания не требует.
- Иконка: Можно скрыть в расширенное меню.
- Настройка: Сам по себе он не делает вообще ничего — вы должны сами определить для него правила.
Один из примеров правил упомянут выше, в описании ETag Stoppa. Но если других правил нет, то проще использовать ETag Stoppa вместо этого расширения.
Другой пример: я обнаружил, что расширение ImTranslator зачем-то отправляет на все сайты две куки: BL_D_PROV=undefined; BL_T_PROV=undefined
. Может это просто баг, но мне не нравится, что он сообщает всем сайтам, что я использую это расширение. Проблема решается вот таким правилом:
- Rule type: Modify request header
- Match type: All
- Execute type: Custom function
- Custom function:
for (const a in val) { if (val[a].name.toLowerCase() === 'cookie') { val[a].value = val[a].value.split(/;\s*/).filter((kv)=>{ return !kv.match(/^BL_[DT]_PROV=/) }).join('; '); if (val[a].value === '') { delete val[a]; } } }
HTTPS Everywhere
- Ссылка: https://addons.mozilla.org/ru/firefox/addon/https-everywhere/
- Защищает: Конфиденциальность.
- Описание: Автоматически переключает на https там, где возможно.
- Использование: Работает автоматически, внимания почти не требует (последний раз у меня ломался какой-то сайт из-за этого расширения года полтора назад).
- Иконка: Используется для индивидуальной настройки сайтов.
- Настройка: Не требуется.
Neat URL
- Ссылка: https://addons.mozilla.org/ru/firefox/addon/neat-url/
- Защищает: Отслеживание.
- Описание: Удаляет мусорные параметры из URL.
- Использование: Работает автоматически, внимания не требует.
- Иконка: Можно скрыть в расширенное меню.
- Настройка: Не требуется.
uBlock Origin
- Ссылка: https://addons.mozilla.org/ru/firefox/addon/ublock-origin/
- Защищает: Безопасность, Отпечатки, Отслеживание.
- Описание: Автоматический блокировщик (на базе сторонних списков) всякого мусора по типу и/или url, а так же отдельных элементов страницы: от рекламы и уведомлений об использовании сайтом кук до трекеров и малвари.
- Использование: Изредка необходимо настраивать новый сайт.
- Иконка: Необходима для настройки текущего сайта, включая ручную блокировку отдельных элементов страницы.
- Настройка: (списки фильтров — вопрос личных предпочтений)
Настройки [✓] Я опытный пользователь Настройки → Приватность [✓] Предотвратить утечку локального IP-адреса через WebRTC [✓] Блокировать CSP-отчёты Списки фильтров → Встроенные [✓] uBlock filters – Annoyances Списки фильтров → Реклама [✓] Adblock Warning Removal List Списки фильтров → Приватность [✓] Fanboy’s Enhanced Tracking List Списки фильтров → Вредоносные домены [✓] Malvertising filter list by Disconnect [✓] Spam404 Списки фильтров → Раздражающие элементы [✓] AdGuard Annoyances filter [✓] Fanboy's Cookie List [✓] Fanboy’s Annoyance List Списки фильтров → Многоцелевые [✓] Dan Pollock’s hosts file [✓] hpHosts’ Ad and tracking servers Списки фильтров → Регионы, языки [✓] RUS: RU AdList
uMatrix
- Ссылка: https://addons.mozilla.org/ru/firefox/addon/umatrix/
- Защищает: Безопасность, Отпечатки, Отслеживание.
- Описание: Ручной блокировщик отдельных ресурсов по типу и домену.
- Использование: Регулярно необходимо настраивать новый сайт.
- Иконка: Необходима для настройки текущего сайта.
Настройка:
Настройки → Удобство [✓] Скрывать заполнитель заблокированных элементов Настройки → Приватность [✓] Удалять незаблокированные сессионные куки через [1440] минут после последнего использования [✓] Удалять содержимое локального хранилища заблокированных сайтов [✓] Очищать кэш браузера каждые [1440] минут # Стоит отключить referer если uMatrix используется совместно с user.js: [ ] Подменять строку HTTP referrer в запросах к сторонним источникам [✓] Только HTTPS: запретить смешанное содержимое # Отредактируйте "Временные правила", а потом нажмите "Сохранить" и "Утвердить": Настройки → Мои правила * * script block
Это расширение обеспечивает самую серьёзную защиту, но у этого есть цена: многие сайты будут сломаны, и их потребуется чинить вручную. Например, только что добавленное правило "* * script block"
отключило выполнение JS на всех сайтах — что, разумеется, многие из них сломало. Но не торопитесь удалять это правило: во-первых, это не сильно поможет, т.к. загрузка многих типов ресурсов включая JS со сторонних сайтов всё-равно отключена (что так же ломает многие сайты); а во-вторых подход "белый список: запрещено всё, что не было явно разрешено" в современном вебе единственно приемлемый, раз уж вы хотите усилить защиту Firefox.
Хорошая новость в том, что чинить сайты не сложно — обычно достаточно двух-трёх кликов в матрице, которую показывает иконка расширения, и последующего перечитывания текущей страницы. Главное, не забывать в той же матрице сохранять изменения, после того, как вы почините сайт.
И готовьтесь морально, что первое время придётся чинить почти каждый сайт из тех, которые вы часто посещаете — это связано с тем, что на активно используемых сайтах вам, почти наверняка, понадобится как минимум включить JS самого сайта, плюс, возможно, некоторые ресурсы со сторонних сайтов. Потерпите первые дни, потом станет намного легче, честно! :)
Надо отметить, что интерфейс uMatrix очень ясный и удобный — после того, как вы с ним разберётесь. Иными словами, интуитивно понятным его назвать нельзя. Поэтому крайне желательно почитать документацию! Как минимум — раздел uMatrix basic usage (с картинками) из вышеупомянутой статьи Firefox Configuration Guide for Privacy Freaks and Performance Buffs. А вообще я очень рекомендую почитать wiki uMatrix — там много всего, но информация очень нужная и полезная.
Есть ещё один дополнительный набор правил, которые может иметь смысл добавить в Настройки → Мои правила
— он поможет заблокировать доступ сайтам из интернета к ресурсам в локальной сети (это не защита от атаки DNS rebinding). Если вы установили uMatrix достаточно давно, то сначала нужно удалить правило "matrix-off: localhost true"
(новые версии uMatrix его не устанавливают).
* localhost * block
* 127 * block
* 10 * block
* 192.168 * block
* 169.254 * block
* 172.16 * block
* 172.17 * block
* 172.18 * block
* 172.19 * block
* 172.20 * block
* 172.21 * block
* 172.22 * block
* 172.23 * block
* 172.24 * block
* 172.25 * block
* 172.26 * block
* 172.27 * block
* 172.28 * block
* 172.29 * block
* 172.30 * block
* 172.31 * block
* [::1] * block
* [fc00::] * block
* [fd00::] * block
* [fe80::] * block
* [fe80::1%lo0] * block
* [ff02::1] * block
* [ff02::2] * block
localhost localhost * allow
127 127 * allow
10 10 * allow
192.168 192.168 * allow
169.254 169.254 * allow
172.16 172.16 * allow
172.17 172.17 * allow
172.18 172.18 * allow
172.19 172.19 * allow
172.20 172.20 * allow
172.21 172.21 * allow
172.22 172.22 * allow
172.23 172.23 * allow
172.24 172.24 * allow
172.25 172.25 * allow
172.26 172.26 * allow
172.27 172.27 * allow
172.28 172.28 * allow
172.29 172.29 * allow
172.30 172.30 * allow
172.31 172.31 * allow
[::1] [::1] * allow
[fc00::] [fc00::] * allow
[fd00::] [fd00::] * allow
[fe80::] [fe80::] * allow
[fe80::1%lo0] [fe80::1%lo0] * allow
[ff02::1] [ff02::1] * allow
[ff02::2] [ff02::2] * allow
ghacks user.js
С расширениями было всё просто (да, и даже с uMatrix — он хоть и усложняет использование браузера, но и основную защиту даёт тоже он), а сейчас мы добрались до сложной части.
Проект ghacks user.js предоставляет нам базовый файл user.js
, плюс скрипты для его обновления и сброса удалённых настроек. Данный файл содержит (на данный момент) изменение 488 настроек в about:config
! И его считают базовым не без причины: использование его as is, без внесения нужных вам изменений — практически гарантированно приведёт к катастрофе (например, его настройки по умолчанию регулярно удаляют всю историю браузера, блокируют русификацию Firefox, ломают множество сайтов и расширений).
Этот проект предпринимает очень серьёзные усилия для защиты Отпечатков и Отслеживания… настолько серьёзные, что пользоваться браузером становится до такой степени неудобно, что честнее сказать "невозможно". И при этом всё-равно заметно проигрывает в защите Tor-браузеру в виртуалке. Это никоим образом не означает, что проект бесполезен для пользователей — просто, чтобы им пользоваться, необходимо потратить немало времени на создание собственного user-overrides.js
.
По этой причине перед его использованием необходимо:
- Внимательно прочитать сам user.js (порядка 2300 строк).
- Внимательно прочитать все страницы wiki проекта.
- Создать собственный файл
user-overrides.js
со всеми изменениями относительноuser.js
, которые нужны лично вам. - Сделать бэкап своего профайла Firefox!!!
- И только потом активировать
user.js
.
Это требует времени, и немало. Стоит ли оно того? Сложный вопрос.
Чтобы на него ответить я составил (неполный) список того, что он улучшает помимо Отпечатков и Отслеживания — посмотрите, и сами решайте:
- Безопасность:
- Отключает cross-origin HTTP Auth (фишинг учётных записей).
- Усиливает защиту при использовании запомненных паролей.
- Усиливает защиту при использовании TLS и сертификатов.
- Ограничивает поддержку шрифтов (высокая вероятность уязвимостей).
- Отключает DRM-плагины.
- Отключает WebGL (высокая вероятность уязвимостей).
- Ограничивает фичи WebGL если его включить (высокая вероятность уязвимостей).
- Отключает всяческие варианты workers (майнеры, Meltdown/Spectre).
- Отключает asm.js (высокая вероятность уязвимостей).
- Отключает WebAssembly.
- Отключает Shared Memory (Spectre).
- Добавляет
rel=noopener
для ссылок сtarget=_blank
(безопасность). - Усиливает защиту при взаимодействии со сторонними локальными приложениями.
- Отключает MathML (уменьшение поверхности атаки).
- Форсирует Punycode для IDN (анти-спуфинг).
- Активирует экспериментальную поддержку CSP 1.1.
- Включает first party isolation.
- Утечки, управляемость:
- Отключает телеметрию Firefox и завязанные на неё фичи (рекомендации, etc.).
- Отключает сторонние сервисы вроде Pocket.
- Блокирует выкачивание ссылок, на которых не нажимали (ping, pre-fetch, etc.).
- Отключает сетевые фичи, через которые можно обойти прокси/VPN и узнать IP (включая IPv6 и WebRTC).
- Ограничивает утечку истории предыдущих страниц в текущей вкладке.
- Отключает :visited (утечка истории).
- Блокирует утечку в процессе набора в строке адреса/поиска текста через подсказки поисковика.
- Отключает screen sharing.
- Запрещает доступ к clipboard.
- Отключает Intersection Observer API (стабильность, определение блокировщика рекламы).
Чтобы упростить подготовку своего user-overrides.js
автор вышеупомянутых статей на 12bytes.org выложил собственный user-overrides.js. Мне он категорически не подошёл, потому что мне нужна умеренная защита, при которой сохраняется удобство использования браузера, пусть даже ценой ослабления защиты от Отпечатков и Отслеживания.
Я так же выложил свой user-overrides.js, возможно он упростит вам использование ghacks user.js
.
Итак, чтобы начать использовать ghacks user.js
нужно сделать следующее:
- ОБЯЗАТЕЛЬНО! Сделайте бэкап своего текущего профайла Firefox.
- Скачайте в каталог своего текущего профайла следующие файлы из проекта ghacks user.js:
user.js
updater.sh
(и сделайте его выполнимым) илиupdater.bat
prefsCleaner.sh
(и сделайте его выполнимым) илиprefsCleaner.bat
- Создайте в каталоге своего текущего профайла файл
user-overrides.js
.
- Можете просто скачать мой user-overrides.js, после чего вписать в него своё текущее значение
dom.push.userAgentID
и внести нужные вам изменения.
- Можете просто скачать мой user-overrides.js, после чего вписать в него своё текущее значение
- Запустите
./updater.sh
илиupdater.bat
. Он обновитuser.js
и допишет ему в конец содержимоеuser-overrides.js
. - Выйдите из Firefox и запустите
./prefsCleaner.sh
илиprefsCleaner.bat
. Он удалит из файлаprefs.js
(содержащего ваши текущие настройкиabout:config
) все настройки, которые упоминаются вuser.js
(включая закомментированные). - Запустите Firefox. Нажмите
Ctrl-Shift-Del
и удалите (за всё время):
- Куки.
- Кэш.
- Данные автономных веб-сайтов.
- Загляните в
about:config
, параметр_user.js.parrot
должен иметь значение "SUCCESS" — иначе где-то в вашемuser.js
синтаксическая ошибка.
Имейте в виду, что все настройки, указанные в user.js
, будут применяться при каждом запуске Firefox. Так что если вы измените какие-то из них через about:config
, и захотите сохранить эти изменения при перезапуске Firefox, то их необходимо продублировать в user-overrides.js
, после чего запустить ./updater.sh
или updater.bat
.
Не забывайте периодически запускать ./updater.sh
или updater.bat
для обновления user.js
(хотя бы после выхода новой версии Firefox). Более детально процесс обновления описан в wiki проекта.
Мне мало умеренного Hardening, хочу всё по-максимуму!
Ну, в этом случае вот, что стоит делать дальше:
- Отменить ослабляющие защиту изменения в
user-overrides.js
.
- Вместо отмены блокировки Workers заблокировать их глобально в uMatrix.
- Скрыть IP через Tor и/или публичный VPN сервис.
- Поставить расширение Privacy-Oriented Origin Policy.
- Поставить расширение Skip Redirect.
- Поставить расширение Temporary Containers.
- Почитать Firefox Search Engine Cautions, Recommendations и подчистить настройки поисковых систем в Firefox.
- Удалить встроенные расширения из /usr/lib/firefox/browser/features/.
- Включить глобальную подмену Referer для сторонних сайтов в uMatrix.
Сайт не работает — кто виноват, где чинить?
Я составил список изменений, которые могут нарушить работу сайта, чтобы можно было быстрее найти виноватого. Пометка "(Перекрыто)" означает, что данное изменение есть в оригинальном user.js
, но оно отключено моим user-overrides.js
.
- Расширение: CanvasBlocker
- Может подделывать чтение Canvas 2D.
- Может подделывать чтение WebGL.
- Может подделывать чтение Audio API.
- Может подделывать чтение history.length.
- Может защищать window.name и window.opener.
- Может подделывать чтение DOMRect API.
- Может блокировать data://.
- Расширение: CSS Exfil Protection
- Чистит/блокирует опасные правила CSS.
- Расширение: ETag Stoppa
- Удаляет из ответа сервера заголовок ETag:.
- Расширение: Firefox Multi-Account Containers
- Изолирует вкладки (куки, localStorage, etc.) относящиеся к разным контейнерам.
- Расширение: HTTPS Everywhere
- Подменяет http:// запросы на https:// на известных ему сайтах.
- Расширение: Neat URL
- Удаляет из url необязательные параметры.
- Расширение: uBlock Origin
- Удаляет со страниц отдельные элементы DOM.
- Блокирует загрузку отдельных ресурсов по типу и/или url.
- Может блокировать все popup на сайте.
- Может блокировать нестандартные шрифты на сайте.
- Может блокировать pre-fetching.
- Может блокировать <a ping> и sendBeacon.
- Может блокировать отчёты CSP.
- Расширение: uMatrix
- Блокирует загрузку отдельных ресурсов по типу и домену.
- Может блокировать mixed content по домену.
- Может блокировать workers по домену.
- Может подменять Referer: по домену.
- Может подменять <noscript> по домену.
- Может блокировать <a ping> и sendBeacon.
- ghacks user.js
- (Перекрыто) Установка локали в en-US.
- Отключает pre-fetching всего (ссылок, DNS, onMouseOver, etc.).
- Отключает <a ping>.
- Отключает IPv6 (утечка MAC, в т.ч. через некоторые VPN).
- (Перекрыто) Отключает HTTP/2 и Alt-Svc: (fingerprinting).
- (Перекрыто) Отключает /etc/hosts и локальный DNS при использовании SOCKS.
- (Перекрыто) Отключает :visited (утечка истории).
- (Перекрыто) Отключает date/time picker (утечка локали).
- Отключает cross-origin HTTP Auth (фишинг учётных записей).
- (Перекрыто) Делает обязательной проверку https-сертификата через OCSP.
- Запрещает SHA1 https-сертификаты (может ломать локальный антивирус/MITM).
- Ужесточает Public Key Pinning (может ломать локальный антивирус/MITM).
- (Перекрыто) Блокирует пассивный mixed content.
- Блокирует mixed content запросы из Flash.
- (Перекрыто) Отключает нестандартные шрифты (fingerprinting).
- Ограничивает поддержку шрифтов (высокая вероятность уязвимостей).
- Отключает cross-origin Referer: если не совпадает базовый домен.
- Отключает DRM-плагины.
- (Перекрыто) Отключает OpenH264 Video Codec для видео-чата WebRTC.
- (Перекрыто) Отключает WebRTC (утечка IP, в т.ч. через VPN).
- Отключает WebGL (высокая вероятность уязвимостей).
- (Перекрыто) Ограничивает фичи WebGL если его включить (высокая вероятность уязвимостей).
- Отключает screen sharing.
- Отключает чтение из canvas (fingerprinting).
- (Перекрыто) Отключает авто-проигрывание HTML5 media.
- Запрещает блокировать новые фичи window.open.
- Запрещает контроль положения и размера при открытии нового окна.
- Ограничивает возможность открыть popup событиями click и dblclick.
- (Перекрыто) Отключает workers (майнеры, Meltdown/Spectre).
- Запрещает доступ к clipboard.
- Блокирует событие beforeunload.
- Отключает asm.js (высокая вероятность уязвимостей).
- Отключает WebAssembly.
- Отключает Intersection Observer API (стабильность, определение блокировщика рекламы).
- Отключает Shared Memory (Spectre).
- Добавляет
rel=noopener
для ссылок сtarget=_blank
(безопасность). - Отключает hardware acceleration (fingerprinting).
- Отключает Web Audio API (fingerprinting).
- Отключает sendBeacon.
- Блокирует встроенное веб-содержимое на страницах file://.
- Отключает MathML (уменьшение поверхности атаки).
- (Перекрыто) Блокирует сторонние куки.
- Отключает offline cache.
- (Перекрыто) Включает first party isolation (может сломать кросс-доменный логин).
- (Перекрыто) Включает resist fingerprinting (подделывает размеры/ориентацию экрана, таймзону, данные о сети, железе, версии и настройках браузера; огрубляет точность времени; блокирует доступ к сенсорам, геолокации; скрывает нажатия Shift и Alt; etc.).
- Мой user-overrides.js
- Блокирует сторонние куки известных трекеров.
- Отключает TLS 1.0, 1.1.
- Отключает слабые алгоритмы TLS.
Забавные факты
Отключение телеметрии Firefox, которое делает большинство продвинутых пользователей, внезапно, имеет неприятный побочный эффект: наше мнение перестаёт интересовать разработчиков Mozilla. Например, отказ от ALSA в пользу PulseAudio они объяснили тем фактом, что по данным телеметрии практически все пользователи используют PulseAudio. Аргумент "продвинутые пользователи, избегающие PulseAudio, обычно отключают телеметрию" ими не принимался, не смотря на то, что на этом настаивало много разных людей (я, кстати, тоже так работаю — ни PulseAudio, ни телеметрии).
В Firefox есть три большие фичи, которые должны усиливать безопасность: контейнеры, FPI (first party isolation) и RFP (resist fingerprinting). На данный момент какой-то толк в этом смысле от контейнеров можно получить только при использовании расширения Temporary Containers (упомянутого выше, в разделе "Мне мало умеренного Hardening") — но я слабо представляю себе юзабилити браузера, который притворяется что каждая новая вкладка открывается в отдельном браузере. Остальные две фичи всё ещё ломают множество сайтов и важные расширения, поэтому использовать их нельзя. Получается, что фичи вроде бы есть, а толку от них пока что нет.
Согласно https://html5test.com после реализации описанного в этой статье поддержка фич HTML5 уменьшается с 508 из 555 (только расширения, без user.js
) до 493 (с user.js
и моим user-overrides.js
).