Seguridad
Para información sobre cómo revelar las vulnerabilidad de Electrón dirigirse a SECURITY.md.
Para las vulnerabilidades de Chromium: Electron se mantiene al día con versiones alternativas de Chromium. Para más información, ver el documento Electron Release Timelines.
Prólogo
Como desarrolladores web, solemos disfrutar de la sólida red de seguridad del navegador — los riesgos asociados con el código que escribimos son relativamente pequeños. A nuestras páginas web se les concede poderes limitados en un sandbox, y confiamos en que nuestros usuarios disfrutan un buscador construido por un gran equipo de ingenieros que es capaz de responder rápidamente a recientes amenazas de seguridad descubiertas.
Cuando se trabaje con Electron, es importante entender que Electron no es un navegador web. Te permite construir aplicaciones de escritorio llenas de utilidades con tecnologías web familiares, pero tu código tiene mucho más poder. JavaScript puede acceder a los archivos del sistema, actividades del usuario y más. Esto permite que construyas aplicaciones nativas de alta calidad, pero los riesgos inherentes de seguridad escalan con el poder adicional concedido a tu código.
Con eso en mente, ten en cuenta que mostrar contenido arbitrario proveniente de fuentes poco confiables viene con un riesgo severo que Electron no está diseñado para manejar. De hecho, las aplicaciones Electron más populares (Atom, Slack, Visual Studio Code, etc) muestran principalmente contenido local (o confiable, contenido remoto seguro sin integración de Node) — si tu aplicación ejecuta código desde una fuente en línea, es tu responsabilidad el asegurarte de que el código no es malicioso.
Pautas generales
La seguridad es responsabilidad de todos
Es importante recordar que la seguridad de tu aplicación de Electron es el resultado de la seguridad general de los cimientos del framework (Chromium, Node.js), de Electron en sí mismo, todas las dependencias de NPM y tu propio código. Por tanto, es tu responsabilidad seguir algunas importantes mejores prácticas:
-
Mantenga su aplicación actualizada con la última versión liberada de Electron. Cuando libere su producto, también está compartiendo un conjunto compuesto de Electron, librerías compartidas de Chromium y Node.js. Vulnerabilidades afectando a estos componentes pueden impactar en la seguridad de su aplicación. Al actualizar Electron a la última versión, te aseguras de que las vulnerabilidades críticas (como los bypasses de nodeIntegration) ya estén corregidas y no puedan ser explotadas en tu aplicación. Para más informacón, vea "Use a current version of Electron".
-
**Evalue sus dependencias.**Mientras NPM provee más de medio millón de paquetes reusables, es su responsabilidad la elección de librerías confiables de terceros. Si utiliza librerías desactualizadas afectadas por vulnerabilidades conocidas o basado en código escasamente mantenido, la seguridad de su aplicación puede estar en peligro.
-
Adopte prácticas de programación segura. La primera línea de defensa de su aplicación es su propio código. Vulnerabilidades usuales, tales como Cross-Site Scripting (XSS), tienen un alto impacto en la seguridad en las aplicaciones Electron así es altamente recomendable adoptar políticas confiables de buenas prácticas en el desarrollo de software y realizar pruebas de seguridad.
Aislamiento para contenido no confiable
Un problema de seguridad existe siempre que recibes código de un lugar no confiable (e.g. un servidor remoto) y lo ejecutas localmente. Como un ejemplo, considera una página web remota siendo mostrada dentro de un default BrowserWindow
. Si un atacante de algún modo se las arregla para cambiar dicho contenido (bien sea atacando la fuente directamente, o interviniendo entre su aplicación y el destino real), será capaz de ejecutar códigos nativos en la máquina del usuario.
Bajo ninguna circunstancia deberías cargar y ejecutar código remoto con la integración de Node.js activada. En su lugar, use solo archivos locales (empaquetados junto con su aplicación) para ejecutar código Node.js. Para mostrar contenido remoto, use la etiqueta <webview>
o un WebContentsView
y asegúrese de desactivar el nodeIntegration
y activar contextIsolation
.
Las advertencias y recomendaciones de seguridad se imprimen en la consola de desarrollador. Solo se muestran cuando el nombre del binario es Electron, lo que indica que un programador está mirando actualmente a la consola.
Usted puede activar o desactivar estas advertencias forzosamente configurando ELECTRON_ENABLE_SECURITY_WARNINGS
o ELECTRON_DISABLE_SECURITY_WARNINGS
ya sea en process.env
o en el objeto window
.
Lista de comprobación: Recomendaciones de seguridad
Al menos debes seguir los siguientes pasos para mejorar la seguridad de su aplicación:
- Solo carga contenido seguro
- Desactiva la integración Node.js en todas las renderizadores que muestran el contenido remoto
- Activar el aislamiento de contexto en todos los renderizadores
- Activar el aislamiento del proceso
- Usar
ses.setPermissionRequestHandler()
en todas las sesiones que cargan contenido remoto - No desactives
webSecurity
- Define un
Content-Security-Policy
y usa reglas estrictas (i.e.script-src 'self'
) - No active
allowRunningInsecureContent
- No active ajustes experimentales
- No use
enableBlinkFeatures
<webview>
: No useallowpopups
<webview>
: Verificar opciones y parámetros- Deshabilitar o limitar navegación
- Deshabilitar o limitar la generación de nuevas ventanas
- No utilice
shell.openExternal
con contenido no confiable - Usar una versión actual de Electron
- Validar el
sender
de todos los mensajes IPC - Evite el uso del protocolo
file://
y prefiera el uso de protocolos personalizados - Compruebe qué fusibles puede cambiar
Para automatizar la detección de configuraciones incorrectas y patrones inseguros, es posible usar Electronegativity. Para detalles adicionales sobre potenciales debilidades y errores en la implementación durante el desarrollo de aplicaciones usando Electron, consulte guía para desarrolladores y auditores.
1. Solo carga contenido seguro
Cualquier recurso no incluido con tu aplicación debería ser cargado usando un protocolo de seguridad como HTTPS
. En otras palabras, no uses protocolos inseguros como HTTP
. De manera similar, recomendamos el uso de WSS
antes de WS
, FTPS
antes de FTP
, y así.
¿Por què?
HTTPS
tiene dos beneficios principales:
- Asegura la integridad de los datos, afirmando que los datos no fueron modificados durante la transmisión entre tu aplicación y el host.
- Encripta el tráfico entre tu usuario y el host destino, haciendo más difícil escuchar a escondidas la información enviada entre tu aplicación y el host.