
# Weaver E-cology용 인증되지 않은 RCE 익스플로잇 및 탐지 스캐너 dubboApi 디버그 엔드포인트를 대상으로 하는 Weaver E-cology용 인증되지 않은 RCE 익스플로잇 및 탐지 스캐너입니다. PoC, Nmap NSE 스크립트, 그리고 수정(remédiation) 가이드를 포함합니다.
Weaver E-cology 10.0(빌드 20260312 이전 버전)에는 /papi/esearch/data/devops/dubboApi/debug/method 엔드포인트에 치명적인 무인증 원격 코드 실행 취약점이 존재합니다. 공격자는 인증 없이 interfaceName 및 methodName POST 파라미터를 통해 임의의 명령을 주입할 수 있으며, 이를 통해 시스템 전체를 장악할 수 있습니다. Shadowserver Foundation이 2026-03-31부터 활발한 악용을 탐지했습니다.
빠른 위험도: CVSS 9.3 - 완전히 무인증이며, 사용자 상호작용이 필요 없고, 네트워크에서 접근 가능한 엔드포인트가 직접 코드 실행으로 이어집니다.
Weaver E-cology는 중국에서 가장 널리 배포된 엔터프라이즈 OA(Office Automation) 및 협업 플랫폼 중 하나입니다. Fanwei Group이 개발했으며, 다음과 같은 분야에서 광범위하게 사용됩니다:
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"] }
The application directly processes these parameters and passes them to RPC command execution helpers without:
- Authentication verification
- Input validation/sanitization
- Method whitelist enforcement
- Parameter type checking
This allows attackers to specify arbitrary Dubbo interface methods that execute system commands.
### Attack Flow Diagram```
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 헤더 (특별한 토큰이나 쿠키 불필요)
요청 본문 매개변수:
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
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.
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 워크플로우와 통합된 취약점 탐지를 위한 Nmap NSE 스크립트입니다.```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
**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/method 경로로 전송되는 HTTP POST 요청interfaceName 또는 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 또는 메서드 호출 실패
- 예상치 못한 인터페이스 해석 시도
### 호스트 기반 지표
- Weaver Java 프로세스에서 생성된 예상치 못한 자식 프로세스
- 시스템에 생성된 새 사용자 계정
- Weaver 서비스의 예상치 못한 네트워크 연결
- Weaver 구성 파일의 수정
- Weaver 디렉터리에 존재하는 웹셸
- 시스템 디렉터리에 대한 비정상적인 파일 쓰기
- 의심스러운 cronjob 또는 서비스 항목
### 파일 시스템 지표
- `/tmp/` 또는 `/var/tmp/`에 존재하는 예상치 못한 파일
- 수정된 Weaver JAR 파일 또는 구성 파일
- 웹 접근 가능 디렉터리에 존재하는 새 셸 스크립트
- 일반적인 웹셸 파일명(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
액세스 로그 검토
호스트 포렌식 수행
전체 시스템 평가
네트워크 세분화 구현
강화(Hardening)
보안 모니터링 업데이트
Kerem Oruc (@keraattin)
면책 조항: 이 정보는 교육 및 방어적 보안 목적으로만 제공됩니다. 컴퓨터 시스템에 대한 무단 액세스는 불법입니다. 소유하지 않은 시스템을 테스트하거나 액세스하기 전에 항상 적절한 승인을 받으십시오.
최종 업데이트: 2026-04-15
| 항목 | 세부 정보 |
|---|
| CVE ID | CVE-2026-22679 |
| CVSS 점수 | 9.3 (Critical) |
| 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 |
| 필요한 인증 | 없음 |
| 영향받는 버전 | 빌드 20260312 이전의 10.0 버전 |
| 수정 버전 | 빌드 20260312 (2026-03-12 출시) |
| 활발한 악용 | 2026-03-31부터 (Shadowserver Foundation) |
| 패치 방법 | 취약 엔드포인트 완전 제거 |
| 매개변수 | 유형 | 설명 | 예시 |
|---|
interfaceName | String | RPC 인터페이스 클래스 이름 (공격자 제어 가능) | com.weaver.rpc.InvokeCommand |
methodName | String | 호출할 메서드 이름 (공격자 제어 가능) | executeCommand |
parameters | Array | 실행 로직에 직접 전달되는 메서드 매개변수 | ["id"] |
| 영향 영역 | 심각도 | 세부 사항 |
|---|
| 기밀성 | CRITICAL | 모든 시스템 데이터, 문서, 사용자 자격 증명, 데이터베이스 콘텐츠에 대한 인증 없는 접근 |
| 무결성 | CRITICAL | 파일, 문서, 데이터베이스 레코드 및 시스템 구성 수정 가능 |
| 가용성 | CRITICAL | 시스템 종료, 리소스 고갈, 데이터 파괴, 서비스 중단 |
| 범위 | CHANGED | Weaver 서비스 사용자는 일반적으로 root 또는 높은 권한의 계정으로 실행됨; 전체 시스템 손상 |
| 버전 | 빌드 범위 | 상태 | 패치 제공 여부 |
|---|
| 10.0 | < 20260312 | 취약 | 예 |
| 10.0 | >= 20260312 | 패치됨 | 해당 없음 (엔드포인트 제거됨) |
| 9.x 및 이전 버전 | 전체 | 알 수 없음 | 공급업체에 문의 |