
Weaver E-cology 10.0(ビルド20260312より前のバージョン)には、/papi/esearch/data/devops/dubboApi/debug/method エンドポイントに重大な未認証リモートコード実行の脆弱性が存在します。攻撃者は認証なしで interfaceName および methodName POSTパラメータを通じて任意のコマンドを注入でき、システム全体を完全に侵害できます。Shadowserver Foundation により2026年3月31日以降、活発な悪用が検出されています。
クイックリスク: CVSS 9.3 - 完全に未認証、ユーザー操作不要、ネットワークからアクセス可能なエンドポイントが直接コード実行につながります。
Weaver E-cology は、中国で最も広く導入されているエンタープライズOA(オフィスオートメーション)およびコラボレーションプラットフォームの1つです。泛微集団(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"] }
アプリケーションはこれらのパラメータを直接処理し、以下の処理を行わずにRPCコマンド実行ヘルパーへ渡します:
- 認証検証
- 入力検証・サニタイズ
- メソッドホワイトリストの適用
- パラメータ型チェック
これにより、攻撃者はシステムコマンドを実行する任意のDubboインターフェースメソッドを指定できます。
### 攻撃フロー図```
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ヘッダー(特別なトークンやCookieは不要)
リクエストボディのパラメータ:
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
出力例:``` [] 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
**出力例:**```
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 パラメータを含むリクエスト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 -
**アプリケーションログ:**
- Dubbo RPC呼び出しに関連する例外またはエラー
- RPCフレームワークのログにおける未検証パラメータの警告
- ClassNotFoundExceptionまたはメソッド呼び出しの失敗
- 予期しないインターフェース解決の試み
### ホストベースの指標
- Weaver Javaプロセスから生成された予期しない子プロセス
- システム上に作成された新しいユーザーアカウント
- Weaverサービスからの予期しないネットワーク接続
- Weaver設定ファイルの変更
- Weaverディレクトリ内のウェブシェルの存在
- システムディレクトリへの異常なファイル書き込み
- 不審なcronjobまたはサービスエントリ
### ファイルシステムの指標
- `/tmp/` または `/var/tmp/` 内の予期しないファイル
- 変更されたWeaver JARファイルまたは設定ファイル
- Webアクセス可能なディレクトリ内の新しいシェルスクリプト
- 一般的なウェブシェルファイル名の存在(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
アクセスログの確認
ホストフォレンジックの実施
システム全体の評価
ネットワークセグメンテーションの実装
ハードニング
セキュリティ監視の更新
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(泛微) |
| 製品 | E-cology 10.0 |
| 脆弱性タイプ | 未認証リモートコード実行(RCE) |
| 影響を受けるエンドポイント | /papi/esearch/data/devops/dubboApi/debug/method |
| 攻撃ベクトル | ネットワーク / HTTP POST |
| 必要な認証 | なし |
| 影響を受けるバージョン | ビルド20260312より前の10.0バージョン |
| 修正バージョン | ビルド20260312(2026年3月12日リリース) |
| 活発な悪用 | 2026年3月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以前 | すべて | 不明 | ベンダーに確認 |