
Vulnerabilidad crítica de ejecución remota de código en el Rules Engine de OpenRemote que permite a usuarios autenticados con el rol `write:rules` ejecutar código arbitrario en el servidor con privilegios de root.
Vulnerabilidad crítica de ejecución remota de código en el Motor de Reglas de OpenRemote que permite a usuarios autenticados con el rol write:rules ejecutar código arbitrario en el servidor con privilegios de root.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H| Aspecto | Detalles |
|---|---|
| ID CVE | CVE-2026-39842 |
| ID GHSA | GHSA-7mqr-33rv-p3mp |
| Tipo de Vulnerabilidad | Inyección de Código / Inyección de Lenguaje de Expresiones |
| Puntuación CVSS | 10.0 (Crítica) |
| CWE | CWE-94, CWE-917 |
| Producto | OpenRemote |
| Versiones Afectadas | <= 1.21.0 |
| Versión Corregida | >= 1.22.0 |
| Autenticación Requerida | Sí |
| Nivel de Privilegio Necesario | Rol write:rules (no superusuario) |
| Endpoints Vulnerables | POST /api/{realm}/rules/realm, POST /api/{realm}/rules/asset |
| Nivel de Ejecución RCE | root |
| Explotabilidad | Alta |
| Complejidad | Baja |
| Fecha de Descubrimiento | 2026 |
OpenRemote es una plataforma IoT de código abierto para construir edificios, ciudades e industrias inteligentes. Proporciona gestión de dispositivos, reglas de automatización, analíticas e integraciones para el ecosistema de Internet de las Cosas.
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 | └──────────────────────────────────┘
---
## Análisis Profundo de la Vulnerabilidad
### Análisis de la Causa Raíz
La vulnerabilidad se origina en dos fallos críticos en el motor de reglas de OpenRemote:
**Fallo 1: Motor JavaScript Nashorn sin sandbox**
El motor JavaScript Nashorn de Java se utiliza para evaluar expresiones de reglas proporcionadas por el usuario sin ningún sandbox, administrador de seguridad ni restricciones de ClassFilter. Esto permite a los atacantes acceder a clases de Java directamente desde el contexto de JavaScript.
**Fallo 2: Sandbox de Groovy deshabilitado**
El motor de scripts Groovy tenía un GroovyDenyAllFilter registrado para prevenir la ejecución de código, pero este registro de filtro estaba comentado en el código base. Solo existía una aplicación de Groovy a nivel de API (RulesResourceImpl.java:262), pero JavaScript no tenía restricciones.
### Rutas de Código Vulnerables```
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
La vulnerabilidad afecta a usuarios autenticados con el rol write:rules. La comprobación de autorización en RulesResourceImpl.java:262 solo bloquea Groovy para usuarios que no son superusuarios:```
if (!isUserSuperuser && isGroovy) {
throw new UnauthorizedException("Groovy rules not allowed");
}
Esto significa:
- Los usuarios no superusuarios PUEDEN crear reglas JavaScript (sin bloqueo)
- Los usuarios no superusuarios NO PUEDEN crear reglas Groovy (bloqueadas)
- JavaScript no tiene sandboxing, por lo que la explotación es posible para cualquier usuario autenticado con write:rules
Además, el aislamiento multiinquilino se puede eludir mediante reflexión sobre assetStorageService para acceder a los datos de otros realms.