
Vulnérabilité critique d'exécution de code à distance dans le moteur de règles d'OpenRemote permettant aux utilisateurs authentifiés disposant du rôle `write:rules` d'exécuter du code arbitraire sur le serveur avec les privilèges root.
Vulnérabilité critique d'exécution de code à distance dans le moteur de règles d'OpenRemote permettant aux utilisateurs authentifiés disposant du rôle write:rules d'exécuter du code arbitraire sur le serveur avec les privilèges root.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H| Aspect | Détails |
|---|---|
| ID CVE | CVE-2026-39842 |
| ID GHSA | GHSA-7mqr-33rv-p3mp |
| Type de vulnérabilité | Injection de code / Injection de langage d'expression |
| Score CVSS | 10.0 (Critique) |
| CWE | CWE-94, CWE-917 |
| Produit | OpenRemote |
| Versions concernées | <= 1.21.0 |
| Version corrigée | >= 1.22.0 |
| Authentification requise | Oui |
| Niveau de privilège requis | Rôle write:rules (non-superutilisateur) |
| Points de terminaison vulnérables | POST /api/{realm}/rules/realm, POST /api/{realm}/rules/asset |
| Niveau d'exécution RCE | root |
| Exploitabilité | Élevée |
| Complexité | Faible |
| Date de découverte | 2026 |
OpenRemote est une plateforme IoT open source destinée à la construction de bâtiments, de villes et d'industries intelligents. Elle fournit la gestion d'appareils, des règles d'automatisation, des analyses et des intégrations pour l'écosystème de l'Internet des objets.
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 | └──────────────────────────────────┘
---
## Analyse approfondie de la vulnérabilité
### Analyse de la cause racine
La vulnérabilité provient de deux défauts critiques dans le moteur de règles d'OpenRemote :
**Défaut 1 : Moteur JavaScript Nashorn non sandboxé**
Le moteur JavaScript Nashorn de Java est utilisé pour évaluer les expressions de règles fournies par l'utilisateur sans aucun sandboxing, gestionnaire de sécurité ni restriction ClassFilter. Cela permet aux attaquants d'accéder directement aux classes Java depuis le contexte JavaScript.
**Défaut 2 : Sandbox Groovy désactivé**
Le moteur de scripts Groovy disposait d'un GroovyDenyAllFilter enregistré pour empêcher l'exécution de code, mais cet enregistrement de filtre a été commenté dans le code source. Seule l'application de Groovy existait au niveau de l'API (RulesResourceImpl.java:262), mais JavaScript n'avait aucune restriction.
### Chemins de code vulnérables```
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 vulnérabilité affecte les utilisateurs authentifiés disposant du rôle write:rules. Le contrôle d'autorisation dans RulesResourceImpl.java:262 ne bloque Groovy que pour les non-superutilisateurs :```
if (!isUserSuperuser && isGroovy) {
throw new UnauthorizedException("Groovy rules not allowed");
}
Cela signifie :
- Les non-superutilisateurs PEUVENT créer des règles JavaScript (aucun blocage)
- Les non-superutilisateurs NE PEUVENT PAS créer de règles Groovy (bloqué)
- JavaScript n'a pas de sandbox, donc l'exploitation est possible pour tout utilisateur authentifié disposant de write:rules
De plus, l'isolation multi-tenant peut être contournée via la réflexion sur assetStorageService pour accéder aux données d'autres realms.