Wenn das Preload-Skript einen IPC-Endpunkt aus der main.js-Datei exponiert, kann der Renderer-Prozess darauf zugreifen und, falls verwundbar, könnte eine RCE möglich sein.
Überprüfe, wie die main.js auf getUpdate hört und jede URL herunterlädt und ausführt, die übergeben wird.
Überprüfe auch, wie preload.jsjedes IPC-Ereignis von main exponiert.
// 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);};
Wenn das Preload-Skript direkt eine Möglichkeit bietet, shell.openExternal im Renderer aufzurufen, ist es möglich, RCE zu erlangen.
// Part of preload.js codewindow.electronOpenInBrowser= (url) => {shell.openExternal(url);};
Beispiel 3
Wenn das Preload-Skript Möglichkeiten bietet, vollständig mit dem Hauptprozess zu kommunizieren, kann ein XSS jedes Ereignis senden. Die Auswirkungen hängen davon ab, was der Hauptprozess in Bezug auf IPC bereitstellt.