
Уязвимость внедрения команд ОС через планировщик очистки кэша в настольном приложении Reolink
Настольное приложение Reolink (версия 8.18.12) содержит уязвимость внедрения OS-команд в функции планировщика очистки кэша (coverCacheClearScheduler). Приложение формирует команду OS-оболочки, используя путь к временной папке, считываемый из файла конфигурации, расположенного в . Поскольку это значение пути не проходит надлежащую санитизацию входных данных, злоумышленник может манипулировать им для внедрения произвольных OS-команд.
%LOCALAPPDATA%Эта уязвимость срабатывает через планировщик, который автоматически запускается каждый день в 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 утра. Это постоянство дополнительно усиливается тем фактом, что приложение является инструментом физической безопасности и часто работает круглосуточно. Оно также поддерживает функцию «запуск при загрузке», что гарантирует переживание полезной нагрузкой перезагрузок системы.
Кроме того, злоумышленник получает значительную скрытность. Команда выполняется как часть доверенного, цифрово подписанного процесса Reolink.exe, что делает её очень эффективной для обхода EDR и решений по белому списку приложений. Это классическая техника Living Off the Land (LOTL).
Атака может быть выполнена путём запуска poc.py, который модифицирует локальный файл конфигурации. Это становится возможным благодаря объединению других уязвимостей, связанных с недостаточным шифрованием (CVE-2025-56801 и CVE-2025-56802), которые используются для расшифровки и повторного шифрования файла конфигурации.
В обычных условиях полезная нагрузка сработала бы только в 3:00 утра. Однако, поскольку приложение не использует упаковку ASAR, код может быть пропатчен для немедленного срабатывания уязвимости в демонстрационных целях.
Результат выполнения выглядит следующим образом:
Для получения дополнительных сведений обратитесь к CVE-2025-56801 — уязвимость генерации IV в AES-CFB, и CVE-2025-56802 — уязвимость генерации и управления ключами AES-CFB.
Чтобы фундаментально устранить эту уязвимость внедрения OS-команд, необходимо избегать прямого включения значений, считываемых из ненадёжных внешних источников, таких как пользовательские файлы конфигурации, в строки команд OS-оболочки. Рекомендуемое решение — заменить использование команд оболочки, таких как rd или rm, на нативные API, которые обрабатывают путь как чистые данные, а не как команду, например fs.rm() в Node.js. Этот метод полностью устраняет данный класс уязвимостей.
Если формирование команды оболочки абсолютно неизбежно, необходимо реализовать защитную логику для строгой проверки и либо санитизации, либо экранирования всех специальных символов, которые могут вызвать внедрение команд, таких как &, | и ;.