Документ описывает, что приложение делает с системой и данными, и какими
проверками это закреплено. Каждое утверждение здесь либо проверяется тестом из
tests/, либо указывает на конкретный файл — чтобы его можно было перепроверить,
а не принимать на слово.
Версия документа соответствует состоянию репозитория на 2.4.1.
| Вопрос | Ответ |
|---|---|
| Ходит ли в сеть | Нет. Ни одного внешнего адреса в поставляемых файлах |
| Телеметрия, аналитика | Нет. Собственной нет, служебные обращения Chromium выключены явно |
| Обновляет ли себя само | Нет. Автообновления нет вовсе |
| Нужны ли права администратора | Нет |
| Какие данные хранит | Только собственные настройки и загруженные пользователем файлы |
| Куда пишет | Каталог данных приложения текущего пользователя |
| Открыт ли режим разработчика | Нет. В собранном приложении DevTools недоступны |
Приложение не обращается в сеть ни при запуске, ни в работе.
- Шрифты (Inter, JetBrains Mono) поставляются файлами в
fonts/и подключаются локальными@font-face. Внешних CDN нет. - Служебные обращения Chromium отключены явными ключами в
electron-main.js: обновление компонентов, «подсказки оптимизации», сбор вариаций конфигурации. Без этих ключей движок обращался бы к своим сервисам сам, без единой строки кода приложения. - Content Security Policy в каждом окне:
default-src 'self',object-src 'none', внешние источники не разрешены. Загрузка изображения или звука возможна только из файла на диске (data:после проверки) — не по ссылке.
Закреплено тестами tests/release-gates.test.js: сборка падает, если в
поставляемом файле появится адрес http(s)://, если шрифт начнёт грузиться не из
fonts/, или если CSP разрешит внешний источник.
Автообновления нет: build.publish равен null, зависимостей вида
electron-updater в проекте нет. Приложение не проверяет наличие новых версий и
не подменяет собственные файлы. Новая версия устанавливается только обычной
установкой поверх старой.
Проверяется тем же файлом тестов, включая запрет появления такой зависимости.
Приложение хранит:
- настройки окон, цвета, масштабы, позиции — в
localStorageокна (каталог данных приложения текущего пользователя); - загруженные пользователем звуки и фоновое изображение — там же, в виде
data:-URL внутри настроек.
Приложение не читает пользовательские файлы само: и звук, и изображение
выбираются пользователем в системном диалоге. Больше ничего с диска не читается
и никуда не пишется. Кнопка «Сбросить настройки» стирает всё сохранённое через
session.clearStorageData().
Реестр всех используемых ключей хранения — CONFIG.STORAGE_KEYS в
constants.js; tests/storage-keys.test.js сверяет его с кодом в обе стороны и
падает на ключе, который пишется, но никогда не читается (или наоборот).
Все четыре окна создаются с одинаковыми ограничениями:
nodeIntegration: false— в странице нет доступа к Node.js;contextIsolation: true— код страницы и мост изолированы;sandbox: true— рендерер работает в песочнице ОС;devToolsвключаются только при одновременном выполнении двух условий: запуск с ключом--devИ приложение не собрано (!app.isPackaged). В собранном приложении открыть DevTools нельзя никаким ключом.
Обмен между страницей и главным процессом идёт через preload.js с белым
списком каналов (channel-validator.js), раздельным для отправки и приёма.
Канала «на всё» нет; неизвестный канал отбрасывается. Числовые параметры
изменения размера, позиции и прозрачности проверяются на конечность и границы —
страница не может попросить главный процесс о произвольном действии.
Навигация заблокирована: переход на адрес не по схеме file:// отменяется,
window.open запрещён (hardenWindow в electron-main.js).
Проверяется tests/release-gates.test.js (перечисляет ВСЕ конструкторы окна и
требует полный набор ограничений от каждого — добавить окно без них нельзя),
tests/channel-validator.test.js (белые списки в двух файлах не расходятся) и
scripts/verify-packed.js (те же проверки, но на упакованном артефакте).
- Изображения: ограничение размера, проверка MIME-типа и сигнатуры файла
(для WebP — наличие
RIFF/WEBP). SVG исключён из разрешённых намеренно: это вектор исполнения скрипта. - Аудио: ограничение 5 МБ, файл с пустым типом отклоняется.
- Значения цветов проверяются регулярным выражением перед подстановкой в CSS,
адреса — конструктором
URL(). Пользовательский текст экранируется (escapeHTML).
См. security.js и тесты tests/security.test.js,
tests/security-extended.test.js.
Песочнице Chromium нужен либо вспомогательный бинарник chrome-sandbox с
SUID-битом и владельцем root, либо непривилегированные user namespaces в ядре.
- deb — SUID-помощник настраивается при установке (
build/linux-after-install.sh), песочница работает независимо от настроек ядра. - AppImage — установочного шага нет, выставить SUID некому, а user namespaces
доступны не на всех системах (жёсткие ядра; в Ubuntu 24.04 их ограничивает
профиль AppArmor). Поэтому AppImage — единственная цель сборки, которая
запускается с
--no-sandbox. Если песочница важна, используйте deb.
Разделение проверяется tests/release-gates.test.js и, на собранных пакетах,
scripts/verify-linux-sandbox.js в CI.
- Сборки не подписаны.
mac.identityравенnull, подпись Windows отключена. Практические следствия: на macOS скачанное приложение не запускается двойным щелчком без явного разрешения в системных настройках; на Windows возможно предупреждение о неизвестном издателе. Подпись требует сертификатов; когда они появятся, включается настройками сборки без изменений в коде. - Проверка целостности пакета ограничена содержимым
app.asar, которое сверяется скриптом при сборке. - Ручная проверка установщика Windows (диалог удаления настроек при деинсталляции) не автоматизирована.
Через приватный отчёт о уязвимости в разделе Security репозитория на GitHub (вкладка Security → Report a vulnerability). Пожалуйста, не открывайте публичную задачу до исправления.
Что помогает разобраться быстрее: версия приложения, операционная система, шаги воспроизведения, ожидаемое и фактическое поведение. Логи приложения (electron-log) могут содержать пути файлов — просмотрите их перед отправкой.