Skip to main content

runAsNode CVEs 관련 성명

· 7 min read

오늘 Electron 팀은 여러 유명 Electron 앱에 대해 최근 제출된 여러 공개 CVE에 대해 알림을 받았다. 이 CVE들은 Electron의 두 가지 퓨즈(fuse)runAsNodeenableNodeCliInspectArguments와 관련되어 있으며, 이 퓨즈들이 명시적으로 비활성화되지 않은 경우 원격 공격자가 이를 통해 임의의 코드를 실행할 수 있다고 잘못 주장하고 있다.

우리는 이 CVE들이 순수한 의도로 제출되었다고 보지 않는다. 첫째, 해당 주장은 사실이 아니다. 이 설정은 원격 코드 실행을 허용하지 않는다. 둘째, 이 CVE에서 언급된 회사들은 버그 바운티 프로그램을 운영하고 있음에도 불구하고 사전에 통보를 받지 못했다. 마지막으로, 해당 퓨즈를 비활성화하는 것이 앱 보안을 강화하는 데 도움이 된다고 생각하지만, 이 CVE들이 올바른 심각도로 제출되었다고 보지 않는다. "위험(Critical)" 등급은 가장 심각한 문제에만 적용되어야 하며, 이 경우는 해당되지 않는다.

누구나 CVE를 요청할 수 있다. 이는 소프트웨어 산업 전반의 건강에 도움이 되지만, 단일 보안 연구원의 평판을 높이기 위해 CVE를 남발하는 것은 도움이 되지 않는다.

그러나, 위험(Critical)이라는 심각도가 붙은 CVE가 존재한다는 사실만으로도 최종 사용자들이 혼란을 느낄 수 있다는 점을 이해한다. 따라서 프로젝트로서 이 문제를 해결하기 위한 지침과 지원을 제공하고자 한다.

이 문제가 나에게 어떤 영향을 미칠까?

Electron 팀은 이 CVE(공통 취약점 및 노출)가 심각하지 않다고 판단했다. 공격자는 이미 하드웨어에 물리적으로 접근하거나 원격 코드 실행을 완료한 상태여야 한다. 다시 말해, 이 취약점을 악용하려면 공격자가 이미 해당 시스템에 접근할 수 있어야 한다.

예를 들어, Chrome은 물리적 접근 공격을 위협 모델에서 고려하지 않는다:

Chrome(또는 어떤 애플리케이션도)은 사용자로 로그인하거나 운영체제 사용자 계정 권한으로 소프트웨어를 실행할 수 있는 악의적인 사용자로부터 방어할 방법이 없다. 따라서 이러한 공격은 Chrome의 위협 모델에서 제외한다. 이런 공격자는 실행 파일과 DLL을 수정하거나, PATH와 같은 환경 변수를 변경하거나, 설정 파일을 바꾸고, 사용자 계정이 소유한 모든 데이터를 읽어 이메일로 보낼 수 있다. 공격자는 디바이스를 완전히 통제하며, Chrome이 할 수 있는 일로는 심각한 방어를 보장할 수 없다. 이 문제는 Chrome에만 국한되지 않는다. 모든 애플리케이션은 물리적으로 접근 가능한 사용자를 신뢰할 수밖에 없다.

CVE에 설명된 익스플로잇은 공격자가 영향을 받는 앱을 상속된 TCC 권한을 가진 일반적인 Node.js 프로세스로 사용할 수 있게 한다. 예를 들어, 앱이 주소록에 접근할 수 있는 권한을 가지고 있다면, 공격자는 앱을 Node.js로 실행해 주소록 접근 권한을 상속받는 임의의 코드를 실행할 수 있다. 이는 일반적으로 "Living off the Land" 공격으로 알려져 있다. 공격자는 주로 PowerShell, Bash 또는 유사한 도구를 사용해 임의의 코드를 실행한다.

내 애플리케이션도 영향을 받을까?

기본적으로 모든 Electron 릴리스 버전은 runAsNodeenableNodeCliInspectArguments 기능이 활성화된 상태로 제공된다. Electron Fuses 문서에 설명된 대로 이 기능들을 비활성화하지 않았다면, 여러분의 애플리케이션도 "Living off the Land" 공격에 취약할 수 있다. 다시 강조하지만, 공격자가 피해자의 머신에서 코드와 프로그램을 실행할 수 있어야만 이런 공격이 가능하다는 점을 명심해야 한다.

문제 완화 방법

이 문제를 해결하는 가장 쉬운 방법은 Electron 앱 내에서 runAsNode 퓨즈를 비활성화하는 것이다. runAsNode 퓨즈는 ELECTRON_RUN_AS_NODE 환경 변수를 적용할지 여부를 결정한다. 이 퓨즈를 조작하는 방법은 Electron Fuses 문서에서 확인할 수 있다.

이 퓨즈를 비활성화하면 메인 프로세스에서 process.fork가 정상적으로 동작하지 않는다. 이 함수는 해당 환경 변수에 의존하기 때문이다. 대신, 독립적인 Node.js 프로세스가 필요한 경우(예: Sqlite 서버 프로세스 등) Utility Processes를 사용하는 것을 권장한다.

Electron 앱의 보안 모범 사례에 대한 자세한 내용은 보안 체크리스트에서 확인할 수 있다.