
Nicht authentifizierter RCE-Exploit- und Erkennungsscanner für Weaver E-cology, der auf den dubboApi-Debug-Endpunkt abzielt. Enthält PoC, Nmap-NSE-Skript und Anleitung zur Behebung.
Weaver E-cology 10.0 (vor Build 20260312) enthält eine kritische Schwachstelle für nicht authentifizierte Remote-Codeausführung im Endpoint /papi/esearch/data/devops/dubboApi/debug/method. Angreifer können ohne Authentifizierung beliebige Befehle über die POST-Parameter interfaceName und methodName injizieren und so die vollständige Kontrolle über das System erlangen. Aktive Ausnutzung seit dem 31.03.2026 von der Shadowserver Foundation erkannt.
Kurzes Risiko: CVSS 9.3 – Vollständig ohne Authentifizierung, keine Benutzerinteraktion erforderlich, über das Netzwerk erreichbarer Endpoint, der direkt zur Codeausführung führt.
Weaver E-cology ist eine der am weitesten verbreiteten Enterprise-OA-Plattformen (Office Automation) und Kollaborationsplattformen Chinas. Entwickelt von der Fanwei Group, wird sie umfassend eingesetzt in:
E-cology bietet umfassende Unternehmenslösungen, darunter:
E-cology-Bereitstellungen umfassen typischerweise Hunderte bis Tausende von Benutzern pro Organisation. Die Plattform ist eine kritische Infrastrukturkomponente für viele Organisationen, was Schwachstellen darin äußerst wirkungsvoll macht.
Die Schwachstelle existiert im dubboApi-Debug-Endpoint, der wahrscheinlich für Entwicklungs- und Fehlerbehebungszwecke zugänglich gelassen wurde. Der Endpoint erlaubt die direkte Aufrufung beliebiger Methoden über das Dubbo-RPC-Framework ohne ordnungsgemäße Eingabevalidierung oder Authentifizierungsprüfungen.
Verwundbares Codemuster:``` 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"] }
Die Anwendung verarbeitet diese Parameter direkt und übergibt sie ohne Folgendes an RPC-Befehlsausführungshilfen:
- Authentifizierungsprüfung
- Eingabevalidierung/-bereinigung
- Durchsetzung einer Methoden-Whitelist
- Typprüfung der Parameter
Dies ermöglicht es Angreifern, beliebige Dubbo-Schnittstellenmethoden anzugeben, die Systembefehle ausführen.
### Angriffsablauf-Diagramm```
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
Endpunkt-Pfad: /papi/esearch/data/devops/dubboApi/debug/method
HTTP-Methode: POST
Erforderliche Authentifizierung: Keine (null Authentifizierung)
Erforderliche Header: Standard-HTTP-Header (keine speziellen Tokens oder Cookies erforderlich)
Parameter des Anfragetexts:
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)
### Typische Weaver-Bereitstellungsarchitektur```
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)
Ein Nationalstaat oder eine kriminelle Gruppe nutzt E-cology-Bereitstellungen bei Regierungsbehörden aus, um:
Angreifer kompromittieren E-cology-Instanzen bei Banken oder Finanzinstituten, um:
Kompromittierte E-cology-Instanzen werden als Sprungbrett genutzt, um:
Hinweis: Andere Versionen können betroffen sein. Weaver hat keine umfassenden Versionskompatibilitätsinformationen veröffentlicht. Organisationen sollten Patches vor der Bereitstellung gründlich testen.
Dateiname: CVE-2026-22679_Weaver_Ecology_RCE_detector.py
Beschreibung: Sicheres, nicht destruktives Erkennungsskript, das verwundbare Weaver-E-cology-Instanzen durch Prüfung der Endpunkt-Erreichbarkeit identifiziert.```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()
**Verwendungsbeispiele:**```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
Beispielausgabe:``` [] 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-Skript
**Dateiname:** `CVE-2026-22679_Weaver_Ecology_RCE.nse`
**Beschreibung:** Nmap-NSE-Skript zur Schwachstellenerkennung, integriert in Nmap-Workflows.```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
Verwendungsbeispiele:```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
**Beispielausgabe:**```
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- oder methodName-Parameter enthaltenWebserver-Zugriffsprotokolle:``` 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 -
**Anwendungsprotokolle:**
- Ausnahmen oder Fehler im Zusammenhang mit Dubbo-RPC-Aufrufen
- Warnungen über nicht validierte Parameter in RPC-Framework-Protokollen
- ClassNotFoundException oder Fehler bei Methodenaufrufen
- Unerwartete Versuche zur Schnittstellenauflösung
### Host-basierte Indikatoren
- Unerwartete Kindprozesse, die vom Weaver-Java-Prozess erzeugt wurden
- Neue Benutzerkonten, die auf dem System erstellt wurden
- Unerwartete Netzwerkverbindungen vom Weaver-Dienst
- Änderungen an Weaver-Konfigurationsdateien
- Vorhandensein von Webshells in Weaver-Verzeichnissen
- Ungewöhnliche Dateischreibvorgänge in Systemverzeichnissen
- Verdächtige Cronjob- oder Dienst-Einträge
### Dateisystem-Indikatoren
- Unerwartete Dateien in `/tmp/` oder `/var/tmp/`
- Geänderte Weaver-JAR-Dateien oder Konfigurationsdateien
- Neue Shell-Skripte in webfähigen Verzeichnissen
- Vorhandensein gängiger Webshell-Dateinamen (shell.jsp, cmd.jsp usw.)
---
## Behebung
### Sofortmaßnahmen (0-24 Stunden)
1. **Netzwerkzugriff auf den Debug-Endpunkt deaktivieren**
Fügen Sie eine Firewall-Regel hinzu, um den Zugriff auf den anfälligen Endpunkt zu blockieren: ```
# 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>
Überwachung auf aktive Ausnutzung
Netzwerkzugriff einschränken
Offiziellen Patch anwenden
Auf Weaver E-cology Build 20260312 oder neuer aktualisieren: ```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
Zugriffsprotokolle prüfen
Host-Forensik durchführen
Vollständige Systembewertung
Netzwerksegmentierung implementieren
Härtung
Sicherheitsüberwachung aktualisieren
Kerem Oruc (@keraattin)
Haftungsausschluss: Diese Informationen dienen ausschließlich Bildungs- und Verteidigungszwecken. Unbefugter Zugriff auf Computersysteme ist illegal. Holen Sie stets die entsprechende Genehmigung ein, bevor Sie Systeme testen oder darauf zugreifen, die Ihnen nicht gehören.
Zuletzt aktualisiert: 2026-04-15
| Aspekt | Details |
|---|
| CVE-ID | CVE-2026-22679 |
| CVSS-Score | 9.3 (Kritisch) |
| CVSS-Vektor | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-94 (Code-Injection) |
| Hersteller | Weaver (Fanwei) |
| Produkt | E-cology 10.0 |
| Schwachstellentyp | Nicht authentifizierte Remote-Codeausführung (RCE) |
| Betroffener Endpoint | /papi/esearch/data/devops/dubboApi/debug/method |
| Angriffsvektor | Netzwerk / HTTP POST |
| Erforderliche Authentifizierung | Keine |
| Betroffene Versionen | 10.0-Versionen vor Build 20260312 |
| Behobene Version | Build 20260312 (veröffentlicht am 12.03.2026) |
| Aktive Ausnutzung | Seit 31.03.2026 (Shadowserver Foundation) |
| Patch-Methode | Vollständige Entfernung des verwundbaren Endpoints |
| Parameter | Typ | Beschreibung | Beispiel |
|---|
interfaceName | String | RPC-Schnittstellenklassenname (vom Angreifer kontrolliert) | com.weaver.rpc.InvokeCommand |
methodName | String | Name der aufzurufenden Methode (vom Angreifer kontrolliert) | executeCommand |
parameters | Array | Methodenparameter, die direkt an die Ausführungslogik übergeben werden | ["id"] |
| Auswirkungsbereich | Schweregrad | Details |
|---|
| Vertraulichkeit | KRITISCH | Nicht authentifizierter Zugriff auf alle Systemdaten, Dokumente, Benutzeranmeldeinformationen, Datenbankinhalte |
| Integrität | KRITISCH | Möglichkeit zur Änderung von Dateien, Dokumenten, Datenbankeinträgen und Systemkonfigurationen |
| Verfügbarkeit | KRITISCH | Systemabschaltung, Ressourcenerschöpfung, Datenvernichtung, Dienstunterbrechung |
| Auswirkungsbereich | GEÄNDERT | Der Weaver-Servicenutzer läuft typischerweise als root oder mit hohen Privilegien; vollständige Systemkompromittierung |
| Version | Build-Bereich | Status | Patch verfügbar |
|---|
| 10.0 | < 20260312 | VERWUNDBAR | Ja |
| 10.0 | >= 20260312 | GEPATCHT | N/A (Endpunkt entfernt) |
| 9.x und früher | Alle | UNBEKANNT | Beim Anbieter erfragen |