2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								# `sandbox` Option
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2019-03-21 14:41:53 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								> Create a browser window with a sandboxed renderer. With this
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-29 14:27:01 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								option enabled, the renderer must communicate via IPC to the main process in order to access node APIs.
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-29 14:27:01 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								One of the key security features of Chromium is that all blink rendering/JavaScript
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								code is executed within a sandbox. This sandbox uses OS-specific features to ensure
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								that exploits in the renderer process cannot harm the system.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								In other words, when the sandbox is enabled, the renderers can only make changes
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								to the system by delegating tasks to the main process via IPC.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								[Here's](https://www.chromium.org/developers/design-documents/sandbox) more
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								information about the sandbox.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-07-20 14:58:19 -03:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								Since a major feature in Electron is the ability to run Node.js in the
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-29 14:27:01 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								renderer process (making it easier to develop desktop applications using web
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								technologies), the sandbox is disabled by electron. This is because
							 | 
						
					
						
							
								
									
										
										
										
											2018-07-20 14:58:19 -03:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								most Node.js APIs require system access. `require()` for example, is not
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-29 14:27:01 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								possible without file system permissions, which are not available in a sandboxed
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								environment.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Usually this is not a problem for desktop applications since the code is always
							 | 
						
					
						
							
								
									
										
										
										
											2018-07-20 14:58:19 -03:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								trusted, but it makes Electron less secure than Chromium for displaying
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								untrusted web content. For applications that require more security, the
							 | 
						
					
						
							
								
									
										
										
										
											2018-07-20 14:58:19 -03:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								`sandbox` flag will force Electron to spawn a classic Chromium renderer that is
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								compatible with the sandbox.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-07-20 14:58:19 -03:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								A sandboxed renderer doesn't have a Node.js environment running and doesn't
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								expose Node.js JavaScript APIs to client code. The only exception is the preload script,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								which has access to a subset of the Electron renderer API.
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Another difference is that sandboxed renderers don't modify any of the default
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-29 14:27:01 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								JavaScript APIs. Consequently, some APIs such as `window.open` will work as they
							 | 
						
					
						
							
								
									
										
										
										
											2018-07-20 14:58:19 -03:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								do in Chromium (i.e. they do not return a [`BrowserWindowProxy`](browser-window-proxy.md)).
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								## Example
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-05-08 00:16:09 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								To create a sandboxed window, pass `sandbox: true` to `webPreferences`:
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```js
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								let win
							 | 
						
					
						
							
								
									
										
										
										
											2020-02-03 16:43:22 -06:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								app.whenReady().then(() => {
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  win = new BrowserWindow({
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    webPreferences: {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								      sandbox: true
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    }
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  })
							 | 
						
					
						
							
								
									
										
										
										
											2017-09-13 20:53:30 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  win.loadURL('http://google.com')
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								})
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-07-20 14:58:19 -03:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								In the above code the [`BrowserWindow`](browser-window.md) that was created has Node.js disabled and can communicate
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								only via IPC. The use of this option stops Electron from creating a Node.js runtime in the renderer. Also,
							 | 
						
					
						
							
								
									
										
										
										
											2020-03-30 23:06:25 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								within this new window `window.open` follows the native behavior (by default Electron creates a [`BrowserWindow`](browser-window.md)
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-29 14:27:01 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								and returns a proxy to this via `window.open`).
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-04-02 09:32:18 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								[`app.enableSandbox`](app.md#appenablesandbox) can be used to force `sandbox: true` for all `BrowserWindow` instances.
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-29 14:27:01 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```js
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								let win
							 | 
						
					
						
							
								
									
										
										
										
											2019-03-21 14:41:53 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								app.enableSandbox()
							 | 
						
					
						
							
								
									
										
										
										
											2020-02-03 16:43:22 -06:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								app.whenReady().then(() => {
							 | 
						
					
						
							
								
									
										
										
										
											2019-03-21 14:41:53 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  // no need to pass `sandbox: true` since `app.enableSandbox()` was called.
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  win = new BrowserWindow()
							 | 
						
					
						
							
								
									
										
										
										
											2017-09-13 20:53:30 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  win.loadURL('http://google.com')
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								})
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								## Preload
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								An app can make customizations to sandboxed renderers using a preload script.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Here's an example:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```js
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								let win
							 | 
						
					
						
							
								
									
										
										
										
											2020-02-03 16:43:22 -06:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								app.whenReady().then(() => {
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  win = new BrowserWindow({
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    webPreferences: {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								      sandbox: true,
							 | 
						
					
						
							
								
									
										
										
										
											2019-03-28 11:38:51 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								      preload: path.join(app.getAppPath(), 'preload.js')
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    }
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  })
							 | 
						
					
						
							
								
									
										
										
										
											2017-09-13 20:53:30 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  win.loadURL('http://google.com')
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								})
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								and preload.js:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```js
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								// This file is loaded whenever a javascript context is created. It runs in a
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-14 10:36:54 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								// private scope that can access a subset of Electron renderer APIs. Without
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								// contextIsolation enabled, it's possible to accidentally leak privileged
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								// globals like ipcRenderer to web content.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								const { ipcRenderer } = require('electron')
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								const defaultWindowOpen = window.open
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-14 10:36:54 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								window.open = function customWindowOpen (url, ...args) {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  ipcRenderer.send('report-window-open', location.origin, url, args)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  return defaultWindowOpen(url + '?from_electron=1', ...args)
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Important things to notice in the preload script:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-07-20 14:58:19 -03:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								- Even though the sandboxed renderer doesn't have Node.js running, it still has
							 | 
						
					
						
							
								
									
										
										
										
											2019-05-20 17:34:57 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  access to a limited node-like environment: `Buffer`, `process`, `setImmediate`,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  `clearImmediate` and `require` are available.
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-29 14:27:01 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								- The preload script must be contained in a single script, but it is possible to have
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  complex preload code composed with multiple modules by using a tool like
							 | 
						
					
						
							
								
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  webpack or browserify. An example of using browserify is below.
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								To create a browserify bundle and use it as a preload script, something like
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								the following should be used:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2017-11-20 14:18:24 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								```sh
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  browserify preload/index.js \
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    -x electron \
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    --insert-global-vars=__filename,__dirname -o preload.js
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								```
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								The `-x` flag should be used with any required module that is already exposed in
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								the preload scope, and tells browserify to use the enclosing `require` function
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-29 14:27:01 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								for it. `--insert-global-vars` will ensure that `process`, `Buffer` and
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								`setImmediate` are also taken from the enclosing scope(normally browserify
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								injects code for those).
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Currently the `require` function provided in the preload scope exposes the
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								following modules:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2017-08-08 17:10:44 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								- `electron`
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  - `crashReporter`
							 | 
						
					
						
							
								
									
										
										
										
											2019-03-21 14:41:53 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  - `desktopCapturer`
							 | 
						
					
						
							
								
									
										
										
										
											2017-08-08 17:10:44 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  - `ipcRenderer`
							 | 
						
					
						
							
								
									
										
										
										
											2019-03-21 14:41:53 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  - `nativeImage`
							 | 
						
					
						
							
								
									
										
										
										
											2017-08-08 17:10:44 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  - `webFrame`
							 | 
						
					
						
							
								
									
										
										
										
											2019-03-21 14:41:53 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								- `events`
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								- `timers`
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								- `url`
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-09-14 10:36:54 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								More may be added as needed to expose more Electron APIs in the sandbox.
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-05-19 10:17:31 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								## Rendering untrusted content
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Rendering untrusted content in Electron is still somewhat uncharted territory,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								though some apps are finding success (e.g. Beaker Browser). Our goal is to get
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								as close to Chrome as we can in terms of the security of sandboxed content, but
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								ultimately we will always be behind due to a few fundamental issues:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								1. We do not have the dedicated resources or expertise that Chromium has to
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   apply to the security of its product. We do our best to make use of what we
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   have, to inherit everything we can from Chromium, and to respond quickly to
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   security issues, but Electron cannot be as secure as Chromium without the
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   resources that Chromium is able to dedicate.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								2. Some security features in Chrome (such as Safe Browsing and Certificate
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   Transparency) require a centralized authority and dedicated servers, both of
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   which run counter to the goals of the Electron project. As such, we disable
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   those features in Electron, at the cost of the associated security they
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   would otherwise bring.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								3. There is only one Chromium, whereas there are many thousands of apps built
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   on Electron, all of which behave slightly differently. Accounting for those
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   differences can yield a huge possibility space, and make it challenging to
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   ensure the security of the platform in unusual use cases.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								4. We can't push security updates to users directly, so we rely on app vendors
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   to upgrade the version of Electron underlying their app in order for
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								   security updates to reach users.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								Here are some things to consider before rendering untrusted content:
							 | 
						
					
						
							
								
									
										
										
										
											2017-03-09 09:23:03 -03:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2019-05-20 17:34:57 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								- A preload script can accidentally leak privileged APIs to untrusted code,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  unless [`contextIsolation`](../tutorial/security.md#3-enable-context-isolation-for-remote-content)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  is also enabled.
							 | 
						
					
						
							
								
									
										
										
										
											2020-05-19 10:17:31 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								- Some bug in the V8 engine may allow malicious code to access the renderer
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  preload APIs, effectively granting full access to the system through the
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  `remote` module. Therefore, it is highly recommended to [disable the `remote`
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  module](../tutorial/security.md#15-disable-the-remote-module).
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  If disabling is not feasible, you should selectively [filter the `remote`
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  module](../tutorial/security.md#16-filter-the-remote-module).
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								- While we make our best effort to backport Chromium security fixes to older
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  versions of Electron, we do not make a guarantee that every fix will be
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  backported. Your best chance at staying secure is to be on the latest stable
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  version of Electron.
							 |