Solución de vulnerabilidad de WebPreferences
Se ha descubierto una vulnerabilidad de ejecución de un código remoto la cual afecta aplicaciones con la capacidad de abrir ventanas anidadas hijas en versiones de Electron (3.0.0-beta.6, 2.0.7, 1.8.7, and 1.7.15). La vulnerabilidad ha sido asignada al identificador CVE CVE-2018-15685.
Plataformas afectadas
Esto te afecta si:
- Has incrustado cualquier contenido de usuario remoto, incluso en una sandbox
- Aceptas inputs de usuario con cualquier vulnerabilidad XSS
Detalles
Esto te afecta si cualquier código de usuario se ejecuta dentro de iframe
/ si puede crear un iframe
. Dada la posibilidad de una vulnerabilidad XSS, se puede asumir que la mayoría de aplicaciones son vulnerables a este caso.
Esto te afecta si abres cualquiera de tus ventanas con las opciones nativeWindowOpen: true
o sandbox: true
. A pesar de que esta vulnerabilidad también requiere que exista una vulnerabilidad XSS en tu aplicación, deberías aplicar una de las mitigaciones de abajo si utilizas alguna de estas opciones.
Mitigación
We've published new versions of Electron which include fixes for this vulnerability: 3.0.0-beta.7
, 2.0.8
, 1.8.8
, and 1.7.16
. Le pedimos a todos los desarrolladores de Electron a que actualicen sus aplicaciones a la más reciente versión estable ahora mismo.
If for some reason you are unable to upgrade your Electron version, you can protect your app by blanket-calling event.preventDefault()
on the new-window
event for all webContents
'. Si no utilizas window.open
o ninguna ventana hija en absoluto, entonces esta también es una mitigación válida para tu aplicación.
mainWindow.webContents.on('new-window', (e) => e.preventDefault());
Si dependes de la capacidad de tus ventanas hijas para crear ventanas de nietos, entonces una tercera estrategia de mitigación requiere utilizar el siguiente código en tu ventana de nivel superior:
const enforceInheritance = (topWebContents) => {
const handle = (webContents) => {
webContents.on(
'new-window',
(event, url, frameName, disposition, options) => {
if (!options.webPreferences) {
options.webPreferences = {};
}
Object.assign(
options.webPreferences,
topWebContents.getLastWebPreferences()
);
if (options.webContents) {
handle(options.webContents);
}
}
);
};
handle(topWebContents);
};
enforceInheritance(mainWindow.webContents);
Este código forzará manualmente las ventanas de nivel superior (webPreferences
) sean aplicadas a todas las ventanas hijas de manera infinitamente profunda.
Más información
Esta vulnerabilidad fue encontrada y reportada responsablemente al proyecto Electron por Matt Austin de Contrast Security.
Para aprender más sobre las buenas prácticas para mantener tus aplicaciones Electron seguras, ve nuestro tutorial de seguridad.
Si quieres reportar una vulnerabilidad de Electron, envía un correo electrónico a security@electronjs.org.