
Критическая уязвимость удалённого выполнения кода в Rules Engine от OpenRemote позволяет аутентифицированным пользователям с ролью `write:rules` выполнять произвольный код на сервере с правами root.
Критическая уязвимость удалённого выполнения кода в Rules Engine OpenRemote позволяет аутентифицированным пользователям с ролью write:rules выполнять произвольный код на сервере с правами root.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H| Аспект | Детали |
|---|---|
| ID CVE | CVE-2026-39842 |
| ID GHSA | GHSA-7mqr-33rv-p3mp |
| Тип уязвимости | Внедрение кода / внедрение выражений |
| Оценка CVSS | 10.0 (Critical) |
| CWE | CWE-94, CWE-917 |
| Продукт | OpenRemote |
| Затронутые версии | <= 1.21.0 |
| Исправленная версия | >= 1.22.0 |
| Требуется аутентификация | Да |
| Необходимый уровень привилегий | Роль write:rules (не суперпользователь) |
| Уязвимые конечные точки | POST /api/{realm}/rules/realm, POST /api/{realm}/rules/asset |
| Уровень выполнения RCE | root |
| Эксплуатируемость | Высокая |
| Сложность | Низкая |
| Дата обнаружения | 2026 |
OpenRemote — это платформа Интернета вещей с открытым исходным кодом для создания умных зданий, городов и промышленных объектов. Она предоставляет управление устройствами, правила автоматизации, аналитику и интеграции для экосистемы Интернета вещей.
Internet / Network
|
┌────────┴────────┐
v v
┌──────────────┐ ┌──────────────┐
| Web Browser | | Mobile App |
└──────────────┘ └──────────────┘
| |
└────────┬────────┘
v
┌──────────────────┐
| OpenRemote API |
| (REST/WebSocket) |
└────────┬─────────┘
v
┌──────────────────┐
| Manager Service |
| (Port 8080) |
└────────┬─────────┘
|
┌────────────────────┼────────────────────┐
| | |
v v v
┌──────────┐ ┌──────────┐ ┌──────────────┐ | Rules | | Asset | | Notification | | Engine | | Storage | | Service | └──────────┘ └──────────┘ └──────────────┘ | | v v ┌──────────────────────────────────┐ | PostgreSQL / Timescale Database | └──────────────────────────────────┘
---
## Глубокий анализ уязвимости
### Анализ первопричины
Уязвимость проистекает из двух критических недостатков в Rules Engine проекта OpenRemote:
**Недостаток 1: Неизолированный движок JavaScript Nashorn**
Движок JavaScript Nashorn (Java) используется для оценки пользовательских выражений правил без какой-либо изоляции, менеджера безопасности или ограничений ClassFilter. Это позволяет злоумышленникам получать прямой доступ к классам Java из контекста JavaScript.
**Недостаток 2: Отключенная изоляция Groovy**
В движке сценариев Groovy был зарегистрирован GroovyDenyAllFilter для предотвращения выполнения кода, однако эта регистрация фильтра была закомментирована в кодовой базе. На уровне API применялось только ограничение для Groovy (RulesResourceImpl.java:262), тогда как для JavaScript никаких ограничений не существовало.
### Уязвимые пути выполнения кода```
RulesResource.java (lines 153-158)
|
> POST request handler for rule creation
|
v
RulesetDeployment.java (line 368)
|
> scriptEngine.eval(ruleExpression)
|
v
Nashorn Engine
|
> No ClassFilter / SecurityManager
> Java.type() accessible
> Runtime.exec() available
Уязвимость затрагивает аутентифицированных пользователей с ролью write:rules. Проверка авторизации в RulesResourceImpl.java:262 блокирует Groovy только для пользователей, не являющихся суперпользователями:```
if (!isUserSuperuser && isGroovy) {
throw new UnauthorizedException("Groovy rules not allowed");
}
Это означает:
- Не-суперпользователи МОГУТ создавать JavaScript-правила (без блокировки)
- Не-суперпользователи НЕ МОГУТ создавать Groovy-правила (заблокировано)
- JavaScript не имеет песочницы, поэтому эксплуатация возможна для любого аутентифицированного пользователя с правами write:rules
Кроме того, изоляцию мультитенантности можно обойти через рефлексию на assetStorageService для доступа к данным других тенантов.