runAsNode CVEs 관련 성명
오늘 Electron 팀은 여러 유명 Electron 앱에 대해 최근 제출된 여러 공개 CVE에 대해 알림을 받았다. 이 CVE들은 Electron의 두 가지 퓨즈(fuse)인 runAsNode
와 enableNodeCliInspectArguments
와 관련되어 있으며, 이 퓨즈들이 명시적으로 비활성화되지 않은 경우 원격 공격자가 이를 통해 임의의 코드를 실행할 수 있다고 잘못 주장하고 있다.
우리는 이 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 릴리스 버전은 runAsNode
와 enableNodeCliInspectArguments
기능이 활성화된 상태로 제공된다. Electron Fuses 문서에 설명된 대로 이 기능들을 비활성화하지 않았다면, 여러분의 애플리케이션도 "Living off the Land" 공격에 취약할 수 있다. 다시 강조하지만, 공격자가 피해자의 머신에서 코드와 프로그램을 실행할 수 있어야만 이런 공격이 가능하다는 점을 명심해야 한다.
문제 완화 방법
이 문제를 해결하는 가장 쉬운 방법은 Electron 앱 내에서 runAsNode
퓨즈를 비활성화하는 것이다. runAsNode
퓨즈는 ELECTRON_RUN_AS_NODE
환경 변수를 적용할지 여부를 결정한다. 이 퓨즈를 조작하는 방법은 Electron Fuses 문서에서 확인할 수 있다.
이 퓨즈를 비활성화하면 메인 프로세스에서 process.fork
가 정상적으로 동작하지 않는다. 이 함수는 해당 환경 변수에 의존하기 때문이다. 대신, 독립적인 Node.js 프로세스가 필요한 경우(예: Sqlite 서버 프로세스 등) Utility Processes를 사용하는 것을 권장한다.
Electron 앱의 보안 모범 사례에 대한 자세한 내용은 보안 체크리스트에서 확인할 수 있다.