
Reolink 데스크톱 애플리케이션의 캐시 정리 스케줄러를 통한 OS 명령 주입 취약점
Reolink 데스크톱 애플리케이션(버전 8.18.12)에는 캐시 정리 스케줄러(coverCacheClearScheduler) 기능에 OS 명령 주입 취약점이 존재합니다. 이 애플리케이션은 %LOCALAPPDATA% 내에 있는 구성 파일에서 읽은 임시 폴더 경로를 사용하여 OS 셸 명령을 구성합니다. 이 경로 값은 적절한 입력 검증이 없으므로, 공격자는 이를 조작하여 임의의 OS 명령을 주입할 수 있습니다.
이 취약점은 매일 오전 3시에 자동으로 실행되는 스케줄러에 의해 트리거되며, 공격자에게 시스템에서의 지속성을 제공합니다. 또한, 주입된 명령은 합법적이고 디지털 서명된 Reolink.exe 프로세스의 일부로 실행되므로 보안 솔루션의 탐지를 회피하여 은밀성을 확보할 수 있습니다.
이 애플리케이션은 매일 오전 3시에 실행되도록 스케줄러를 초기화합니다:
{
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시에 자동으로 재실행되어 지속성을 제공하기 때문입니다. 이러한 지속성은 물리적 보안 도구로서의 애플리케이션 특성(종종 24/7 실행됨)으로 더욱 강화됩니다. 또한 '부팅 시 시작' 기능을 지원하므로 재부팅 후에도 페이로드가 유지됩니다.
또한, 공격자는 상당한 은밀성을 확보합니다. 명령은 신뢰할 수 있고 디지털 서명된 Reolink.exe 프로세스의 일부로 실행되므로 EDR 및 애플리케이션 허용 목록 솔루션을 우회하는 데 매우 효과적입니다. 이는 전형적인 Living Off the Land(LOTL) 기법입니다.
이 공격은 로컬 구성 파일을 수정하는 poc.py를 실행하여 수행할 수 있습니다. 이는 구성 파일을 복호화하고 재암호화하는 데 사용되는 불충분한 암호화와 관련된 다른 취약점(CVE-2025-56801 및 CVE-2025-56802)을 연결하여 가능해집니다.
일반적으로 페이로드는 오전 3시에만 트리거됩니다. 그러나 이 애플리케이션은 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로 대체하는 것입니다. 이 방법은 이 클래스의 취약점을 완전히 제거합니다.
셸 명령 구성이 절대적으로 불가피한 경우, &, |, ;와 같이 명령 주입을 유발할 수 있는 모든 특수 문자를 엄격하게 검증하고 삭제하거나 이스케이프하는 방어 로직을 구현해야 합니다.