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

Electron объединяетNode.js и среды браузера, что делает десктопные приложения очень мощными, но также создаёт определённые риски безопасности.
Правильные политики безопасности могут снизить риски XSS, удалённого выполнения кода (RCE) и утечки данных.


Контрольный список безопасности и распространённые уязвимости

Контрольный список безопасности

  • Включитеизоляцию контекста(contextIsolation)
  • ИспользованиеСкрипт предзагрузки(preload.js) Предоставление безопасных API
  • Не используйте модули Node.js напрямую в процессе рендеринга.
  • Включитережим песочницы(sandbox: true)
  • НастройкаПолитика безопасности контента (CSP)
  • Используйте IPC безопасно, проверяйте источники и входные данные.
  • Ограничьте доступ приложения к системным разрешениям, следуя принципу наименьших привилегий.
  • Избегайте загрузки недоверенного удалённого содержимого

Распространённые риски безопасности

  • Инъекция удалённого содержимого: Загрузка неизвестных URL-адресов или HTML-файлов может привести к выполнению вредоносного JS.
  • Небезопасные вызовы IPC: Процесс рендеринга может вызывать любой метод главного процесса.
  • Произвольное выполнение Node.js: включение в процессе рендерингаnodeIntegrationМожет быть использовано для выполнения системных команд
  • XSS-атака: пользовательский ввод напрямую отображается на странице
  • Уязвимости зависимостей: использование устаревших сторонних библиотек

Изоляция контекста

Подробнее о contextIsolation

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

const mainWindow = new BrowserWindow({
  webPreferences: {
    contextIsolation: true,  // 启用上下文隔离
    preload: path.join(__dirname, 'preload.js'),
    nodeIntegration: false   // 禁止在渲染进程使用 Node.js
  }
})

Зачем нужна изоляция контекста

  • Предотвратить прямой доступ загруженных веб-страниц или сторонних скриптов к Node.js.
  • Предотвратить получение злоумышленниками системных привилегий через XSS.
  • Пусть процесс рендеринга занимается только UI, а главный процесс — системными операциями.

Переход к изолированному контексту

  • ИспользованиеcontextBridge.exposeInMainWorldПредоставление безопасных API
  • Поместите все системные операции в главный процесс и вызывайте их через IPC.

Пример:

// preload.js
const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('api', {
  getData: () => ipcRenderer.invoke('get-data')
})

Процесс рендеринга только вызываетwindow.api.getData(), не может напрямую управлять ОС.


Режим песочницы

Включите песочницу

Режим песочницы заставляет процесс рендеринга работать как обычная веб-страница в браузере, полностью изолированно от среды Node.js.

const mainWindow = new BrowserWindow({
  webPreferences: {
    sandbox: true,
    contextIsolation: true,
    preload: path.join(__dirname, 'preload.js')
  }
})

Ограничения песочницы и меры противодействия

  • Ограничение: процесс рендеринга не может напрямую обращаться к модулям Node.js.
  • Мера противодействия: вызывайте безопасные методы, предоставляемые главным процессом, через IPC.
  • Преимущество: повышает безопасность и предотвращает повреждение системы вредоносными скриптами.

Content Security Policy (CSP)

CSP может предотвращать XSS-атаки и атаки с внедрением данных, ограничивая источники ресурсов, которые могут загружать веб-страницы.

Пример конфигурации CSP

<meta http-equiv="Content-Security-Policy" content="
  default-src 'self';
  script-src 'self';
  style-src 'self' 'unsafe-inline';
  img-src 'self' data:;
  connect-src 'self' https://api.example.com;">

Описание:

  • default-src 'self': По умолчанию разрешать только ресурсы того же источника
  • script-src 'self': Разрешать только локальные скрипты
  • style-src 'self' 'unsafe-inline': Разрешить встроенные стили
  • connect-src: Ограничить домены запросов AJAX / WebSocket

Предотвращение XSS-атак

  • Никогда не используйте напрямую в процессе рендерингаinnerHTMLОтображение пользовательского ввода
  • Экранируйте пользовательский ввод или используйте шаблонизацию фреймворка.

Безопасная IPC-коммуникация

Проверка источника сообщения

Главный процесс должен различать источник процесса рендеринга, чтобы избежать произвольного выполнения.

Пример:

ipcMain.handle('do-action', (event, data) => {
  if (event.senderFrame.url.startsWith('file://')) {
    // 安全来源,执行操作
  } else {
    console.warn('不安全的 IPC 请求被阻止')
  }
})

Проверка входных данных

  • Все данные, передаваемые через IPC, должны проходить проверку типа и области действия.
  • Избегайте внедрения вредоносных команд или путей к файлам
function validateInput(data) {
  if (typeof data !== 'string' || data.length > 100) throw new Error('非法输入')
  return data
}

Принцип наименьших привилегий

  • Предоставляйте процессу рендеринга только необходимую функциональность
  • Не предоставляйте все API Node.js или системные привилегии.
  • Используйте скрипты предзагрузки для управления областью доступа к интерфейсу.

Итог

Суть лучших практик безопасности Electron:Изоляция + Проверка + Наименьшие привилегии:

  • Изоляция: включите изоляцию контекста, режим песочницы
  • Проверка: CSP, защита от XSS, проверка входных данных IPC
  • Ограничьте разрешения: минимизируйте привилегии процесса рендеринга и предоставляйте только необходимые API.

Следование этим принципам может значительно снизить риск атаки на настольные приложения или утечки данных.

Другие расширения