Skip to content

Security: Jkaotlic/timer-widget

Security

SECURITY.md

Безопасность и приватность

Документ описывает, что приложение делает с системой и данными, и какими проверками это закреплено. Каждое утверждение здесь либо проверяется тестом из 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.

Песочница в Linux-пакетах

Песочнице 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.

Известные ограничения

  1. Сборки не подписаны. mac.identity равен null, подпись Windows отключена. Практические следствия: на macOS скачанное приложение не запускается двойным щелчком без явного разрешения в системных настройках; на Windows возможно предупреждение о неизвестном издателе. Подпись требует сертификатов; когда они появятся, включается настройками сборки без изменений в коде.
  2. Проверка целостности пакета ограничена содержимым app.asar, которое сверяется скриптом при сборке.
  3. Ручная проверка установщика Windows (диалог удаления настроек при деинсталляции) не автоматизирована.

Как сообщить об уязвимости

Через приватный отчёт о уязвимости в разделе Security репозитория на GitHub (вкладка Security → Report a vulnerability). Пожалуйста, не открывайте публичную задачу до исправления.

Что помогает разобраться быстрее: версия приложения, операционная система, шаги воспроизведения, ожидаемое и фактическое поведение. Логи приложения (electron-log) могут содержать пути файлов — просмотрите их перед отправкой.

There aren't any published security advisories