Electron Desktop Apps
Introdução
Electron combina um backend local (com NodeJS) e um frontend (Chromium), embora falte alguns dos mecanismos de segurança dos navegadores modernos.
Normalmente, você pode encontrar o código do aplicativo electron dentro de uma aplicação .asar
, para obter o código você precisa extraí-lo:
No código-fonte de um aplicativo Electron, dentro de packet.json
, você pode encontrar especificado o arquivo main.js
onde as configurações de segurança são definidas.
Electron tem 2 tipos de processo:
Processo Principal (tem acesso completo ao NodeJS)
Processo de Renderização (deve ter acesso restrito ao NodeJS por razões de segurança)
Um processo de renderização será uma janela do navegador carregando um arquivo:
As configurações do processo de renderização podem ser configuradas no processo principal dentro do arquivo main.js. Algumas das configurações impedirão que o aplicativo Electron obtenha RCE ou outras vulnerabilidades se as configurações estiverem corretamente configuradas.
O aplicativo Electron pode acessar o dispositivo via APIs Node, embora possa ser configurado para impedir isso:
nodeIntegration
- estádesligado
por padrão. Se ativado, permite acessar recursos do Node a partir do processo de renderização.contextIsolation
- estáativado
por padrão. Se desligado, os processos principal e de renderização não estão isolados.preload
- vazio por padrão.sandbox
- está desligado por padrão. Isso restringirá as ações que o NodeJS pode realizar.Integração do Node em Workers
nodeIntegrationInSubframes
- estádesligado
por padrão.Se
nodeIntegration
estiver ativado, isso permitiria o uso de APIs Node.js em páginas da web que estão carregadas em iframes dentro de um aplicativo Electron.Se
nodeIntegration
estiver desativado, então os preloads serão carregados no iframe.
Exemplo de configuração:
Alguns RCE payloads de aqui:
Capturar tráfego
Modifique a configuração start-main e adicione o uso de um proxy como:
Injeção de Código Local do Electron
Se você puder executar localmente um aplicativo Electron, é possível que você consiga fazer com que ele execute código JavaScript arbitrário. Veja como em:
macOS Electron Applications InjectionRCE: XSS + nodeIntegration
Se o nodeIntegration estiver definido como on, o JavaScript de uma página da web pode usar recursos do Node.js facilmente apenas chamando o require()
. Por exemplo, a maneira de executar o aplicativo calc no Windows é:
RCE: preload
O script indicado nesta configuração é loaded antes de outros scripts no renderizador, então ele tem acesso ilimitado às APIs do Node:
Portanto, o script pode exportar node-features para páginas:
Se contextIsolation
estiver ativado, isso não funcionará
RCE: XSS + contextIsolation
O contextIsolation introduz os contextos separados entre os scripts da página da web e o código interno JavaScript do Electron, de modo que a execução do JavaScript de cada código não afete o outro. Este é um recurso necessário para eliminar a possibilidade de RCE.
Se os contextos não estiverem isolados, um atacante pode:
Executar JavaScript arbitrário no renderer (XSS ou navegação para sites externos)
Sobrescrever o método embutido que é usado no preload ou no código interno do Electron para uma função própria
Acionar o uso da função sobrescrita
RCE?
Existem 2 lugares onde métodos embutidos podem ser sobrescritos: No código de preload ou no código interno do Electron:
Electron contextIsolation RCE via preload codeElectron contextIsolation RCE via Electron internal codeElectron contextIsolation RCE via IPCBypass click event
Se houver restrições aplicadas ao clicar em um link, você pode ser capaz de contorná-las fazendo um clique do meio em vez de um clique esquerdo normal.
RCE via shell.openExternal
Para mais informações sobre estes exemplos, consulte https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 e https://benjamin-altpeter.de/shell-openexternal-dangers/
Ao implantar um aplicativo de desktop Electron, garantir as configurações corretas para nodeIntegration
e contextIsolation
é crucial. Está estabelecido que execução remota de código do lado do cliente (RCE) direcionando scripts de preload ou o código nativo do Electron a partir do processo principal é efetivamente prevenido com essas configurações em vigor.
Quando um usuário interage com links ou abre novas janelas, ouvintes de eventos específicos são acionados, que são cruciais para a segurança e funcionalidade do aplicativo:
Esses ouvintes são substituídos pelo aplicativo de desktop para implementar sua própria lógica de negócios. O aplicativo avalia se um link navegável deve ser aberto internamente ou em um navegador da web externo. Essa decisão é geralmente tomada por meio de uma função, openInternally
. Se essa função retornar false
, isso indica que o link deve ser aberto externamente, utilizando a função shell.openExternal
.
Aqui está um pseudocódigo simplificado:
As melhores práticas de segurança do Electron JS desaconselham aceitar conteúdo não confiável com a função openExternal
, pois isso pode levar a RCE através de vários protocolos. Os sistemas operacionais suportam diferentes protocolos que podem acionar RCE. Para exemplos detalhados e mais explicações sobre este tópico, pode-se consultar este recurso, que inclui exemplos de protocolos do Windows capazes de explorar essa vulnerabilidade.
Exemplos de exploits de protocolos do Windows incluem:
Lendo Arquivos Internos: XSS + contextIsolation
Desabilitar contextIsolation
permite o uso de <webview>
tags, semelhante a <iframe>
, para ler e exfiltrar arquivos locais. Um exemplo fornecido demonstra como explorar essa vulnerabilidade para ler o conteúdo de arquivos internos:
Além disso, outro método para ler um arquivo interno é compartilhado, destacando uma vulnerabilidade crítica de leitura de arquivo local em um aplicativo desktop Electron. Isso envolve injetar um script para explorar o aplicativo e exfiltrar dados:
RCE: XSS + Old Chromium
Se o chromium usado pelo aplicativo é antigo e há vulnerabilidades conhecidas nele, pode ser possível explorá-lo e obter RCE através de um XSS. Você pode ver um exemplo neste writeup: https://blog.electrovolt.io/posts/discord-rce/
XSS Phishing via Internal URL regex bypass
Supondo que você encontrou um XSS, mas não consegue acionar RCE ou roubar arquivos internos, você poderia tentar usá-lo para roubar credenciais via phishing.
Primeiro de tudo, você precisa saber o que acontece quando tenta abrir uma nova URL, verificando o código JS no front-end:
A chamada para openInternally
decidirá se o link será aberto na janela do desktop como um link pertencente à plataforma, ou se será aberto no navegador como um recurso de 3ª parte.
No caso de a regex usada pela função ser vulnerável a bypasses (por exemplo, por não escapar os pontos dos subdomínios), um atacante poderia abusar do XSS para abrir uma nova janela que estará localizada na infraestrutura do atacante solicitando credenciais ao usuário:
Ferramentas
Electronegativity é uma ferramenta para identificar configurações incorretas e anti-padrões de segurança em aplicações baseadas em Electron.
Electrolint é um plugin de código aberto para VS Code para aplicações Electron que utiliza Electronegativity.
nodejsscan para verificar bibliotecas de terceiros vulneráveis.
Electro.ng: Você precisa comprá-lo.
Laboratórios
Em https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s você pode encontrar um laboratório para explorar aplicativos Electron vulneráveis.
Alguns comandos que ajudarão você no laboratório:
Referências
Mais pesquisas e artigos sobre segurança do Electron em https://github.com/doyensec/awesome-electronjs-hacking
Last updated