
Reolinkデスクトップアプリケーションにおけるキャッシュクリアスケジューラを介したOSコマンドインジェクションの脆弱性
Reolinkデスクトップアプリケーション(バージョン8.18.12)には、キャッシュクリアスケジューラ(coverCacheClearScheduler)機能にOSコマンドインジェクションの脆弱性が存在します。このアプリケーションは、%LOCALAPPDATA%内にある設定ファイルから読み取った一時フォルダパスを使用してOSシェルコマンドを構築します。このパス値には適切な入力サニタイズが行われていないため、攻撃者はこれを操作して任意のOSコマンドを注入することができます。
この脆弱性は、毎日午前3:00に自動実行されるスケジューラによってトリガーされ、攻撃者にシステム上での持続性を提供します。さらに、注入されたコマンドは、正規のデジタル署名付きReolink.exeプロセスの一部として実行されるため、セキュリティソリューションによる検出を回避してステルス性を獲得します。
このアプリケーションは、毎日午前3:00に実行されるスケジューラを初期化します:
{
key: "clearCoverCacheRegularly",
value: function () {
if (this.coverCacheClearScheduler) {
var e = new Date(),
t = new Date(
e.getFullYear(),
e.getMonth(),
e.getDate(),
3,
0,
0,
).getTime();
(e.getTime() > t &&
(t = new Date(
e.getFullYear(),
e.getMonth(),
e.getDate() + 1,
3,
0,
0,
).getTime()),
this.coverCacheClearScheduler.add({
id: this.clearCoverCacheTaskId,
name: "clearCoverCache",
unit: r.ETaskUnit.DAY,
interval: 1,
args: !1,
execute: this.removeCoverCacheDir,
nextTime: t,
isInExact: !0,
}),
this.coverCacheClearScheduler.start());
}
},
}
スケジューラによって実行される関数は、以下のロジックを使用してシェルコマンド文字列を構築します:
p(
"darwin" === process.platform
? "rm -rf ".concat(t)
: "rd /s /q ".concat(t),
function (t) {
//...
Windowsでは、結果のコマンドは次のようになります:
rd /s /q %LOCALAPPDATA%\Temp\reolink\<TEMP_FOLDER>\playback-covers
macOSでは、結果のコマンドは次のようになります:
rm -rf ~/Library/Caches/reolink/<TEMP_FOLDER>/playback-covers
<TEMP_FOLDER>は適切にサニタイズされていないため、攻撃者はフォルダ名の操作を介して追加のコマンドを注入し、コマンド実行につなげることができます:
rd /s /q %LOCALAPPDATA%\Temp\reolink\& <COMMAND> &\playback-covers
rm -rf ~/Library/Caches/reolink/& <COMMAND>; echo /playback-covers
攻撃をトリガーするにはローカルファイルの変更が必要であり、これには別の脆弱性、マルウェアの実行、またはシステムへの物理的なアクセスが必要です。
初期トリガーは比較的困難ですが、攻撃は成功すると非常に効果的であり、毎日午前3:00にペイロードを自動的に再実行することで持続性を提供します。この持続性は、物理セキュリティツールとしてのアプリケーションの性質によりさらに強化され、多くの場合24時間365日実行されたままになります。また、「起動時に開始」機能もサポートしているため、再起動後もペイロードが存続します。
さらに、攻撃者は大きなステルス性を獲得します。コマンドは信頼されたデジタル署名付きReolink.exeプロセスの一部として実行されるため、EDRやアプリケーションホワイトリスティングソリューションをバイパスするのに非常に効果的です。これは古典的なLiving Off the Land(LOTL)テクニックです。
この攻撃は、ローカル設定ファイルを変更するpoc.pyを実行することで実行できます。これは、設定ファイルの復号化と再暗号化に使用される、不十分な暗号化に関連する他の脆弱性(CVE-2025-56801およびCVE-2025-56802)を連鎖させることで可能になります。
通常、ペイロードは午前3:00にのみトリガーされます。ただし、このアプリケーションはASARパッケージングを利用していないため、デモンストレーション目的でコードにパッチを適用して脆弱性を即座にトリガーすることができます。
実行結果は次のとおりです:
https://github.com/user-attachments/assets/44bf4d84-b8bf-4f4a-853c-07380ce26783
詳細については、AES-CFB IV生成の脆弱性についてはCVE-2025-56801、AES-CFBキー生成および管理の脆弱性についてはCVE-2025-56802を参照してください。
このOSコマンドインジェクションの脆弱性を根本的に解決するには、ユーザー設定ファイルなどの信頼できない外部ソースから読み取った値をOSシェルコマンド文字列に直接含めないようにする必要があります。推奨される解決策は、rdやrmなどのシェルコマンドの使用を、パスをコマンドではなく純粋なデータとして扱うNode.jsのfs.rm()などのネイティブAPIに置き換えることです。この方法により、このクラスの脆弱性を完全に排除できます。
シェルコマンドの構築がどうしても避けられない場合は、&、|、;など、コマンドインジェクションを引き起こす可能性のあるすべての特殊文字を厳密に検証し、サニタイズまたはエスケープする防御ロジックを実装する必要があります。