Skip to content

CVE-2025-21298 — Windows (OLE Component)

Key facts

CVE-2025-21298 (Microsoft) is a Critical vulnerability: Windows (OLE Component). This entry ships ready-to-deploy detection and prevention rules (Snort, YARA, Nginx, Apache) plus a detection-only PoC and a Docker test lab.

CVE CVE-2025-21298
Severity Critical
Vendor Microsoft
Product Windows (OLE Component)
Detection / prevention Snort, YARA, Nginx, Apache
PoC poc.py
Source 2025/CVE-2025-21298/

Details

CVE-2025-21298 (Microsoft) is a Critical vulnerability: Windows (OLE Component). This entry ships a detection-only proof-of-concept (PoC), a Docker test lab, and ready-to-deploy detection and prevention rules (Snort, YARA, Nginx, Apache) — see Detection and prevention below. Source: NVD record.

Windows OLE Remote Code Execution Vulnerability

Overview

Field Value
CVE ID CVE-2025-21298
Severity Critical (CVSS 9.8)
Vendor Microsoft
Product Windows (OLE Component)
Vulnerability Type Remote Code Execution
Exploitation Remote, User Interaction Required

Description

A critical vulnerability exists in Windows OLE (Object Linking and Embedding) that allows remote code execution when a user views specially crafted email content in Microsoft Outlook or previews malicious files. The vulnerability can be exploited via email preview without requiring the user to open attachments.

Affected Versions

  • Windows 10 (all supported versions)
  • Windows 11 (all supported versions)
  • Windows Server 2016, 2019, 2022

Impact

  • Remote Code Execution
  • System compromise via email preview
  • No user click required (preview pane exploitation)
  • Potential for wormable attacks

Verification Process

The PoC uses a multi-stage verification approach:

Step 1: Product/Version Detection (Passive)

[*] Query target endpoint
[*] Detect product signatures and extract version
[*] Check if version is in vulnerable range

Step 2: Active Vulnerability Testing

Method Description Detection
Error-based Tests for error messages indicating vulnerability Error indicators in response
Timing-based Measures response delay with payload Response time significantly longer
Response-based Checks for expected patterns in response Vulnerability indicators present

Verification Flow

┌─────────────────────────────────────────────────────────────┐
│                    Product Detection                         │
│  Query target → Detect product/version                      │
│  Check if version in vulnerable range                       │
└─────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────┐
│               Active Vulnerability Testing                   │
│                                                              │
│  1. Error-based Test                                         │
│     └─ Send payload → Check for error indicators            │
│     └─ If error found → CONFIRMED VULNERABLE                │
│                                                              │
│  2. Timing-based Test                                        │
│     └─ Send delay payload → Measure response time           │
│     └─ If delayed → CONFIRMED VULNERABLE                    │
│                                                              │
│  3. Response-based Test                                      │
│     └─ Send payload → Check response content                │
│     └─ If pattern matches → CONFIRMED VULNERABLE            │
└─────────────────────────────────────────────────────────────┘

Usage

# Full vulnerability check (version + active testing)
python3 poc.py -t https://target.com -c

# Version-only check (passive, no payloads sent)
python3 poc.py -t https://target.com -c --version-only

References

  • https://nvd.nist.gov/vuln/detail/CVE-2025-21298
  • https://msrc.microsoft.com/update-guide/

Disclaimer

This POC is for educational and authorized security testing only.

Detection and prevention

Ready-to-deploy defensive rules for CVE-2025-21298, for authorized testing and blue-team detection engineering:

References: NVD — CVE-2025-21298 · full write-up on the searchable site

Detection & prevention rules

# CVE-2025-21298 - Windows OLE RCE Snort Detection Rules
# Severity: Critical (CVSS 9.8)

# Detect RTF files in email
alert tcp $EXTERNAL_NET any -> $HOME_NET $SMTP_PORTS (
    msg:"CVE-2025-21298 RTF File in Email";
    flow:to_server,established;
    content:"Content-Type|3a|"; nocase;
    content:"application/rtf"; nocase; distance:0;
    classtype:attempted-admin;
    sid:2025212981;
    rev:1;
    metadata:cve CVE-2025-21298, severity critical;
)

