
Unauthenticated RCE exploit and detection scanner for Weaver E-cology, targeting the dubboApi debug endpoint. Includes PoC, Nmap NSE script, and remediation guidance.
Weaver E-cology 10.0 (prior to build 20260312) contains a critical unauthenticated remote code execution vulnerability in the /papi/esearch/data/devops/dubboApi/debug/method endpoint. Attackers can inject arbitrary commands through the interfaceName and methodName POST parameters without authentication, achieving complete system compromise. Active exploitation detected since 2026-03-31 by Shadowserver Foundation.
Quick Risk: CVSS 9.3 - Completely unauthenticated, no user interaction required, network accessible endpoint leading directly to code execution.
Weaver E-cology is one of China's most widely deployed enterprise OA (Office Automation) and collaboration platforms. Developed by Fanwei Group, it is extensively used across:
E-cology provides comprehensive enterprise solutions including:
E-cology deployments typically range from hundreds to thousands of users per organization. The platform is a critical infrastructure component for many organizations, making vulnerabilities in it extremely high impact.
The vulnerability exists in the dubboApi debug endpoint, which was likely left accessible for development and troubleshooting purposes. The endpoint allows direct invocation of arbitrary methods through the Dubbo RPC framework without proper input validation or authentication checks.
Vulnerable Code Pattern:
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"]
}
The application directly processes these parameters and passes them to RPC command execution helpers without:
This allows attackers to specify arbitrary Dubbo interface methods that execute system commands.
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
Endpoint Path: /papi/esearch/data/devops/dubboApi/debug/method
HTTP Method: POST
Required Authentication: None (zero authentication)
Required Headers: Standard HTTP headers (no special tokens or cookies required)
Request Body Parameters:
Endpoint Exposure Flow:
Weaver Deployment Architecture
===============================
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)
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)
A nation-state or criminal group exploits E-cology deployments at government agencies to:
Attackers compromise E-cology instances at banks or financial institutions to:
Compromised E-cology instances are used as pivot points to:
Note: Other versions may be affected. Weaver has not released comprehensive version compatibility information. Organizations should test patches thoroughly before deployment.
Filename: CVE-2026-22679_Weaver_Ecology_RCE_detector.py
Description: Safe, non-destructive detection script that identifies vulnerable Weaver E-cology instances by checking for endpoint accessibility.
#!/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()
Usage Examples:
# 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
Example Output:
[*] 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.
======================================================================
Target: http://10.0.0.10
Scan Time: 2026-04-15T12:00:00Z
Risk Level: CRITICAL
======================================================================
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 ***
======================================================================
Filename: CVE-2026-22679_Weaver_Ecology_RCE.nse
Description: Nmap NSE script for vulnerability detection integrated with Nmap workflows.
-- 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
Usage Examples:
# Scan single host
nmap -p 80 --script CVE-2026-22679_Weaver_Ecology_RCE.nse target.com
# Scan multiple ports
nmap -p 80,443,8080,8443 --script CVE-2026-22679_Weaver_Ecology_RCE.nse target.com
# Scan network range
nmap -p 80 --script CVE-2026-22679_Weaver_Ecology_RCE.nse 10.0.0.0/24
# Verbose output
nmap -p 80 --script CVE-2026-22679_Weaver_Ecology_RCE.nse -v target.com
# Combine with other scripts
nmap -p 80 --script http-title,http-headers,CVE-2026-22679_Weaver_Ecology_RCE.nse target.com
Example Output:
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 or methodName parametersWeb Server Access Logs:
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 -
Application Logs:
/tmp/ or /var/tmp/Disable Network Access to Debug Endpoint
Add firewall rule to block access to vulnerable endpoint:
# 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>
Monitor for Active Exploitation
Restrict Network Access
Apply Official Patch
Update to Weaver E-cology build 20260312 or later:
# Contact Weaver support or download from official repository
# Backup current installation
cp -r /opt/ecology /opt/ecology.backup.20260415
# Apply patch
/opt/ecology/bin/upgrade.sh --version 20260312
# Verify patch application
curl -X POST http://localhost/papi/esearch/data/devops/dubboApi/debug/method
# Should return 404 after patch
Review Access Logs
Conduct Host Forensics
Full System Assessment
Implement Network Segmentation
Hardening
Update Security Monitoring
Kerem Oruc (@keraattin)
Disclaimer: This information is provided for educational and defensive security purposes only. Unauthorized access to computer systems is illegal. Always obtain proper authorization before testing or accessing systems you do not own.
Last Updated: 2026-04-15
| Aspect | Details |
|---|
| CVE ID | CVE-2026-22679 |
| CVSS Score | 9.3 (Critical) |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-94 (Code Injection) |
| Vendor | Weaver (Fanwei) |
| Product | E-cology 10.0 |
| Vulnerability Type | Unauthenticated Remote Code Execution (RCE) |
| Affected Endpoint | /papi/esearch/data/devops/dubboApi/debug/method |
| Attack Vector | Network / HTTP POST |
| Authentication Required | None |
| Versions Affected | 10.0 versions prior to build 20260312 |
| Fixed Version | Build 20260312 (released 2026-03-12) |
| Active Exploitation | Since 2026-03-31 (Shadowserver Foundation) |
| Patch Method | Complete removal of vulnerable endpoint |
| Parameter | Type | Description | Example |
|---|
interfaceName | String | RPC interface class name (attacker-controlled) | com.weaver.rpc.InvokeCommand |
methodName | String | Method name to invoke (attacker-controlled) | executeCommand |
parameters | Array | Method parameters passed directly to execution logic | ["id"] |
| Impact Area | Severity | Details |
|---|
| Confidentiality | CRITICAL | Unauthenticated access to all system data, documents, user credentials, database contents |
| Integrity | CRITICAL | Ability to modify files, documents, database records, and system configurations |
| Availability | CRITICAL | System shutdown, resource exhaustion, destruction of data, service disruption |
| Scope | CHANGED | Weaver service user typically runs as root or high-privilege account; full system compromise |
| Version | Build Range | Status | Patch Available |
|---|
| 10.0 | < 20260312 | VULNERABLE | Yes |
| 10.0 | >= 20260312 | PATCHED | N/A (endpoint removed) |
| 9.x and earlier | All | UNKNOWN | Check with vendor |