
로컬 인증 우회 취약점 - Reolink 데스크톱 애플리케이션
Reolink 데스크톱 애플리케이션(버전 8.18.12)의 잠금 화면 기능에 로컬 인증 우회 취약점이 존재합니다. 이 애플리케이션의 소스 코드는 ASAR 아카이브로 패키징되지 않아, 비밀번호 검증과 같은 중요한 인증 로직이 클라이언트 측 JavaScript 파일에 평문으로 노출되어 있습니다. 노출된 코드의 로직을 단순히 수정하는 것만으로도 비밀번호 검사를 무력화하고 잠금 화면을 우회할 수 있습니다.
잠금 화면 비밀번호는 로컬 리소스 번들 내의 JavaScript 코드를 통해 저장 및 검색되며, 구체적으로는 다음 파일입니다:
%LOCALAPPDATA%\Programs\Reolink\resources\app\~node_modules_sharp_vendor_Sync_recursive_versions_json_~private_main_index_ts.js
관련 코드는 get_settings_lock_screen_password 명령에 대한 핸들러를 등록하며, 이 핸들러는 a.settingsManager.lockScreenPassword 속성에서 저장된 비밀번호를 반환합니다:
this.registerCommonCmd(
"get_settings_lock_screen_password",
"",
R(function () {
return N(this, function (e) {
return [2, a.settingsManager.lockScreenPassword];
});
}),
);
이 로직이 전적으로 클라이언트 측에 존재하므로, 공격자는 반환 값을 ""(빈 문자열)로 패치하여 잠금 화면을 효과적으로 우회할 수 있습니다:
return [2, ""];
이 파일을 수정하고 저장한 후, 애플리케이션은 잠금 화면에 비밀번호가 없는 것으로 간주하여 인증 없이 접근을 허용합니다.
이 취약점으로 인해 파일 시스템 접근 권한이 있는 모든 로컬 공격자는 애플리케이션 수준의 인증을 우회하고 애플리케이션 인터페이스와 설정에 대한 전체 접근 권한을 얻을 수 있습니다.
비밀번호가 외부 소스에 대해 검증되지 않고 수정 가능한 JavaScript를 통해 노출되므로, 이 잠금 화면은 실제 보호 기능을 제공하지 못합니다.
코드 내용은 poc.py를 실행하여 변조할 수 있습니다.
다음 스크린샷은 패치 전 Reolink 애플리케이션의 잠금 화면으로, 비밀번호 입력 프롬프트가 활성화된 상태를 보여줍니다:
다음 스크린샷은 패치 적용 후 애플리케이션을 재시작한 모습으로, 비밀번호 입력 프롬프트가 표시되지 않습니다:

애플리케이션 코드는 ASAR 아카이브로 패키징되어야 하며, 시작 시 ASAR 파일의 해시 값이나 서명을 확인하는 것과 같은 무결성 검증 프로세스가 구현되어야 합니다. 변조된 애플리케이션은 실행이 차단되어야 합니다.
잠금 화면 비밀번호 검증과 같은 중요한 인증 로직은 JavaScript보다 변조가 더 어려운 네이티브 바이너리 코드에서 처리하거나, 가능한 경우 서버 측 통신을 통해 처리해야 합니다.