Electron Desktop Apps
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Electron combina un backend local (con NodeJS) y un frontend (Chromium), aunque carece de algunos de los mecanismos de seguridad de los navegadores modernos.
Por lo general, puedes encontrar el código de la aplicación electron dentro de una aplicación .asar
, para obtener el código necesitas extraerlo:
En el código fuente de una aplicación Electron, dentro de packet.json
, puedes encontrar especificado el archivo main.js
donde se configuran las opciones de seguridad.
Electron tiene 2 tipos de procesos:
Proceso Principal (tiene acceso completo a NodeJS)
Proceso de Renderizado (debería tener acceso restringido a NodeJS por razones de seguridad)
Un proceso de renderizado será una ventana del navegador cargando un archivo:
Los ajustes del proceso de renderizado se pueden configurar en el proceso principal dentro del archivo main.js. Algunas de las configuraciones prevenirán que la aplicación Electron obtenga RCE u otras vulnerabilidades si los ajustes están correctamente configurados.
La aplicación electron podría acceder al dispositivo a través de las APIs de Node, aunque se puede configurar para prevenirlo:
nodeIntegration
- está desactivado
por defecto. Si está activado, permite acceder a las características de Node desde el proceso de renderizado.
contextIsolation
- está activado
por defecto. Si está desactivado, los procesos principal y de renderizado no están aislados.
preload
- vacío por defecto.
sandbox
- está desactivado por defecto. Restringirá las acciones que NodeJS puede realizar.
Integración de Node en Trabajadores
nodeIntegrationInSubframes
- está desactivado
por defecto.
Si nodeIntegration
está habilitado, esto permitiría el uso de APIs de Node.js en páginas web que están cargadas en iframes dentro de una aplicación Electron.
Si nodeIntegration
está deshabilitado, entonces los preloads se cargarán en el iframe.
Ejemplo de configuración:
Algunos RCE payloads de aquí:
Modifica la configuración de start-main y añade el uso de un proxy como:
Si puedes ejecutar localmente una aplicación de Electron, es posible que puedas hacer que ejecute código javascript arbitrario. Consulta cómo en:
Si nodeIntegration está configurado en on, el JavaScript de una página web puede utilizar características de Node.js fácilmente solo llamando a require()
. Por ejemplo, la forma de ejecutar la aplicación calc en Windows es:
El script indicado en esta configuración se carga antes que otros scripts en el renderizador, por lo que tiene acceso ilimitado a las API de Node:
Por lo tanto, el script puede exportar node-features a páginas:
Si contextIsolation
está activado, esto no funcionará
El contextIsolation introduce los contextos separados entre los scripts de la página web y el código interno de JavaScript de Electron para que la ejecución de JavaScript de cada código no afecte al otro. Esta es una característica necesaria para eliminar la posibilidad de RCE.
Si los contextos no están aislados, un atacante puede:
Ejecutar JavaScript arbitrario en el renderer (XSS o navegación a sitios externos)
Sobrescribir el método incorporado que se utiliza en preload o en el código interno de Electron a una función propia
Activar el uso de la función sobrescrita
¿RCE?
Hay 2 lugares donde los métodos incorporados pueden ser sobrescritos: En el código de preload o en el código interno de Electron:
Si hay restricciones aplicadas al hacer clic en un enlace, es posible que puedas eludirlas haciendo un clic medio en lugar de un clic izquierdo normal.
Para más información sobre estos ejemplos, consulta https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 y https://benjamin-altpeter.de/shell-openexternal-dangers/
Al implementar una aplicación de escritorio Electron, asegurar la configuración correcta de nodeIntegration
y contextIsolation
es crucial. Se establece que la ejecución remota de código del lado del cliente (RCE) que apunta a scripts de precarga o al código nativo de Electron desde el proceso principal se previene de manera efectiva con estas configuraciones en su lugar.
Cuando un usuario interactúa con enlaces o abre nuevas ventanas, se activan oyentes de eventos específicos, que son cruciales para la seguridad y funcionalidad de la aplicación:
Estos oyentes son sobrescritos por la aplicación de escritorio para implementar su propia lógica de negocio. La aplicación evalúa si un enlace navegado debe abrirse internamente o en un navegador web externo. Esta decisión se toma típicamente a través de una función, openInternally
. Si esta función devuelve false
, indica que el enlace debe abrirse externamente, utilizando la función shell.openExternal
.
Aquí hay un pseudocódigo simplificado:
Las mejores prácticas de seguridad de Electron JS desaconsejan aceptar contenido no confiable con la función openExternal
, ya que podría llevar a RCE a través de varios protocolos. Los sistemas operativos admiten diferentes protocolos que podrían desencadenar RCE. Para ejemplos detallados y más explicaciones sobre este tema, se puede consultar este recurso, que incluye ejemplos de protocolos de Windows capaces de explotar esta vulnerabilidad.
Ejemplos de exploits de protocolos de Windows incluyen:
Deshabilitar contextIsolation
permite el uso de <webview>
tags, similar a <iframe>
, para leer y exfiltrar archivos locales. Un ejemplo proporcionado demuestra cómo explotar esta vulnerabilidad para leer el contenido de archivos internos:
Además, se comparte otro método para leer un archivo interno, destacando una crítica vulnerabilidad de lectura de archivos locales en una aplicación de escritorio Electron. Esto implica inyectar un script para explotar la aplicación y exfiltrar datos:
Si el chromium utilizado por la aplicación es antiguo y hay vulnerabilidades conocidas en él, podría ser posible explotarlo y obtener RCE a través de un XSS. Puedes ver un ejemplo en este writeup: https://blog.electrovolt.io/posts/discord-rce/
Suponiendo que encontraste un XSS pero no puedes activar RCE o robar archivos internos, podrías intentar usarlo para robar credenciales a través de phishing.
Primero que nada, necesitas saber qué sucede cuando intentas abrir una nueva URL, revisando el código JS en el front-end:
La llamada a openInternally
decidirá si el enlace se abrirá en la ventana de escritorio ya que es un enlace que pertenece a la plataforma, o si se abrirá en el navegador como un recurso de terceros.
En el caso de que la regex utilizada por la función sea vulnerable a bypasses (por ejemplo, no escapando los puntos de los subdominios), un atacante podría abusar del XSS para abrir una nueva ventana que estará ubicada en la infraestructura del atacante pidiendo credenciales al usuario:
Electronegativity es una herramienta para identificar configuraciones incorrectas y anti-patrones de seguridad en aplicaciones basadas en Electron.
Electrolint es un plugin de código abierto para VS Code para aplicaciones Electron que utiliza Electronegativity.
nodejsscan para verificar bibliotecas de terceros vulnerables.
Electro.ng: Necesitas comprarlo.
En https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s puedes encontrar un laboratorio para explotar aplicaciones Electron vulnerables.
Algunos comandos que te ayudarán con el laboratorio:
Más investigaciones y artículos sobre la seguridad de Electron en https://github.com/doyensec/awesome-electronjs-hacking
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)