# Detect OLE object header in email
alert tcp $EXTERNAL_NET any -> $HOME_NET $SMTP_PORTS (
    msg:"CVE-2025-21298 OLE Object in Email";
    flow:to_server,established;
    content:"|D0 CF 11 E0 A1 B1 1A E1|";
    classtype:attempted-admin;
    sid:2025212982;
    rev:1;
    metadata:cve CVE-2025-21298, severity critical;
)

# Detect malicious RTF OLE embedding
alert tcp $EXTERNAL_NET any -> $HOME_NET $SMTP_PORTS (
    msg:"CVE-2025-21298 Malicious RTF OLE Object";
    flow:to_server,established;
    content:"{\\rtf"; nocase;
    content:"\\object"; nocase; distance:0;
    content:"\\objocx"; nocase; distance:0;
    classtype:attempted-admin;
    sid:2025212983;
    rev:1;
    metadata:cve CVE-2025-21298, severity critical;
)

# Detect RTF file download
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (
    msg:"CVE-2025-21298 RTF File Download";
    flow:to_client,established;
    content:"Content-Type|3a|"; nocase;
    content:"application/rtf"; nocase;
    classtype:policy-violation;
    sid:2025212984;
    rev:1;
    metadata:cve CVE-2025-21298, severity medium;
)

# Detect potential OLE exploitation response
alert tcp any any -> $HOME_NET any (
    msg:"CVE-2025-21298 Potential OLE Exploitation";
    content:"|D0 CF 11 E0|";
    content:"Package"; distance:0; within:200;
    classtype:attempted-admin;
    sid:2025212985;
    rev:1;
    metadata:cve CVE-2025-21298, severity critical;
)

:material-file-download: prevention/snort.rules

/*
 * CVE-2025-21298 - Windows OLE RCE YARA Detection Rules
 * Severity: Critical (CVSS 9.8)
 */

rule CVE_2025_21298_Malicious_RTF {
    meta:
        description = "Detects malicious RTF files exploiting CVE-2025-21298"
        author = "Security Research"
        date = "2025-01-14"
        cve = "CVE-2025-21298"
        severity = "critical"

    strings:
        // RTF header
        $rtf_header = "{\\rtf1" ascii

        // OLE object embedding
        $ole1 = "\\object" ascii nocase
        $ole2 = "\\objocx" ascii nocase
        $ole3 = "\\objemb" ascii nocase
        $ole4 = "\\objdata" ascii nocase

        // Suspicious OLE classes
        $class1 = "Package" ascii wide
        $class2 = "OLE2Link" ascii wide
        $class3 = "Equation.3" ascii wide

        // Malicious patterns
        $mal1 = /\\bin[0-9]{5,}/ ascii
        $mal2 = "\\*\\objclass" ascii

    condition:
        $rtf_header at 0 and
        (any of ($ole*)) and
        (any of ($class*) or any of ($mal*))
}

rule CVE_2025_21298_OLE_Header {
    meta:
        description = "Detects suspicious OLE compound files"
        author = "Security Research"
        date = "2025-01-14"
        cve = "CVE-2025-21298"
        severity = "high"

    strings:
        // OLE file header
        $ole_header = { D0 CF 11 E0 A1 B1 1A E1 }

        // Malicious stream indicators
        $stream1 = "\\x01Ole" ascii
        $stream2 = "\\x01CompObj" ascii
        $stream3 = "Package" ascii wide

        // Shellcode patterns
        $shell1 = { 90 90 90 90 }  // NOP sled
        $shell2 = { FC E8 }        // Common shellcode start

    condition:
        $ole_header at 0 and
        (any of ($stream*) or any of ($shell*))
}

rule CVE_2025_21298_Email_Payload {
    meta:
        description = "Detects email payloads for CVE-2025-21298"
        author = "Security Research"
        date = "2025-01-14"
        cve = "CVE-2025-21298"
        severity = "critical"

    strings:
        // Email headers
        $email1 = "Content-Type:" ascii nocase
        $email2 = "application/rtf" ascii nocase
        $email3 = "text/rtf" ascii nocase

        // RTF content
        $rtf = "{\\rtf" ascii

        // OLE indicators
        $ole1 = "\\object" ascii
        $ole2 = "objdata" ascii

        // Base64 encoded OLE header
        $b64_ole = "0M8R4KGxGuE" ascii

    condition:
        any of ($email*) and ($rtf or $b64_ole) and any of ($ole*)
}

