# Electron contextIsolation RCE via IPC {{#include ../../../banners/hacktricks-training.md}} Se o script de preload expuser um endpoint IPC do arquivo main.js, o processo de renderização poderá acessá-lo e, se vulnerável, uma RCE pode ser possível. **A maioria desses exemplos foi retirada daqui** [**https://www.youtube.com/watch?v=xILfQGkLXQo**](https://www.youtube.com/watch?v=xILfQGkLXQo). Confira o vídeo para mais informações. ## Exemplo 0 Exemplo de [https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21](https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21) (você tem o exemplo completo de como o MS Teams estava abusando de XSS para RCE nesses slides, este é apenas um exemplo muito básico):
## Exemplo 1 Verifique como o `main.js` escuta em `getUpdate` e **baixará e executará qualquer URL** passada.\ Verifique também como `preload.js` **expõe qualquer evento IPC** do main. ```javascript // Part of code of main.js ipcMain.on("getUpdate", (event, url) => { console.log("getUpdate: " + url) mainWindow.webContents.downloadURL(url) mainWindow.download_url = url }) mainWindow.webContents.session.on( "will-download", (event, item, webContents) => { console.log("downloads path=" + app.getPath("downloads")) console.log("mainWindow.download_url=" + mainWindow.download_url) url_parts = mainWindow.download_url.split("/") filename = url_parts[url_parts.length - 1] mainWindow.downloadPath = app.getPath("downloads") + "/" + filename console.log("downloadPath=" + mainWindow.downloadPath) // Set the save path, making Electron not to prompt a save dialog. item.setSavePath(mainWindow.downloadPath) item.on("updated", (event, state) => { if (state === "interrupted") { console.log("Download is interrupted but can be resumed") } else if (state === "progressing") { if (item.isPaused()) console.log("Download is paused") else console.log(`Received bytes: ${item.getReceivedBytes()}`) } }) item.once("done", (event, state) => { if (state === "completed") { console.log("Download successful, running update") fs.chmodSync(mainWindow.downloadPath, 0755) var child = require("child_process").execFile child(mainWindow.downloadPath, function (err, data) { if (err) { console.error(err) return } console.log(data.toString()) }) } else console.log(`Download failed: ${state}`) }) } ) ``` ```javascript // Part of code of preload.js window.electronSend = (event, data) => { ipcRenderer.send(event, data) } ``` Exploit: ```html ``` ## Exemplo 2 Se o script de preload expuser diretamente ao renderizador uma maneira de chamar `shell.openExternal`, é possível obter RCE. ```javascript // Part of preload.js code window.electronOpenInBrowser = (url) => { shell.openExternal(url) } ``` ## Exemplo 3 Se o script de preload expuser maneiras de se comunicar completamente com o processo principal, um XSS poderá enviar qualquer evento. O impacto disso depende do que o processo principal expõe em termos de IPC. ```javascript window.electronListen = (event, cb) => { ipcRenderer.on(event, cb) } window.electronSend = (event, data) => { ipcRenderer.send(event, data) } ``` {{#include ../../../banners/hacktricks-training.md}}