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.lockScreenPasswordthis.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,或通过服务器端通信进行处理。