WebPreferences Vulnerability Fix
Electron 버전(3.0.0-beta.6, 2.0.7, 1.8.7, 1.7.15)에서 중첩된 자식 윈도우를 열 수 있는 기능을 가진 앱에 원격 코드 실행 취약점이 발견되었다. 이 취약점은 CVE 식별자 CVE-2018-15685로 지정되었다.
영향을 받는 플랫폼
다음과 같은 경우 영향을 받는다:
- 샌드박스 환경을 포함해 원격 사용자 콘텐츠를 임베드하는 경우
- XSS 취약점이 있는 사용자 입력을 허용하는 경우
상세 설명
iframe
내부에서 사용자 코드가 실행되거나 iframe
을 생성할 수 있는 경우 영향을 받는다. XSS 취약점의 가능성을 고려할 때 대부분의 애플리케이션이 이 경우에 취약하다고 볼 수 있다.
또한 nativeWindowOpen: true
또는 sandbox: true
옵션을 사용해 윈도우를 여는 경우에도 영향을 받는다. 이 취약점 역시 애플리케이션에 XSS 취약점이 존재해야 하지만, 해당 옵션을 사용한다면 아래의 완화 조치 중 하나를 적용해야 한다.
취약점 완화 방법
이 취약점을 해결한 새로운 Electron 버전을 출시했다: 3.0.0-beta.7
, 2.0.8
, 1.8.8
, 그리고 1.7.16
. 모든 Electron 개발자가 가능한 한 빨리 최신 안정 버전으로 앱을 업데이트할 것을 강력히 권장한다.
만약 어떤 이유로 Electron 버전을 업그레이드할 수 없는 경우, 모든 webContents
에 대해 new-window
이벤트에 event.preventDefault()
를 전역적으로 호출하여 앱을 보호할 수 있다. window.open
이나 자식 윈도우를 전혀 사용하지 않는다면, 이 방법 역시 유효한 완화책이 될 수 있다.
mainWindow.webContents.on('new-window', (e) => e.preventDefault());
만약 자식 윈도우가 손자 윈도우를 생성하는 기능에 의존하고 있다면, 다음과 같은 코드를 최상위 윈도우에 적용하는 세 번째 완화 전략을 사용할 수 있다:
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);
이 코드는 최상위 윈도우의 webPreferences
가 모든 자식 윈도우에 무한히 깊이까지 수동으로 적용되도록 강제한다.
추가 정보
이 취약점은 Contrast Security의 Matt Austin이 Electron 프로젝트에 책임감 있게 보고했다. Electron 애플리케이션의 보안을 유지하기 위한 모범 사례를 더 알고 싶다면 보안 튜토리얼을 참고한다.
Electron에서 발견한 취약점을 보고하려면 security@electronjs.org로 이메일을 보낸다.