
Exploit de RCE no autenticado y escáner de detección para Weaver E-cology, dirigido al endpoint de depuración dubboApi. Incluye PoC, script Nmap NSE y guía de remediación.
Weaver E-cology 10.0 (anterior a la compilación 20260312) contiene una vulnerabilidad crítica de ejecución remota de código sin autenticación en el endpoint /papi/esearch/data/devops/dubboApi/debug/method. Los atacantes pueden inyectar comandos arbitrarios a través de los parámetros POST interfaceName y methodName sin autenticación, logrando un compromiso total del sistema. Explotación activa detectada desde el 2026-03-31 por Shadowserver Foundation.
Riesgo rápido: CVSS 9.3 - Completamente sin autenticación, no requiere interacción del usuario, endpoint accesible por red que conduce directamente a la ejecución de código.
Weaver E-cology es una de las plataformas de OA (Automatización de Oficinas) y colaboración empresarial más ampliamente implementadas en China. Desarrollada por Fanwei Group, se utiliza extensamente en:
E-cology proporciona soluciones empresariales integrales que incluyen:
Las implementaciones de E-cology suelen abarcar desde cientos hasta miles de usuarios por organización. La plataforma es un componente de infraestructura crítico para muchas organizaciones, lo que hace que las vulnerabilidades en ella tengan un impacto extremadamente alto.
La vulnerabilidad existe en el endpoint de depuración dubboApi, que probablemente se dejó accesible para fines de desarrollo y resolución de problemas. El endpoint permite la invocación directa de métodos arbitrarios a través del framework RPC Dubbo sin una validación de entrada o comprobaciones de autenticación adecuadas.
Patrón de Código Vulnerable:``` 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"] }
La aplicación procesa directamente estos parámetros y los pasa a los ayudantes de ejecución de comandos RPC sin:
- Verificación de autenticación
- Validación/saneamiento de entrada
- Aplicación de lista blanca de métodos
- Comprobación de tipos de parámetros
Esto permite a los atacantes especificar métodos arbitrarios de interfaces Dubbo que ejecutan comandos del sistema.
### Diagrama de Flujo del Ataque```
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
Ruta del Endpoint: /papi/esearch/data/devops/dubboApi/debug/method
Método HTTP: POST
Autenticación Requerida: Ninguna (autenticación cero)
Cabeceras Requeridas: Cabeceras HTTP estándar (no se requieren tokens especiales ni cookies)
Parámetros del Cuerpo de la Solicitud:
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)
### Arquitectura de Despliegue Típica de 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)
Un estado-nación o grupo criminal explota las implementaciones de E-cology en agencias gubernamentales para:
Los atacantes comprometen instancias de E-cology en bancos o instituciones financieras para:
Las instancias comprometidas de E-cology se utilizan como puntos de pivote para:
Nota: Otras versiones pueden verse afectadas. Weaver no ha publicado información completa de compatibilidad de versiones. Las organizaciones deben probar los parches a fondo antes de su implementación.
Nombre de archivo: CVE-2026-22679_Weaver_Ecology_RCE_detector.py
Descripción: Script de detección seguro y no destructivo que identifica instancias vulnerables de Weaver E-cology comprobando la accesibilidad del endpoint.```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()
**Ejemplos de uso:**```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
Ejemplo de salida:``` [] 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 ***
======================================================================
### Script NSE de Nmap
**Nombre de archivo:** `CVE-2026-22679_Weaver_Ecology_RCE.nse`
**Descripción:** Script NSE de Nmap para la detección de vulnerabilidades integrado con los flujos de trabajo de 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
Ejemplos de uso:```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
**Ejemplo de salida:**```
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 o methodNameRegistros de Acceso del Servidor Web:``` 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 -
**Registros de aplicación:**
- Excepciones o errores relacionados con la invocación RPC de Dubbo
- Advertencias de parámetros no validados en los registros del framework RPC
- ClassNotFoundException o fallos de invocación de métodos
- Intentos inesperados de resolución de interfaces
### Indicadores basados en el host
- Procesos hijo inesperados generados desde el proceso Java de Weaver
- Nuevas cuentas de usuario creadas en el sistema
- Conexiones de red inesperadas desde el servicio de Weaver
- Modificación de los archivos de configuración de Weaver
- Presencia de webshells en los directorios de Weaver
- Escrituras de archivos inusuales en directorios del sistema
- Entradas sospechosas de cronjobs o servicios
### Indicadores del sistema de archivos
- Archivos inesperados en `/tmp/` o `/var/tmp/`
- Archivos JAR de Weaver o archivos de configuración modificados
- Nuevos scripts de shell en directorios accesibles por web
- Presencia de nombres de archivo de webshell comunes (shell.jsp, cmd.jsp, etc.)
---
## Remediación
### Acciones inmediatas (0-24 horas)
1. **Deshabilitar el acceso de red al endpoint de depuración**
Añadir una regla de firewall para bloquear el acceso al endpoint vulnerable: ```
# 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>
Supervisar la explotación activa
Restringir el acceso a la red
Aplicar el parche oficial
Actualizar a Weaver E-cology build 20260312 o posterior: ```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
Revisar los registros de acceso
Realizar análisis forense del host
Evaluación completa del sistema
Implementar segmentación de red
Endurecimiento
Actualizar la monitorización de seguridad
Kerem Oruc (@keraattin)
Aviso legal: Esta información se proporciona únicamente con fines educativos y de seguridad defensiva. El acceso no autorizado a sistemas informáticos es ilegal. Obtenga siempre la autorización adecuada antes de probar o acceder a sistemas que no le pertenezcan.
Última actualización: 2026-04-15
| Aspecto | Detalles |
|---|
| ID CVE | CVE-2026-22679 |
| Puntuación CVSS | 9.3 (Crítico) |
| Vector CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-94 (Inyección de Código) |
| Proveedor | Weaver (Fanwei) |
| Producto | E-cology 10.0 |
| Tipo de Vulnerabilidad | Ejecución Remota de Código (RCE) sin autenticación |
| Endpoint Afectado | /papi/esearch/data/devops/dubboApi/debug/method |
| Vector de Ataque | Red / HTTP POST |
| Autenticación Requerida | Ninguna |
| Versiones Afectadas | Versiones 10.0 anteriores a la compilación 20260312 |
| Versión Corregida | Compilación 20260312 (publicada el 2026-03-12) |
| Explotación Activa | Desde el 2026-03-31 (Shadowserver Foundation) |
| Método de Parche | Eliminación completa del endpoint vulnerable |
| Parámetro | Tipo | Descripción | Ejemplo |
|---|
interfaceName | String | Nombre de la clase de la interfaz RPC (controlado por el atacante) | com.weaver.rpc.InvokeCommand |
methodName | String | Nombre del método a invocar (controlado por el atacante) | executeCommand |
parameters | Array | Parámetros del método pasados directamente a la lógica de ejecución | ["id"] |
| Área de Impacto | Gravedad | Detalles |
|---|
| Confidencialidad | CRÍTICO | Acceso no autenticado a todos los datos del sistema, documentos, credenciales de usuario, contenidos de bases de datos |
| Integridad | CRÍTICO | Capacidad de modificar archivos, documentos, registros de bases de datos y configuraciones del sistema |
| Disponibilidad | CRÍTICO | Apagado del sistema, agotamiento de recursos, destrucción de datos, interrupción del servicio |
| Alcance | CAMBIADO | El usuario del servicio Weaver normalmente se ejecuta como root o con una cuenta de altos privilegios; compromiso total del sistema |
| Versión | Rango de Compilación | Estado | Parche Disponible |
|---|
| 10.0 | < 20260312 | VULNERABLE | Sí |
| 10.0 | >= 20260312 | PARCHEADO | N/D (endpoint eliminado) |
| 9.x y anteriores | Todas | DESCONOCIDO | Consultar con el proveedor |