OpenEclass RCE (CVE-2026-22241) Detection
| Reporter | Title | Published | Views | Family All 17 |
|---|---|---|---|---|
| CVE-2026-22241 | 8 Jan 202616:03 | – | circl | |
| Open eClass 安全漏洞 | 8 Jan 202600:00 | – | cnnvd | |
| CVE-2026-22241 | 8 Jan 202615:07 | – | cve | |
| CVE-2026-22241 Open eClass has Unrestricted File Upload that Leads to Remote Code Execution (RCE) | 8 Jan 202615:07 | – | cvelist | |
| GUnet OpenEclass E-learning platform < 4.2 - Remote Code Execution (RCE) | 29 Apr 202600:00 | – | exploitdb | |
| EUVD-2026-1672 | 8 Jan 202615:07 | – | euvd | |
| CVE-2026-22241 | 9 Oct 202603:00 | – | kitploit | |
| CVE-2026-22241 | 15 Oct 202616:28 | – | kitploit | |
| CVE-2026-22241 | 12 Oct 202620:38 | – | kitploit | |
| GUnet OpenEclass < 4.2 - Remote Code Execution (RCE) | 2 May 202621:27 | – | kittysploit |
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from kittysploit import *
from lib.protocols.http.http_client import Http_client
from bs4 import BeautifulSoup
import re
class Module(Scanner, Http_client):
__info__ = {
"name": "OpenEclass RCE (CVE-2026-22241) Detection",
"description": "Detects GUnet OpenEclass instances vulnerable to Remote Code Execution (CVE-2026-22241) "
"by checking the platform version. Versions prior to 4.2 are vulnerable to an unrestricted "
"file upload in the theme import functionality.",
"author": ["KittySploit Team"],
"severity": "critical",
"cve": "CVE-2026-22241",
"references": [
"https://nvd.nist.gov/vuln/detail/CVE-2026-22241",
"https://github.com/gunet/openeclass/security/advisories"
],
"modules": [
"exploits/http/openeclass_rce_cve_2026_22241",
],
"tags": ["web", "scanner", "openeclass", "rce", "cve-2026-22241"],
'agent': {
'risk': 'active',
'effects': ['network_probe'],
'expected_requests': 2,
'reversible': True,
'approval_required': False,
'produces': ['tech_hints', 'risk_signals', 'endpoints'],
'cost': 1.0,
'noise': 0.5,
'value': 1.0,
'requires': {'min_endpoints': 0,
'min_params': 0,
'tech_hints_any': [],
'tech_hints_all': [],
'specializations_any': [],
'risk_signals_any': [],
'auth_session': False,
'capabilities_any': [],
'capabilities_all': [],
'confidence_min': {},
'confidence_min_any': {},
'endpoint_pattern_any': [],
'param_any': [],
'api_surface_ready': False},
'chain': {'produces_capabilities': [{'capability': 'rce', 'from_detail': ''}],
'consumes_capabilities': [],
'option_bindings': {},
'suggested_followups': []},
},
}
def _version_lt(self, v1: str, v2: str) -> bool:
"""
Compare two version strings
"""
def norm(v):
out = []
for token in str(v).split("."):
digits = "".join(ch for ch in token if ch.isdigit())
out.append(int(digits) if digits else 0)
while len(out) < 3:
out.append(0)
return tuple(out[:3])
return norm(v1) < norm(v2)
def run(self):
"""
Execute the scanner
"""
try:
# Step 1: Detect OpenEclass
response = self.http_request(method="GET", path="/")
if not response or response.status_code != 200:
return False
content = response.text
is_openeclass = False
if 'openeclass' in content.lower() or 'open eclass' in content.lower():
is_openeclass = True
if not is_openeclass:
return False
# Step 2: Extract version
# Common patterns: "Open eClass 4.1", "version: 4.1.2", etc.
version = None
# Try searching in the footer/content
version_match = re.search(r'Open\s+eClass\s+([\d\.]+)', content, re.IGNORECASE)
if version_match:
version = version_match.group(1)
if not version:
# Try meta tags or other common places
soup = BeautifulSoup(content, 'html.parser')
# Sometimes it's in a generator tag or similar
generator = soup.find('meta', {'name': 'generator'})
if generator and 'openeclass' in generator.get('content', '').lower():
gen_match = re.search(r'([\d\.]+)', generator.get('content', ''))
if gen_match:
version = gen_match.group(1)
# Step 3: Reporting
if version:
print_info(f"OpenEclass version {version} detected")
if self._version_lt(version, "4.2"):
self.set_info(
severity="critical",
cve="CVE-2026-22241",
reason=f"OpenEclass version {version} is vulnerable to CVE-2026-22241 (RCE)",
)
return True
else:
print_status(f"OpenEclass version {version} is not vulnerable to CVE-2026-22241")
return False
else:
# OpenEclass detected but version unknown
self.set_info(
severity="medium",
cve="CVE-2026-22241",
reason="OpenEclass detected but version could not be determined. Potentially vulnerable if < 4.2.",
)
return False
except Exception as e:
print_error(f"Scanner failed: {e}")
return False
Data
Build on a solid foundation with Vulners data
We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data
Api
Power your application with Vulners API
The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access
App
Assess and manage vulnerabilities with Vulners tools
Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation
29 Sep 2026 10:07Current
5.9Medium risk
Vulners AI Score5.9
CVSS 3.17.2
CVSS 48.6
EPSS0.03262
SSVC