Aller au contenu principal

Correction de la vulnérabilité WebPreferences

· 3 mins de lecture

Une vulnérabilité d'exécution de code à distance a été découverte dans les applications ayant la capacité d'ouvrir des fenêtres enfants imbriquées sur les versions d'Electron (3.0.0-beta.6, 2.0.7, 1.8.7 et 1.7.15). Cette vulnérabilité a été assignée à l'identifiant CVE CVE-2018-15685.


Plateformes affectées

Vous êtes impacté si :

  1. Vous intégrez n'importe quel contenu d'utilisateur distant, même dans une sandbox
  2. Vous acceptez des entrées utilisateur présentant des vulnérabilités XSS

Détails

Vous êtes impacté si un code utilisateur s'exécute à l'intérieur d'une iframe / peut créer une iframe. Étant donné la possibilité d'une vulnérabilité XSS, on peut supposer que la plupart des applications sont vulnérables à ce cas.

Vous êtes également impacté si vous ouvrez l'une de vos fenêtres avec l'option nativeWindowOpen: true ou sandbox: true. Bien que cette vulnérabilité nécessite également une vulnérabilité XSS pour exister dans votre application, vous devriez quand même appliquer l'une des mesures ci-dessous si vous utilisez l'une de ces options.

Atténuation

Nous avons publié de nouvelles versions d'Electron qui incluent des corrections pour cette vulnérabilité : 3.0.0-beta.7, 2.0.8, 1.8.8, et 1.7.16. Nous demandons instamment à tous les développeurs Electron de mettre à jour leurs applications vers la dernière version stable immédiatement.

Si, pour une raison quelconque, vous n'êtes pas en mesure de mettre à jour votre version d'Electron, vous pouvez protéger votre application en appelant de manière générale event.preventDefault() sur l'événement new-window pour tous les webContents. Si vous n'utilisez pas du tout window.open ou aucune fenêtre enfant, c'est aussi une atténuation valide pour votre application.

mainWindow.webContents.on('new-window', e => e.preventDefault())

Si vous comptez sur la capacité de vos fenêtres enfant à créer des fenêtres petit-enfant, une troisième stratégie d'atténuation consiste à utiliser le code suivant sur votre fenêtre de niveau supérieur :

const enforceInheritance = (topWebContents) => {
const handle = (webContents) => {
webContents.on('new-window', (event, url, frameName, disposition, options) => {
if (!options.webPreferences) {
options.webPreferences = {}
}
Object.assign(options.webPreferences, topWebContents.getLastWebPreferences())
if (options.webContents) {
handle(options.webContents)
}
})
}
handle(topWebContents)
}

enforceInheritance(mainWindow.webContents)

Ce code fera en sorte que la webPreferences de la fenêtre de niveau supérieur soit appliquée manuellement à toutes les fenêtres enfants à l'infini.

Informations complémentaires 

Cette vulnérabilité a été découverte et signalée de manière responsable au projet Electron par Matt Austin de Contrast Security.

Pour en savoir plus sur les meilleures pratiques pour sécuriser vos applications Electron, consultez notre tutoriel de sécurité.

Si vous souhaitez signaler une vulnérabilité dans Electron, envoyez un e-mail à security@electronjs.org.