
Неаутентифицированный эксплойт RCE и сканер обнаружения для Weaver E-cology, нацеленный на отладочную конечную точку dubboApi. Включает PoC, NSE-скрипт Nmap и рекомендации по устранению уязвимости.
Weaver E-cology 10.0 (до сборки 20260312) содержит критическую уязвимость неаутентифицированного удалённого выполнения кода в конечной точке /papi/esearch/data/devops/dubboApi/debug/method. Злоумышленники могут внедрять произвольные команды через POST-параметры interfaceName и methodName без аутентификации, добиваясь полного компрометации системы. Активная эксплуатация обнаружена с 2026-03-31 организацией Shadowserver Foundation.
Быстрая оценка риска: CVSS 9.3 — полностью неаутентифицированная, не требует взаимодействия с пользователем, доступная по сети конечная точка, ведущая непосредственно к выполнению кода.
Weaver E-cology — одна из наиболее широко развёрнутых в Китае корпоративных платформ OA (автоматизации делопроизводства) и совместной работы. Разработанная группой Fanwei, она широко используется в:
E-cology предоставляет комплексные корпоративные решения, включая:
Развёртывания E-cology обычно охватывают от сотен до тысяч пользователей на организацию. Платформа является критически важным компонентом инфраструктуры для многих организаций, что делает уязвимости в ней чрезвычайно высокими по воздействию.
Уязвимость существует в отладочной конечной точке dubboApi, которая, вероятно, была оставлена доступной для целей разработки и устранения неполадок. Конечная точка позволяет напрямую вызывать произвольные методы через фреймворк Dubbo RPC без надлежащей проверки входных данных или проверок аутентификации.
Уязвимый шаблон кода:``` POST /papi/esearch/data/devops/dubboApi/debug/method HTTP/1.1 Host: target.com Content-Type: application/json
{ "interfaceName": "com.weaver.rpc.InvokeCommand", "methodName": "executeCommand", "parameters": ["id", "whoami", "cat /etc/passwd"] }
Приложение напрямую обрабатывает эти параметры и передаёт их вспомогательным функциям выполнения RPC-команд без:
- проверки аутентификации
- валидации/очистки входных данных
- применения белого списка методов
- проверки типов параметров
Это позволяет злоумышленникам указывать произвольные методы интерфейсов Dubbo, которые выполняют системные команды.
### Схема потока атаки```
Internet Attacker
|
| Sends unauthenticated POST request
| with malicious interfaceName/methodName
v
Weaver E-cology HTTP Server (port 80/443)
|
| No authentication check
| No authorization validation
v
/papi/esearch/data/devops/dubboApi/debug/method endpoint
|
| Direct parameter pass-through to Dubbo RPC layer
v
Dubbo RPC Framework (unvalidated interface invocation)
|
| Resolves arbitrary interface methods
| Attacker-controlled method name injection
v
Command Execution Helpers (vulnerable classes)
|
| Direct OS command execution via Runtime.exec()
| or similar OS command invocation mechanisms
v
System Command Execution
|
| Complete code execution as Weaver service user
| (typically root or high-privilege account)
|
+-> Read sensitive files (/etc/passwd, configs)
+-> Execute arbitrary binaries
+-> Create reverse shells
+-> Exfiltrate data
+-> Establish persistence
v
Complete System Compromise
Путь конечной точки: /papi/esearch/data/devops/dubboApi/debug/method
HTTP-метод: POST
Требуемая аутентификация: Отсутствует (нулевая аутентификация)
Требуемые заголовки: Стандартные HTTP-заголовки (специальные токены или cookie не требуются)
Параметры тела запроса:
Internet | v Firewall (often misconfigured or open for "accessibility") | v Web Server (port 80/443) | +--------> HTTP Request to any path | v Route Dispatcher | +---> /login/Login.jsp > Requires authentication | +---> /wui/index.html > Requires authentication | +---> /papi/esearch/data/devops/dubboApi/debug/method | +---> UNPROTECTED - No authentication check! | v Dubbo RPC Invoker (unrestricted method invocation) | v OS Command Execution | v System Compromise (RCE as web user)
### Типичная архитектура развёртывания Weaver```
Corporate Network
=================
Internet > Firewall (port 80/443 open for E-cology)
|
v
Load Balancer (optional)
|
+---------+---------+
| | |
v v v
Node1 Node2 Node3
Web Web Web
Server Server Server
| | |
+----------+----+----+
|
v
Shared Storage
(Documents/Config)
|
v
Database Server
(MySQL/Oracle)
Each Web Server has:
- Weaver E-cology Java application
- Embedded Tomcat/JBoss container
- Dubbo RPC framework
- VULNERABLE /papi/esearch/data/devops/dubboApi/debug/method
endpoint (pre-patch)
Государственный субъект или киберпреступная группа эксплуатирует развёртывания E-cology в государственных учреждениях для:
Злоумышленники атакуют экземпляры E-cology в банках или финансовых учреждениях для:
Скомпрометированные экземпляры E-cology используются в качестве точек перехода для:
Примечание: Другие версии могут быть затронуты. Weaver не опубликовал исчерпывающую информацию о совместимости версий. Организациям следует тщательно тестировать патчи перед развёртыванием.
Имя файла: CVE-2026-22679_Weaver_Ecology_RCE_detector.py
Описание: Безопасный, неразрушающий скрипт обнаружения, который идентифицирует уязвимые экземпляры Weaver E-cology путём проверки доступности конечной точки.```python #!/usr/bin/env python3 """ CVE-2026-22679 Weaver E-cology RCE Detection Scanner Detects vulnerable dubboApi debug endpoint exposure Author: Kerem Oruc (@keraattin) """
import requests import argparse import sys from datetime import datetime from urllib.parse import urljoin import json
class WeaverEcologyScanner: def init(self, timeout=10, verify_ssl=False): self.timeout = timeout self.verify_ssl = verify_ssl self.vulnerable_endpoint = "/papi/esearch/data/devops/dubboApi/debug/method" self.weaver_identifiers = [ "/login/Login.jsp", "/wui/index.html", "/UploadFiles/", ]
def is_weaver_ecology(self, base_url):
"""Identify if target is Weaver E-cology instance"""
for path in self.weaver_identifiers:
try:
url = urljoin(base_url, path)
response = requests.get(
url,
timeout=self.timeout,
verify=self.verify_ssl,
allow_redirects=False
)
if response.status_code in [200, 302, 301]:
return True
except:
continue
return False
def check_vulnerability(self, base_url):
"""Check if dubboApi debug endpoint is accessible"""
try:
url = urljoin(base_url, self.vulnerable_endpoint)
# Test with GET request
response = requests.get(
url,
timeout=self.timeout,
verify=self.verify_ssl,
allow_redirects=False
)
# 200 (success), 405 (method not allowed), or 400 (bad request)
# all indicate endpoint exists
if response.status_code in [200, 400, 405]:
return True, response.status_code
# Test with POST request as fallback
response = requests.post(
url,
json={},
timeout=self.timeout,
verify=self.verify_ssl,
allow_redirects=False
)
if response.status_code in [200, 400, 405]:
return True, response.status_code
return False, response.status_code
except requests.exceptions.RequestException:
return False, None
def scan_target(self, base_url):
"""Scan single target"""
result = {
"target": base_url,
"timestamp": datetime.utcnow().isoformat() + "Z",
"is_weaver": False,
"vulnerable": False,
"endpoint_status": None,
"risk_level": "LOW"
}
# Normalize URL
if not base_url.startswith(("http://", "https://")):
base_url = "http://" + base_url
# Check if Weaver E-cology
is_weaver = self.is_weaver_ecology(base_url)
result["is_weaver"] = is_weaver
if not is_weaver:
result["risk_level"] = "LOW"
return result
# Check vulnerability
is_vulnerable, status_code = self.check_vulnerability(base_url)
result["endpoint_status"] = status_code
result["vulnerable"] = is_vulnerable
if is_vulnerable:
result["risk_level"] = "CRITICAL"
else:
result["risk_level"] = "UNKNOWN"
return result
def format_report(self, results):
"""Format scan results for display"""
report = []
report.append("\n[*] CVE-2026-22679 Weaver E-cology RCE Detection Scanner")
report.append(f"[*] Scanning {len(results)} target(s)...")
report.append("[*] Detection method: dubboApi debug endpoint accessibility check")
report.append(f"[*] Endpoint: {self.vulnerable_endpoint}")
report.append("[*] NOTE: No commands are executed. Safe, non-destructive scan.\n")
report.append("=" * 70)
for result in results:
report.append(f"\nTarget: {result['target']}")
report.append(f"Scan Time: {result['timestamp']}")
report.append(f"Risk Level: {result['risk_level']}")
report.append("=" * 70)
report.append(f" Is Weaver E-cology: {'YES' if result['is_weaver'] else 'NO'}")
report.append(f" Debug Endpoint: {'ACCESSIBLE' if result['vulnerable'] else 'NOT ACCESSIBLE'}")
report.append(f" Endpoint HTTP Status: {result['endpoint_status']}")
report.append(f" Vulnerable: {'YES' if result['vulnerable'] else 'NO'}")
if result["vulnerable"]:
report.append("")
report.append(" *** CRITICAL: dubboApi debug endpoint is exposed! ***")
report.append(" *** Unauthenticated RCE via interfaceName/methodName injection ***")
report.append(f" *** Endpoint: {self.vulnerable_endpoint} ***")
report.append(" *** Update to build 20260312 or block this endpoint immediately ***")
report.append("\n" + "=" * 70)
return "\n".join(report)
def main(): parser = argparse.ArgumentParser( description="CVE-2026-22679 Weaver E-cology RCE Detection Scanner" ) parser.add_argument("targets", nargs="+", help="Target URL(s) to scan (e.g., http://target.com)") parser.add_argument("--timeout", type=int, default=10, help="Request timeout in seconds") parser.add_argument("--no-verify-ssl", action="store_true", help="Disable SSL verification")
args = parser.parse_args()
scanner = WeaverEcologyScanner(timeout=args.timeout, verify_ssl=not args.no_verify_ssl)
results = []
for target in args.targets:
result = scanner.scan_target(target)
results.append(result)
print(scanner.format_report(results))
# Exit with error if any vulnerabilities found
if any(r["vulnerable"] for r in results):
sys.exit(1)
sys.exit(0)
if name == "main": main()
**Примеры использования:**```bash
# Scan single target
python3 CVE-2026-22679_Weaver_Ecology_RCE_detector.py http://target.com
# Scan multiple targets
python3 CVE-2026-22679_Weaver_Ecology_RCE_detector.py http://target1.com http://target2.com
# Scan with custom timeout
python3 CVE-2026-22679_Weaver_Ecology_RCE_detector.py http://target.com --timeout 5
# Scan with SSL verification disabled
python3 CVE-2026-22679_Weaver_Ecology_RCE_detector.py https://target.com --no-verify-ssl
Пример вывода:``` [] CVE-2026-22679 Weaver E-cology RCE Detection Scanner [] Scanning 1 target(s)... [] Detection method: dubboApi debug endpoint accessibility check [] Endpoint: /papi/esearch/data/devops/dubboApi/debug/method [*] NOTE: No commands are executed. Safe, non-destructive scan.
Is Weaver E-cology: YES Debug Endpoint: ACCESSIBLE Endpoint HTTP Status: 200 Vulnerable: YES
*** CRITICAL: dubboApi debug endpoint is exposed! *** *** Unauthenticated RCE via interfaceName/methodName injection *** *** Endpoint: /papi/esearch/data/devops/dubboApi/debug/method *** *** Update to build 20260312 or block this endpoint immediately ***
======================================================================
### Nmap NSE-скрипт
**Имя файла:** `CVE-2026-22679_Weaver_Ecology_RCE.nse`
**Описание:** Nmap NSE-скрипт для обнаружения уязвимости, интегрированный с рабочими процессами Nmap.```lua
-- CVE-2026-22679 Weaver E-cology RCE Detection Script
-- Detects vulnerable dubboApi debug endpoint exposure
-- Author: Kerem Oruc (@keraattin)
local http = require "http"
local shortport = require "shortport"
local stdnse = require "stdnse"
local vulns = require "vulns"
description = [[
Detects Weaver E-cology instances vulnerable to CVE-2026-22679.
This vulnerability allows unauthenticated remote code execution through
the exposed dubboApi debug endpoint at /papi/esearch/data/devops/dubboApi/debug/method
]]
author = "Kerem Oruc (@keraattin)"
license = "Same as Nmap--See https://nmap.org/COPYING"
categories = {"vuln", "safe"}
portrule = shortport.http
local VULNERABLE_ENDPOINT = "/papi/esearch/data/devops/dubboApi/debug/method"
local WEAVER_IDENTIFIERS = {
"/login/Login.jsp",
"/wui/index.html",
"/UploadFiles/"
}
local function is_weaver_ecology(host, port)
for _, path in ipairs(WEAVER_IDENTIFIERS) do
local response = http.get(host, port, path)
if response.status and response.status >= 200 and response.status < 400 then
return true
end
end
return false
end
local function check_vulnerability(host, port)
local response = http.get(host, port, VULNERABLE_ENDPOINT)
if response.status then
-- 200 (OK), 400 (Bad Request), 405 (Method Not Allowed)
-- all indicate the endpoint exists (unpatched)
if response.status == 200 or response.status == 400 or response.status == 405 then
return true, response.status
end
end
-- Try POST as fallback
local response = http.post(host, port, VULNERABLE_ENDPOINT, nil, {}, "")
if response.status then
if response.status == 200 or response.status == 400 or response.status == 405 then
return true, response.status
end
end
return false, response.status or "unknown"
end
action = function(host, port)
local vuln_table = {
title = "Weaver E-cology Unauthenticated RCE (CVE-2026-22679)",
state = vulns.STATE.UNKNOWN,
risk_level = "CRITICAL",
IDS = {
CVE = "CVE-2026-22679",
CWE = "CWE-94"
},
description = [[
The dubboApi debug endpoint is exposed without authentication.
An attacker can send POST requests with crafted parameters to
achieve remote code execution through parameter injection.
]],
references = {
"https://nvd.nist.gov/vuln/detail/CVE-2026-22679",
},
dates = {
disclosure = {year = 2026, month = 3, day = 31},
discovery = {year = 2026, month = 3, day = 12}
}
}
local vuln_report = vulns.Report:new(VULNERABLE_ENDPOINT, host, port)
-- Check if target is Weaver E-cology
if not is_weaver_ecology(host, port) then
vuln_table.state = vulns.STATE.NOT_VULN
return vuln_report:make_output(vuln_table)
end
-- Check if vulnerable endpoint is accessible
local is_vulnerable, status_code = check_vulnerability(host, port)
if is_vulnerable then
vuln_table.state = vulns.STATE.VULNERABLE
vuln_table.extra_info = string.format(
"Debug endpoint accessible at %s (HTTP %d)",
VULNERABLE_ENDPOINT,
status_code
)
else
vuln_table.state = vulns.STATE.NOT_VULN
end
return vuln_report:make_output(vuln_table)
end
Примеры использования:```bash
nmap -p 80 --script CVE-2026-22679_Weaver_Ecology_RCE.nse target.com
nmap -p 80,443,8080,8443 --script CVE-2026-22679_Weaver_Ecology_RCE.nse target.com
nmap -p 80 --script CVE-2026-22679_Weaver_Ecology_RCE.nse 10.0.0.0/24
nmap -p 80 --script CVE-2026-22679_Weaver_Ecology_RCE.nse -v target.com
nmap -p 80 --script http-title,http-headers,CVE-2026-22679_Weaver_Ecology_RCE.nse target.com
**Пример вывода:**```
PORT STATE SERVICE
80/tcp open http
| CVE-2026-22679_Weaver_Ecology_RCE:
| VULNERABLE:
| Weaver E-cology Unauthenticated RCE (CVE-2026-22679)
| State: VULNERABLE
| Risk level: CRITICAL
| Debug endpoint: accessible at /papi/esearch/data/devops/dubboApi/debug/method
| Description:
| The dubboApi debug endpoint is exposed without authentication.
| An attacker can send POST requests with crafted parameters to
| achieve remote code execution. Update to build 20260312.
| Discovery Date: 2026-03-12
| Disclosure Date: 2026-03-31
| IDs:
| CVE: CVE-2026-22679
| CWE: CWE-94 (Code Injection)
| References:
|_ https://nvd.nist.gov/vuln/detail/CVE-2026-22679
/papi/esearch/data/devops/dubboApi/debug/methodinterfaceName или methodNameЖурналы доступа веб-сервера:``` POST /papi/esearch/data/devops/dubboApi/debug/method HTTP/1.1 200 - POST /papi/esearch/data/devops/dubboApi/debug/method HTTP/1.1 405 - GET /papi/esearch/data/devops/dubboApi/debug/method HTTP/1.1 405 -
**Журналы приложений:**
- Исключения или ошибки, связанные с вызовом Dubbo RPC
- Предупреждения о непроверенных параметрах в журналах RPC-фреймворка
- ClassNotFoundException или сбои вызова методов
- Неожиданные попытки разрешения интерфейсов
### Индикаторы на уровне хоста
- Неожиданные дочерние процессы, порождаемые Java-процессом Weaver
- Создание новых учетных записей пользователей в системе
- Неожиданные сетевые подключения от службы Weaver
- Изменение файлов конфигурации Weaver
- Наличие веб-шеллов в каталогах Weaver
- Необычные записи файлов в системные каталоги
- Подозрительные записи в cronjob или службах
### Индикаторы файловой системы
- Неожиданные файлы в `/tmp/` или `/var/tmp/`
- Измененные JAR-файлы Weaver или файлы конфигурации
- Новые shell-скрипты в каталогах, доступных через веб
- Наличие распространенных имен файлов веб-шеллов (shell.jsp, cmd.jsp и т. д.)
---
## Устранение последствий
### Немедленные действия (0–24 часа)
1. **Отключение сетевого доступа к отладочной конечной точке**
Добавьте правило брандмауэра для блокировки доступа к уязвимой конечной точке: ```
# iptables example
iptables -I INPUT -p tcp --dport 80 -m string --string "/papi/esearch/data/devops/dubboApi" --algo bm -j DROP
# nginx example
location /papi/esearch/data/devops/dubboApi {
return 403;
}
# Apache example
<Location "/papi/esearch/data/devops/dubboApi">
Deny from all
</Location>
Мониторинг активной эксплуатации
Ограничение сетевого доступа
Применение официального патча
Обновите Weaver E-cology до сборки 20260312 или более поздней версии: ```bash
cp -r /opt/ecology /opt/ecology.backup.20260415
/opt/ecology/bin/upgrade.sh --version 20260312
curl -X POST http://localhost/papi/esearch/data/devops/dubboApi/debug/method
Просмотр журналов доступа
Проведение криминалистического анализа хоста
Полная оценка системы
Внедрение сегментации сети
Укрепление безопасности
Обновление мониторинга безопасности
Kerem Oruc (@keraattin)
Отказ от ответственности: Эта информация предоставлена исключительно в образовательных целях и для защиты систем. Несанкционированный доступ к компьютерным системам является незаконным. Всегда получайте надлежащее разрешение перед тестированием или доступом к системам, которые вам не принадлежат.
Последнее обновление: 2026-04-15
| Аспект | Детали |
|---|
| CVE ID | CVE-2026-22679 |
| Оценка CVSS | 9.3 (Критическая) |
| Вектор CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-94 (Внедрение кода) |
| Поставщик | Weaver (Fanwei) |
| Продукт | E-cology 10.0 |
| Тип уязвимости | Неаутентифицированное удалённое выполнение кода (RCE) |
| Затронутая конечная точка | /papi/esearch/data/devops/dubboApi/debug/method |
| Вектор атаки | Сеть / HTTP POST |
| Требуется аутентификация | Нет |
| Затронутые версии | Версии 10.0 до сборки 20260312 |
| Исправленная версия | Сборка 20260312 (выпущена 2026-03-12) |
| Активная эксплуатация | С 2026-03-31 (Shadowserver Foundation) |
| Метод исправления | Полное удаление уязвимой конечной точки |
| Параметр | Тип | Описание | Пример |
|---|
interfaceName | String | Имя класса RPC-интерфейса (управляется атакующим) | com.weaver.rpc.InvokeCommand |
methodName | String | Имя вызываемого метода (управляется атакующим) | executeCommand |
parameters | Array | Параметры метода, передаваемые напрямую в логику выполнения | ["id"] |
| Область воздействия | Серьёзность | Подробности |
|---|
| Конфиденциальность | КРИТИЧЕСКАЯ | Неаутентифицированный доступ ко всем системным данным, документам, учётным данным пользователей, содержимому баз данных |
| Целостность | КРИТИЧЕСКАЯ | Возможность изменять файлы, документы, записи баз данных и системные конфигурации |
| Доступность | КРИТИЧЕСКАЯ | Остановка системы, исчерпание ресурсов, уничтожение данных, нарушение работы сервисов |
| Область действия | ИЗМЕНЕНА | Пользователь службы Weaver обычно работает от имени root или учётной записи с высокими привилегиями; полная компрометация системы |
| Версия | Диапазон сборок | Статус | Доступен патч |
|---|
| 10.0 | < 20260312 | УЯЗВИМА | Да |
| 10.0 | >= 20260312 | ИСПРАВЛЕНА | Н/Д (конечная точка удалена) |
| 9.x и более ранние | Все | НЕИЗВЕСТНО | Уточняйте у поставщика |