
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 ではなく、改ざんがより困難なネイティブバイナリコード内で処理するか、サーバー側の通信を通じて処理する必要があります。