rule CVE_2025_21298_Outlook_Exploit {
    meta:
        description = "Detects Outlook-specific exploitation of CVE-2025-21298"
        author = "Security Research"
        date = "2025-01-14"
        cve = "CVE-2025-21298"
        severity = "critical"

    strings:
        // Calendar/meeting request patterns
        $cal1 = "BEGIN:VCALENDAR" ascii
        $cal2 = "METHOD:REQUEST" ascii
        $cal3 = "X-ALT-DESC" ascii

        // HTML with OLE
        $html1 = "<object" ascii nocase
        $html2 = "classid=" ascii nocase
        $html3 = "application/x-oleobject" ascii nocase

        // RTF in alternative body
        $rtf = "{\\rtf" ascii

    condition:
        (any of ($cal*) and $rtf) or
        (2 of ($html*))
}

:material-file-download: prevention/yara.yar

# CVE-2025-21298 - Windows OLE Prevention Rules for Nginx
# Use for email gateways and web proxies

# Block RTF file uploads
location /upload {
    # Block RTF and related file types
    if ($content_type ~* "(application/rtf|text/rtf|application/x-rtf)") {
        return 415;
    }

    # Check file extension
    if ($request_uri ~* "\.(rtf|doc|docx|ole)$") {
        # Log and inspect
        access_log /var/log/nginx/ole-uploads.log;
    }

    client_max_body_size 25M;
}

# Block OLE object content types in responses
location / {
    # Proxy response filtering (requires additional module)
    # Block potentially malicious content types

    # Add security headers
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Download-Options "noopen" always;
}

# Email attachment proxy rules
location /mail/attachments/ {
    # Log all attachment access
    access_log /var/log/nginx/mail-attachments.log;

    # Block known dangerous types
    if ($upstream_http_content_type ~* "(application/rtf|application/oleobject)") {
        return 403;
    }
}

:material-file-download: prevention/nginx.conf

# CVE-2025-21298 - Windows OLE Prevention Rules for Apache HTTPD

# Block RTF file uploads
<LocationMatch "^/upload">
    # Block RTF content type
    SetEnvIfNoCase Content-Type "application/rtf" block_rtf=1
    SetEnvIfNoCase Content-Type "text/rtf" block_rtf=1

    <If "env('block_rtf') == '1'">
        Require all denied
    </If>
</LocationMatch>

# ModSecurity Rules
<IfModule mod_security2.c>
    # Block RTF file uploads
    SecRule FILES_NAMES "@rx \\.rtf$" \
        "id:2025212981,phase:2,deny,status:403,\
        msg:'CVE-2025-21298 RTF File Upload Blocked',\
        severity:CRITICAL"

    # Block OLE object content type
    SecRule REQUEST_HEADERS:Content-Type "@rx application/(rtf|oleobject)" \
        "id:2025212982,phase:1,deny,status:415,\
        msg:'CVE-2025-21298 OLE Content Type Blocked',\
        severity:HIGH"

    # Detect RTF magic bytes in upload
    SecRule REQUEST_BODY "@rx ^\\{\\\\rtf" \
        "id:2025212983,phase:2,deny,status:403,\
        msg:'CVE-2025-21298 RTF Content Detected',\
        severity:CRITICAL"

    # Block malformed OLE headers
    SecRule REQUEST_BODY "@rx \\xD0\\xCF\\x11\\xE0" \
        "id:2025212984,phase:2,log,\
        msg:'CVE-2025-21298 OLE File Header Detected'"
</IfModule>

# Response headers
Header always set X-Content-Type-Options "nosniff"
Header always set X-Download-Options "noopen"

:material-file-download: prevention/httpd.conf

Frequently asked questions

What is CVE-2025-21298?

CVE-2025-21298 (Microsoft) is a Critical vulnerability: Windows (OLE Component). This entry ships ready-to-deploy detection and prevention rules (Snort, YARA, Nginx, Apache) plus a detection-only PoC and a Docker test lab.

How do I detect CVE-2025-21298?

Deploy the Snort and YARA detection rule included with this entry (see Detection & prevention rules below), then validate it against the detection-only PoC in the Docker test lab.

How do I block or mitigate CVE-2025-21298?

Apply the Nginx and Apache mitigation config included with this entry, and upgrade to a fixed version per the vendor advisory (see the NVD record for affected versions).

Other entries for the same vendor or product:


For authorized security testing and research only. See the full source and NVD record.