Se lo script di caricamento anticipato espone un endpoint IPC dal file main.js, il processo di rendering sarà in grado di accedervi e se vulnerabile, potrebbe essere possibile un RCE.
Controlla come main.js ascolta su getUpdate e scaricherà ed eseguirà qualsiasi URL passato.
Controlla anche come preload.jsespone qualsiasi evento IPC da main.
// Part of code of main.jsipcMain.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') +'/'+ filenameconsole.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')}elseif (state ==='progressing') {if (item.isPaused()) console.log('Download is paused')elseconsole.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());});}elseconsole.log(`Download failed: ${state}`)})})
// Part of code of preload.jswindow.electronSend= (event, data) => {ipcRenderer.send(event, data);};
Se lo script di caricamento anticipato espone direttamente al renderer un modo per chiamare shell.openExternal, è possibile ottenere RCE.
// Part of preload.js codewindow.electronOpenInBrowser= (url) => {shell.openExternal(url);};
Esempio 3
Se lo script di caricamento anticipato espone modi per comunicare completamente con il processo principale, un XSS sarà in grado di inviare qualsiasi evento. L'impatto di ciò dipende da ciò che il processo principale espone in termini di IPC.