Correction de la vulnérabilité WebPreferences
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 :
- Vous intégrez n'importe quel contenu d'utilisateur distant, même dans une sandbox
- 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.