Node.js 애드온으로 살아남기 노트

Node.js 애드온으로 살아남기

네이티브 모듈은 C, C++, Objective-C와 같은 언어로 작성된 네이티브 코드와 Node.js 애플리케이션이 상호 작용할 수 있도록 하는 컴파일된 Node.js 파일입니다. 이 파일들은 머신 코드를 포함할 수 있는 컴파일된 바이너리이며, 로드하는 Node.js 프로세스와 동일한 권한으로 실행됩니다. JavaScript 파일과 달리 .node 파일은 읽을 수 없으며 시스템 API를 직접 호출하고 순수 JavaScript 코드가 할 수 없는 작업을 수행할 수 있습니다. 이러한 애드온은 Objective-C++를 사용하여 Node.js에서 직접 네이티브 macOS API를 활용할 수 있으므로 일반적인 샌드박싱 외부에서 임의의 코드 실행이 가능합니다. Electron 애플리케이션은 종종 ASAR 파일 형식을 사용하여 애플리케이션의 소스 코드를 패키징하지만, ASAR 무결성 검사는 기본적으로 비활성화되어 있습니다. 활성화되면 ASAR 무결성 검사는 런타임에 ASAR 아카이브의 헤더 해시를 확인하고 아카이브 내 파일의 변조를 방지합니다. 그러나 컴파일된 .node 파일은 ASAR 아카이브 내에서 직접 실행할 수 없기 때문에 많은 애플리케이션이 app.asar.unpacked 아래에서 검증된 아카이브 외부에서 실행됩니다. 이를 통해 로컬 공격자는 Windows의 DLL 하이재킹과 유사하게 압축되지 않은 디렉토리 내의 .node 파일을 수정하거나 교체할 수 있습니다. 이 문제를 해결하기 위해 두 가지 도구가 개발되었습니다. Electron 애플리케이션이 ASAR 무결성 보호를 구현하는지 평가하는 Electron ASAR Scanner와 간단한 네이티브 Node.js 애드온 컴파일러인 NodeLoader입니다. Electron ASAR Scanner와 NodeLoader 도구는 네이티브 모듈을 사용하는 Electron 애플리케이션의 잠재적인 보안 취약점을 식별하고 완화하는 데 도움이 될 수 있습니다.