Spec-Zone.ru › Electron

Процесс песочницы

Одна из ключевых функций безопасности в Chromium заключается в том, что процессы могут выполняться в песочнице. Песочница ограничивает ущерб, который может причинить вредоносный код, ограничивая доступ к большинству системных ресурсов — процессы в песочнице могут свободно использовать только циклы ЦП и память. Для выполнения операций, требующих дополнительных привилегий, процессы в песочнице используют выделенные каналы связи для делегирования задач более привилегированным процессам.

В Chromium песочница применяется к большинству процессов, кроме основного процесса. Это включает процессы рендеринга, а также служебные процессы, такие как аудиосервис, сервис GPU и сетевой сервис.

Дополнительную информацию можно найти в документе по проектированию песочницы Chromium: Документ по проектированию песочницы.

Политики песочницы Electron​

Electron поставляется со смешанной средой песочницы, что означает, что процессы в песочнице могут работать наряду с привилегированными процессами. По умолчанию процессы рендеринга не находятся в песочнице, но служебные процессы — находятся. Обратите внимание, что, как и в Chromium, основной (браузерный) процесс привилегирован и не может быть помещен в песочницу.

Исторически этот смешанный подход к песочнице был установлен, потому что наличие Node.js в процессе рендеринга является чрезвычайно мощным инструментом для разработчиков приложений. К сожалению, эта функция также является столь же большой уязвимостью безопасности.

Теоретически, непесочница рендеринга не является проблемой для настольных приложений, которые отображают только доверенный код, но они делают Electron менее безопасным, чем Chromium, для отображения недоверенного веб-контента. Однако даже якобы доверенный код может быть опасен — существует бесчисленное множество векторов атаки, которые могут использовать злоумышленники, от межсайтовых сценариев до вставки содержимого и атак «человек посередине» на удалённо загруженные веб-сайты, чтобы назвать лишь несколько. По этой причине мы рекомендуем включить песочницу рендеринга для подавляющего большинства случаев на всякий случай.

Обратите внимание, что в трекере проблем активно обсуждается возможность включения песочницы рендеринга по умолчанию. Подробнее см. #28466.

Поведение песочницы в Electron​

Процессы в песочнице в Electron ведут себя в большинстве случаев так же, как и в Chromium, но Electron имеет несколько дополнительных концепций, которые необходимо учитывать, так как он взаимодействует с Node.js.

Процессы рендеринга​

Когда процессы рендеринга в Electron находятся в песочнице, они ведут себя так же, как и обычный рендер Chrome. У рендера в песочнице не будет инициализирована среда Node.js.

Следовательно, когда песочница включена, процессы рендеринга могут выполнять привилегированные задачи (например, взаимодействие с файловой системой, внесение изменений в систему или запуск дочерних процессов) только путем делегирования этих задач главному процессу через межпроцессное взаимодействие (IPC).

Скрипты предварительной загрузки​

Для того, чтобы позволить процессам рендеринга взаимодействовать с главным процессом, скрипты предварительной загрузки, прикрепленные к рендерам в песочнице, по-прежнему будут иметь доступ к подмножеству полифиллированных API Node.js. Функция, аналогичная модулю Node's require, но может импортировать только подмножество встроенных модулей Electron и Node:

  • electron (только модули процесса рендеринга)
  • events
  • timers
  • url

Кроме того, скрипт предварительной загрузки также полифиллит определённые примитивы Node.js как глобальные переменные:

  • Buffer
  • process
  • clearImmediate
  • setImmediate

Поскольку функция require является полифиллом с ограниченной функциональностью, вы не сможете использовать модули CommonJS для разделения вашего скрипта предварительной загрузки на несколько файлов. Если вам нужно разделить код предварительной загрузки, используйте сборщик, такой как webpack или Parcel.

Обратите внимание, что, поскольку среда, представленная скрипту preload , существенно более привилегирована, чем среда рендера в песочнице, всё ещё возможно утечка привилегированных API в недоверенный код, работающий в процессе рендеринга, если не включен contextIsolation.

Настройка песочницы​

Включение песочницы для одного процесса​

В Electron песочницу рендеринга можно включить на основе каждого процесса с помощью параметра sandbox: true в конструкторе BrowserWindow.

// main.js
app.whenReady().then(() => {
  const win = new BrowserWindow({
    webPreferences: {
      sandbox: true
    }
  })
  win.loadURL('https://google.com')
})

Включение песочницы глобально​

Если вы хотите принудительно включить песочницу для всех рендеров, вы также можете использовать API app.enableSandbox. Обратите внимание, что этот API необходимо вызвать до события ready приложения.

// main.js
app.enableSandbox()
app.whenReady().then(() => {
  // no need to pass `sandbox: true` since `app.enableSandbox()` was called.
  const win = new BrowserWindow()
  win.loadURL('https://google.com')
})

Отключение песочницы Chromium (только для тестирования)​

Вы также можете полностью отключить песочницу Chromium с помощью флага командной строки --no-sandbox, который отключит песочницу для всех процессов (включая служебные процессы). Мы настоятельно рекомендуем использовать этот флаг только для целей тестирования и никогда в производстве.

Обратите внимание, что параметр sandbox: true по-прежнему отключит среду Node.js рендера.

Примечание об отрисовке недоверенного содержимого​

Отрисовка недоверенного содержимого в Electron всё ещё является сравнительно неизведанной территорией, хотя некоторые приложения достигают успеха (например, Beaker Browser). Наша цель — максимально приблизиться к Chrome в плане безопасности содержимого в песочнице, но в конечном итоге мы всегда будем отставать из-за нескольких фундаментальных проблем:

  1. У нас нет тех же ресурсов и опыта, что у Chromium, для обеспечения безопасности своего продукта. Мы делаем всё возможное, используя имеющиеся средства, наследуя всё, что можем от Chromium, и быстро реагируя на проблемы безопасности, но Electron не может быть таким же безопасным, как Chromium, без ресурсов, которые Chromium может выделить.
  2. Некоторые функции безопасности в Chrome (такие как Safe Browsing и Certificate Transparency) требуют централизованного органа и выделенных серверов, которые противоречат целям проекта Electron. Поэтому мы отключаем эти функции в Electron, что снижает безопасность по сравнению с Chrome.
  3. Существует только один Chromium, тогда как существуют тысячи приложений, построенных на Electron, каждое из которых ведет себя несколько по-разному. Учёт этих различий может привести к огромному объёму возможных случаев, что затрудняет обеспечение безопасности платформы в необычных сценариях использования.
  4. Мы не можем напрямую распространять обновления безопасности пользователям, поэтому мы полагаемся на поставщиков приложений, чтобы они обновляли версию Electron, лежащую в основе их приложения, чтобы обновления безопасности достигали пользователей.

Хотя мы прилагаем все усилия для обратной портирования исправлений безопасности Chromium в более старые версии Electron, мы не гарантируем, что каждое исправление будет обратной портировано. Лучший способ оставаться в безопасности — использовать последнюю стабильную версию Electron.

© GitHub Inc.
Licensed under the MIT license.
https://www.electronjs.org/docs/latest/tutorial/sandbox

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API