Open Stream Deck

Безопасность

Модель угроз SDK 1.0: что исключает формат, как устроена песочница и где границы гарантий.

Цель SDK: установка плагина не должна быть решением «доверяю автору целиком». Плагин видит только то, что ему дало приложение, а всё остальное запрашивает явно.

Что исключено устройством формата

  • В пакете нет исполняемых файлов ОС. Упаковщик и приложение отклоняют PE, ELF и Mach-O под любым именем.
  • Код плагина либо исходный текст JavaScript, либо модуль WebAssembly с одним разрешённым импортом opensd.send. Модуль с другими импортами не установится.
  • Пути внутри архива не могут выйти за пределы папки плагина. Ссылки, специальные файлы и совпадения имён без учёта регистра запрещены.
  • Каждый файл описан в index.json размером и SHA-256. Приложение проверяет их при установке и при каждом запуске: изменённый после установки файл не загрузится.

Песочница исполнения

Каждый плагин работает в отдельной среде:

  • iframe с sandbox="allow-scripts" и уникальным непрозрачным origin, поэтому у плагинов нет общего хранилища и каналов друг с другом;
  • политика default-src 'none': нет eval, сетевых скриптов, IndexedDB, cookies и localStorage;
  • код выполняется в выделенном воркере, у которого нет DOM и доступа к окну приложения;
  • связь с приложением идёт через один MessagePort, и приложение проверяет каждую команду: кнопка должна принадлежать этому плагину, пути картинок не выходят за пакет, data URI ограничены форматом и размером.

Приложение следит за средой: зависший воркер уничтожается через 10 секунд, команды сверх лимита отбрасываются, после сбоя среда пересоздаётся с нарастающей паузой.

Разрешения

Всё, что выходит за песочницу, объявляется в [permissions] и работает только после согласия пользователя:

РазрешениеРискОграничения
loopbackДоступ к программам на компьютереТолько 127.0.0.1 и localhost, только объявленные порты от 1024, не больше 1000 портов в диапазоне
networkПередача данных во внешние сервисыТолько объявленные адреса, они попадают в connect-src политики среды
launchЗапуск программПути фиксированы в манифесте, аргументы тоже; плагин подставляет только числа
clipboardПодмена содержимого буфераТолько запись текста до 64 КиБ, чтения нет

Согласие привязано к SHA-256 от раздела [permissions]. Обновление, которое просит что-то новое, снова попадёт к пользователю на подтверждение. Отзыв разрешения сразу перезапускает плагин без доступа.

Перед согласием стоит понимать область. Например, loopback к порту DevTools браузера или Electron-приложения даёт полный контроль над ним, включая авторизованные сессии.

Страницы настроек

HTML плагина открывается в iframe с sandbox="allow-scripts" и политикой без сети, форм, всплывающих окон и вложенных фреймов. Страница получает от приложения один MessageChannel после загрузки; если она уходит на другой адрес, связь не восстанавливается. Брокеры страницам недоступны, всё внешнее делает плагин.

Ссылки

openUrl открывает только https:// и только в течение 3 секунд после действия пользователя с этим плагином: нажатия кнопки или сообщения со страницы настроек. Плагин не может открывать вкладки в фоне.

Границы гарантий

  • SHA-256 в индексе подтверждает целостность, но не автора. Подписи издателей появятся в следующей версии формата.
  • Песочница движка WebView не ограничивает память JavaScript отдельного воркера. Модули WebAssembly ограничены 64 МиБ памяти.
  • Плагин может злоупотребить тем, что ему разрешили. Разрешения стоит давать так же осознанно, как мобильным приложениям.
  • Безопасность среды опирается на движок WebView: WebView2 на Windows, WKWebView на macOS, WebKitGTK на Linux. Держите систему и приложение обновлёнными.