
Vulnerabilidade crítica de execução remota de código no Rules Engine do OpenRemote permite que usuários autenticados com a função `write:rules` executem código arbitrário no servidor com privilégios de root.
Vulnerabilidade crítica de execução remota de código no Rules Engine do OpenRemote permite que usuários autenticados com a função write:rules executem código arbitrário no servidor com privilégios de root.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H| Aspecto | Detalhes |
|---|---|
| ID CVE | CVE-2026-39842 |
| ID GHSA | GHSA-7mqr-33rv-p3mp |
| Tipo de Vulnerabilidade | Injeção de Código / Injeção de Linguagem de Expressão |
| Pontuação CVSS | 10.0 (Crítica) |
| CWE | CWE-94, CWE-917 |
| Produto | OpenRemote |
| Versões Afetadas | <= 1.21.0 |
| Versão Corrigida | >= 1.22.0 |
| Autenticação Necessária | Sim |
| Nível de Privilégio Necessário | Função write:rules (não-superusuário) |
| Endpoints Vulneráveis | POST /api/{realm}/rules/realm, POST /api/{realm}/rules/asset |
| Nível de Execução RCE | root |
| Explorabilidade | Alta |
| Complexidade | Baixa |
| Data da Descoberta | 2026 |
O OpenRemote é uma plataforma IoT de código aberto para construir edifícios, cidades e indústrias inteligentes. Ela fornece gerenciamento de dispositivos, regras de automação, análises e integrações para o ecossistema da Internet das Coisas.
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álise Aprofundada da Vulnerabilidade
### Análise da Causa Raiz
A vulnerabilidade decorre de duas falhas críticas no Motor de Regras do OpenRemote:
**Falha 1: Motor JavaScript Nashorn sem Sandbox**
O motor JavaScript Nashorn do Java é usado para avaliar expressões de regras fornecidas pelo usuário sem qualquer sandbox, security manager ou restrições de ClassFilter. Isso permite que atacantes acessem classes Java diretamente do contexto JavaScript.
**Falha 2: Sandbox Groovy Desativado**
O motor de script Groovy tinha um GroovyDenyAllFilter registrado para impedir a execução de código, mas esse registro de filtro foi comentado no código. Apenas a aplicação da política Groovy existia no nível da API (RulesResourceImpl.java:262), mas o JavaScript não tinha restrições.
### Caminhos de Código Vulneráveis```
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
A vulnerabilidade afeta utilizadores autenticados com o papel write:rules. A verificação de autorização em RulesResourceImpl.java:262 apenas bloqueia Groovy para utilizadores que não são superutilizadores:```
if (!isUserSuperuser && isGroovy) {
throw new UnauthorizedException("Groovy rules not allowed");
}
Isto significa:
- Utilizadores não-superusuários PODEM criar regras JavaScript (sem bloqueio)
- Utilizadores não-superusuários NÃO PODEM criar regras Groovy (bloqueado)
- JavaScript não tem sandboxing, pelo que a exploração é possível para qualquer utilizador autenticado com write:rules
Além disso, o isolamento multi-tenant pode ser contornado via reflexão no assetStorageService para aceder a dados de outros realms.