Lucene search
+L

Roundcube CVE-2025-49113 Detection

🗓️ 28 Jul 2026 11:27:38Reported by KittySploitType 
kittysploit
 kittysploit
🔗 kittysploit.com👁 3 Views

Post-auth PHP deserialization in Roundcube enables RCE.

Related
Refs
Code
ReporterTitlePublishedViews
Family
githubexploit
GithubExploit
Exploit for CVE-2025-49113
19 Aug 202502:35
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2025-49113
18 Jun 202519:10
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2025-49113
19 Sep 202506:07
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2025-49113
11 Jul 202513:19
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2025-49113
10 Jun 202515:21
–githubexploit
githubexploit
GithubExploit
Exploit for Deserialization of Untrusted Data in Roundcube Webmail
11 Apr 202621:54
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2025-49113
3 Jun 202519:04
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2025-49113
19 Sep 202506:07
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2025-49113
22 Jun 202516:13
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2025-49113
11 Jul 202513:19
–githubexploit
Rows per page
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Detect Roundcube versions vulnerable to CVE-2025-49113."""

from kittysploit import *
from lib.protocols.http.http_client import Http_client
from lib.protocols.http.roundcube import Roundcube


class Module(Scanner, Http_client, Roundcube):

    __info__ = {
        "name": "Roundcube CVE-2025-49113 Detection",
        "description": (
            "Fingerprints Roundcube via rcversion and flags builds before 1.5.10 / "
            "1.6.x before 1.6.11 as vulnerable to post-auth PHP deserialization RCE."
        ),
        "author": ["KittySploit Team"],
        "severity": "critical",
        "cve": "CVE-2025-49113",
        "modules": ["exploits/multi/http/roundcube_cve_2025_49113_rce"],
        "tags": [
            "web", "scanner", "cve", "cve2025", "roundcube", "rce",
            "deserialization", "kev", "vkev", "vuln",
        ],
        "agent": {
            "risk": "active",
            "effects": ["network_probe"],
            "expected_requests": 1,
            "reversible": True,
            "approval_required": False,
            "produces": ["tech_hints", "risk_signals", "endpoints"],
            "cost": 1.0,
            "noise": 0.2,
            "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": "admin_surface", "from_detail": ""},
                ],
                "consumes_capabilities": [],
                "option_bindings": {},
                "suggested_followups": [
                    "exploits/multi/http/roundcube_cve_2025_49113_rce",
                ],
            },
        },
        "references": [
            "https://nvd.nist.gov/vuln/detail/CVE-2025-49113",
            "https://fearsoff.org/research/roundcube",
        ],
    }

    targeturi = OptString("/", "Roundcube base URI", required=False)

    def run(self):
        bases = [
            self.targeturi or "/",
            "/roundcube/",
            "/webmail/",
            "/mail/",
        ]
        seen = set()
        for base in bases:
            key = self.rc_normalize_base(base)
            if key in seen:
                continue
            seen.add(key)
            path = self.rc_join(base, "_task=login")
            r = self.http_request(method="GET", path=path, allow_redirects=True)
            if not r or r.status_code != 200:
                continue
            body = r.text or ""
            if not self.rc_looks_like_roundcube(body):
                continue
            rcversion = self.rc_extract_version(body)
            if rcversion is None or not self.rc_version_vulnerable(rcversion):
                continue
            version = self.rc_parse_version(rcversion)
            self.set_info(
                severity="critical",
                reason=f"Roundcube {version} vulnerable to CVE-2025-49113",
                path=path,
                version=version,
                evidence=f"rcversion={rcversion}",
            )
            return True
        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

28 Jul 2026 11:27Current
8.6High risk
Vulners AI Score8.6
CVSS 3.18.8 - 9.9
EPSS0.98972
SSVC
3