
Exploit RCE non authentifié et scanner de détection pour Weaver E-cology, ciblant le point de terminaison de débogage dubboApi. Inclut un PoC, un script Nmap NSE et des recommandations de remédiation.
Weaver E-cology 10.0 (antérieur au build 20260312) contient une vulnérabilité critique d'exécution de code à distance non authentifiée dans le point de terminaison /papi/esearch/data/devops/dubboApi/debug/method. Les attaquants peuvent injecter des commandes arbitraires via les paramètres POST interfaceName et methodName sans authentification, compromettant ainsi complètement le système. Une exploitation active a été détectée depuis le 2026-03-31 par la Shadowserver Foundation.
Risque rapide : CVSS 9.3 - Totalement non authentifié, aucune interaction utilisateur requise, point de terminaison accessible via le réseau menant directement à l'exécution de code.
Weaver E-cology est l'une des plateformes d'OA (automatisation de bureau) et de collaboration d'entreprise les plus largement déployées en Chine. Développée par Fanwei Group, elle est largement utilisée dans :
E-cology fournit des solutions d'entreprise complètes, notamment :
Les déploiements E-cology comptent généralement de quelques centaines à plusieurs milliers d'utilisateurs par organisation. La plateforme est un composant d'infrastructure critique pour de nombreuses organisations, ce qui rend les vulnérabilités qui l'affectent extrêmement impactantes.
La vulnérabilité existe dans le point de terminaison de débogage dubboApi, qui a probablement été laissé accessible à des fins de développement et de dépannage. Le point de terminaison permet l'invocation directe de méthodes arbitraires via le framework RPC Dubbo sans validation d'entrée ni contrôles d'authentification appropriés.
Modèle de code vulnérable :``` 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"] }
L’application traite directement ces paramètres et les transmet aux assistants d’exécution de commandes RPC sans :
- Vérification d’authentification
- Validation/assainissement des entrées
- Application d’une liste blanche de méthodes
- Contrôle des types de paramètres
Cela permet aux attaquants de spécifier des méthodes d’interface Dubbo arbitraires qui exécutent des commandes système.
### Schéma du flux d’attaque```
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
Chemin du point de terminaison : /papi/esearch/data/devops/dubboApi/debug/method
Méthode HTTP : POST
Authentification requise : Aucune (zéro authentification)
En-têtes requis : En-têtes HTTP standard (aucun jeton spécial ni cookie requis)
Paramètres du corps de la requête :
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)
### Architecture de déploiement Weaver typique```
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 État-nation ou un groupe criminel exploite les déploiements E-cology au sein d'agences gouvernementales pour :
Des attaquants compromettent des instances E-cology dans des banques ou institutions financières pour :
Des instances E-cology compromises sont utilisées comme points de pivot pour :
Remarque : D'autres versions peuvent être concernées. Weaver n'a pas publié d'informations complètes sur la compatibilité des versions. Les organisations doivent tester les correctifs en profondeur avant leur déploiement.
Nom du fichier : CVE-2026-22679_Weaver_Ecology_RCE_detector.py
Description : Script de détection sûr et non destructif qui identifie les instances Weaver E-cology vulnérables en vérifiant l'accessibilité du point de terminaison.```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()
**Exemples d'utilisation :**```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
Exemple de sortie :``` [] 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 Nmap
**Nom du fichier :** `CVE-2026-22679_Weaver_Ecology_RCE.nse`
**Description :** Script NSE Nmap pour la détection de vulnérabilités, intégré aux flux de travail 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
Exemples d'utilisation :```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
**Exemple de sortie :**```
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 ou methodNameJournaux d'accès du serveur 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 -
**Journaux d'application :**
- Exceptions ou erreurs liées à l'invocation RPC Dubbo
- Avertissements de paramètres non validés dans les journaux du framework RPC
- ClassNotFoundException ou échecs d'invocation de méthode
- Tentatives inattendues de résolution d'interface
### Indicateurs basés sur l'hôte
- Processus enfants inattendus générés à partir du processus Java Weaver
- Nouveaux comptes utilisateur créés sur le système
- Connexions réseau inattendues depuis le service Weaver
- Modification des fichiers de configuration Weaver
- Présence de webshells dans les répertoires Weaver
- Écritures de fichiers inhabituelles dans les répertoires système
- Entrées suspectes de cronjob ou de service
### Indicateurs du système de fichiers
- Fichiers inattendus dans `/tmp/` ou `/var/tmp/`
- Fichiers JAR Weaver modifiés ou fichiers de configuration modifiés
- Nouveaux scripts shell dans les répertoires accessibles via le web
- Présence de noms de fichiers webshell courants (shell.jsp, cmd.jsp, etc.)
---
## Remédiation
### Actions immédiates (0-24 heures)
1. **Désactiver l'accès réseau au point de terminaison de débogage**
Ajouter une règle de pare-feu pour bloquer l'accès au point de terminaison vulnérable : ```
# 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>
Surveiller l’exploitation active
Restreindre l’accès réseau
Appliquer le correctif officiel
Mettez à jour vers Weaver E-cology build 20260312 ou une version ultérieure : ```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
Examiner les journaux d'accès
Effectuer une analyse forensique de l'hôte
Évaluation complète du système
Mettre en œuvre la segmentation du réseau
Durcissement
Mettre à jour la surveillance de la sécurité
Kerem Oruc (@keraattin)
Avertissement : Ces informations sont fournies à des fins éducatives et de sécurité défensive uniquement. L'accès non autorisé aux systèmes informatiques est illégal. Obtenez toujours une autorisation appropriée avant de tester ou d'accéder à des systèmes qui ne vous appartiennent pas.
Dernière mise à jour : 2026-04-15
| Aspect | Détails |
|---|
| ID CVE | CVE-2026-22679 |
| Score CVSS | 9.3 (Critique) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-94 (Injection de code) |
| Fournisseur | Weaver (Fanwei) |
| Produit | E-cology 10.0 |
| Type de vulnérabilité | Exécution de code à distance non authentifiée (RCE) |
| Point de terminaison affecté | /papi/esearch/data/devops/dubboApi/debug/method |
| Vecteur d'attaque | Réseau / HTTP POST |
| Authentification requise | Aucune |
| Versions affectées | Versions 10.0 antérieures au build 20260312 |
| Version corrigée | Build 20260312 (publié le 2026-03-12) |
| Exploitation active | Depuis le 2026-03-31 (Shadowserver Foundation) |
| Méthode de correctif | Suppression complète du point de terminaison vulnérable |
| Paramètre | Type | Description | Exemple |
|---|
interfaceName | String | Nom de la classe d'interface RPC (contrôlé par l'attaquant) | com.weaver.rpc.InvokeCommand |
methodName | String | Nom de la méthode à invoquer (contrôlé par l'attaquant) | executeCommand |
parameters | Array | Paramètres de la méthode transmis directement à la logique d'exécution | ["id"] |
| Domaine d'impact | Gravité | Détails |
|---|
| Confidentialité | CRITIQUE | Accès non authentifié à toutes les données système, documents, identifiants utilisateur, contenus de bases de données |
| Intégrité | CRITIQUE | Capacité à modifier des fichiers, documents, enregistrements de bases de données et configurations système |
| Disponibilité | CRITIQUE | Arrêt du système, épuisement des ressources, destruction de données, interruption de service |
| Périmètre | MODIFIÉ | Le compte de service Weaver s'exécute généralement en tant que root ou avec des privilèges élevés ; compromission totale du système |
| Version | Plage de builds | Statut | Correctif disponible |
|---|
| 10.0 | < 20260312 | VULNÉRABLE | Oui |
| 10.0 | >= 20260312 | CORRIGÉ | N/A (point de terminaison supprimé) |
| 9.x et antérieures | Toutes | INCONNU | Vérifier auprès du fournisseur |