Lucene search
+L

OpenEclass RCE (CVE-2026-22241) Detection

🗓️ 02 May 2026 21:27:51Reported by KittySploitType 
kittysploit
 kittysploit
🔗 kittysploit.com👁 3 Views

Remote code execution in GUnet OpenEclass via unrestricted theme import file upload.

Related
Refs
Code
ReporterTitlePublishedViews
Family
circl
Circl
CVE-2026-22241
8 Jan 202616:03
–circl
cnnvd
CNNVD
Open eClass 安全漏洞
8 Jan 202600:00
–cnnvd
cve
CVE
CVE-2026-22241
8 Jan 202615:07
–cve
cvelist
Cvelist
CVE-2026-22241 Open eClass has Unrestricted File Upload that Leads to Remote Code Execution (RCE)
8 Jan 202615:07
–cvelist
exploitdb
Exploit DB
GUnet OpenEclass E-learning platform < 4.2 - Remote Code Execution (RCE)
29 Apr 202600:00
–exploitdb
euvd
EUVD
EUVD-2026-1672
8 Jan 202615:07
–euvd
kitploit
Kitploit
CVE-2026-22241
9 Oct 202603:00
–kitploit
kitploit
Kitploit
CVE-2026-22241
15 Oct 202616:28
–kitploit
kitploit
Kitploit
CVE-2026-22241
12 Oct 202620:38
–kitploit
kittysploit
KittySploit
GUnet OpenEclass < 4.2 - Remote Code Execution (RCE)
2 May 202621:27
–kittysploit
Rows per page
#!/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
3