Безопасность
Модель угроз 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] и работает только после согласия пользователя:
Согласие привязано к 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. Держите систему и приложение обновлёнными.