Si le script de préchargement expose un point de terminaison IPC à partir du fichier main.js, le processus de rendu pourra y accéder et, s'il est vulnérable, une RCE pourrait être possible.
Vérifiez comment main.js écoute sur getUpdate et téléchargera et exécutera n'importe quelle URL transmise.
Vérifiez également comment preload.jsexpose tout IPC événement de 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);};
Si le script de préchargement expose directement au moteur de rendu un moyen d'appeler shell.openExternal, il est possible d'obtenir une exécution de code à distance (RCE).
// Part of preload.js codewindow.electronOpenInBrowser= (url) => {shell.openExternal(url);};
Exemple 3
Si le script de préchargement expose des moyens de communiquer complètement avec le processus principal, une XSS pourra envoyer n'importe quel événement. L'impact de cela dépend de ce que le processus principal expose en termes d'IPC.