Electron contextIsolation RCE via preload code
Exemplo 1
Este código abre links http(s) com o navegador padrão:
Algo como file:///C:/Windows/systemd32/calc.exe
poderia ser usado para executar uma calculadora, o SAFE_PROTOCOLS.indexOf
está impedindo isso.
Portanto, um atacante poderia injetar este código JS via XSS ou navegação arbitrária na página:
Como a chamada para SAFE_PROTOCOLS.indexOf
sempre retornará 1337, o atacante pode contornar a proteção e executar a calculadora. Exploit final:
Verifique os slides originais para outras maneiras de executar programas sem precisar de uma solicitação de permissão.
Aparentemente, outra maneira de carregar e executar código é acessar algo como file://127.0.0.1/electron/rce.jar
Exemplo 2: Discord App RCE
Exemplo de https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1
Ao verificar os scripts de pré-carregamento, descobri que o Discord expõe a função, que permite que alguns módulos permitidos sejam chamados via DiscordNative.nativeModules.requireModule('NOME-DO-MÓDULO')
, na página da web.
Aqui, não pude usar módulos que podem ser usados para RCE diretamente, como o módulo child_process, mas encontrei um código onde RCE pode ser alcançado substituindo os métodos JavaScript integrados e interferindo na execução do módulo exposto.
A seguir está a PoC. Consegui confirmar que o aplicativo calc é aberto quando eu chamo a função getGPUDriverVersions
que está definida no módulo chamado "discord_utils" a partir do devTools, enquanto substituo o RegExp.prototype.test
e Array.prototype.join
.
A função getGPUDriverVersions
tenta executar o programa usando a biblioteca "execa", como mostrado abaixo:
Normalmente, o execa tenta executar "nvidia-smi.exe", que é especificado na variável nvidiaSmiPath
, no entanto, devido à substituição de RegExp.prototype.test
e Array.prototype.join
, o argumento é substituído por "calc" no processamento interno do _execa_**.
Especificamente, o argumento é substituído alterando as seguintes duas partes.
Last updated