☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
Publishpress logo [ WEBSITE ] [ VENDOR STATS ]
CVSS: 4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N 🐛 CWE-862
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2025-69361

CVE-2025-69361 Missing Authorization in Publishpress
📅 PUBLISHED: 2026-01-06 16:36 UTC 🔄 UPDATED: 2026-08-12 14:52 UTC
[ PATCH UNDER REVIEW ↓ ] Remains UNDER REVIEW until an independent source confirms the fix
[ DEFENSE PATCH ↓ ]
💣 PoC: Public
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.03%
👁️
0.03% probability
<1× above the median CVE
Tier: LOW
30-day exploitation window · FIRST.org · updated daily
🥷 MITRE: T1190
👁️
MITRE ATT&CK Tactic - Describes the strategy hackers use to execute this attack.
Country: Estonia License: Freemium
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS VECTOR BREAKDOWN 4.3
AV: N Attack Vector Network
AC: L Attack Complexity Low
PR: L Privileges Required Low
UI: N User Interaction None
S: U Scope Unchanged
C: L Confidentiality Low
I: N Integrity None
A: N Availability None
4.3
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-69361 is a Missing Authorization vulnerability in the PublishPress Post Expirator WordPress plugin, affecting versions from n/a through 4.9.3. This flaw allows an authenticated attacker with low privileges to exploit incorrectly configured access control security levels, potentially leading to unauthorized access to scheduled post expiration settings or actions. The vulnerability has a CVSS score of 4.3 (Medium) and an EPSS score of 0.0%, indicating low exploitation likelihood in the wild. No public proof-of-concept or exploit code is available at this time.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

WordPress Ecosystem Context

This vulnerability is specific to the WordPress plugin ecosystem, not the underlying web server (Apache/Nginx). The issue lies in the plugin's failure to properly enforce authorization checks on certain administrative actions, allowing users with minimal permissions to interact with expiration-related functionality.

CVSS Breakdown & Threat Level

  • CVSS Score: 4.3 (Medium)
  • Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
  • Attack Vector: Network
  • Attack Complexity: Low
  • Privileges Required: Low (authenticated user)
  • User Interaction: None
  • Scope: Unchanged
  • Confidentiality Impact: Low
  • Integrity Impact: None
  • Availability Impact: None

Threat Level: Medium. While the impact is limited to low confidentiality breach, the low attack complexity and lack of user interaction make it exploitable by any authenticated user.

Deep Dive & Mechanics

The vulnerability resides in the Post Expirator plugin's AJAX handlers and admin pages. The plugin fails to perform proper capability checks (e.g., manage_options or edit_posts) before allowing modifications to expiration schedules. An attacker with subscriber-level or contributor-level access can:

  1. Enumerate expiration settings for posts/pages.
  2. Modify expiration dates or disable expiration for content they do not own.
  3. Potentially view metadata about scheduled expirations.

The core issue is a Missing Authorization (CWE-862) in functions like expirationdate_save_meta or expirationdate_ajax_handler, which do not verify the user's role before processing requests.

Vulnerable vs. Patched Code

Vulnerable Code (<= 4.9.3):

// In post-expirator.php or similar
add_action('wp_ajax_expirationdate_save_meta', 'expirationdate_save_meta_callback');
function expirationdate_save_meta_callback() {
    // No capability check
    $post_id = intval($_POST['post_id']);
    $expire = sanitize_text_field($_POST['expiration']);
    update_post_meta($post_id, '_expiration-date', $expire);
    wp_die();
}

Patched Code (Hypothetical Fix):

add_action('wp_ajax_expirationdate_save_meta', 'expirationdate_save_meta_callback');
function expirationdate_save_meta_callback() {
    // Check if user can edit the specific post
    if (!current_user_can('edit_post', intval($_POST['post_id']))) {
        wp_die('Unauthorized', 403);
    }
    $post_id = intval($_POST['post_id']);
    $expire = sanitize_text_field($_POST['expiration']);
    update_post_meta($post_id, '_expiration-date', $expire);
    wp_die();
}

Exploitation & Lab Setup

Red Team

Prerequisites:

  • WordPress instance with Post Expirator <= 4.9.3 installed.
  • Low-privilege account (e.g., subscriber).

Exploitation Steps:

  1. Log in as a subscriber.
  2. Craft a POST request to /wp-admin/admin-ajax.php with action expirationdate_save_meta and a target post ID.
  3. Modify expiration date without proper authorization.

Example cURL:

curl -X POST http://target/wp-admin/admin-ajax.php \
  -d "action=expirationdate_save_meta&post_id=123&expiration=2025-12-31 23:59:59" \
  --cookie "wordpress_logged_in_xxx=..."

Blue Team

Detection:

  • Monitor AJAX requests to admin-ajax.php with action expirationdate_save_meta from low-privilege users.
  • Alert on unauthorized modification of _expiration-date post meta.

Hunting:

  • Query database for posts where _expiration-date was modified by non-admin users.
  • Review WordPress audit logs (if available) for suspicious AJAX calls.

Indicators of Compromise (IOCs)

  • Network: POST requests to /wp-admin/admin-ajax.php with action=expirationdate_save_meta from non-admin IPs.
  • Host: Modified _expiration-date meta values in wp_postmeta table.
  • Logs: WordPress debug logs showing wp_ajax_expirationdate_save_meta calls from unexpected user roles.

Detection Engineering

YARA Rule

rule CVE_2025_69361_WordPress_Plugin {
    meta:
        description = "Detects Post Expirator plugin files with missing authorization"
        author = "Valters IT"
        date = "2025-04-01"
        cve = "CVE-2025-69361"
    strings:
        $ajax_handler = "expirationdate_save_meta" nocase
        $missing_check = "current_user_can" nocase
    condition:
        $ajax_handler and not $missing_check
}

Sigma Rule

title: CVE-2025-69361 - Post Expirator Missing Authorization
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects unauthorized AJAX requests to Post Expirator endpoints
logsource:
    category: webserver
    product: apache
detection:
    selection:
        cs-method: 'POST'
        cs-uri-query|contains: 'action=expirationdate_save_meta'
    condition: selection
falsepositives:
    - Legitimate admin actions
level: medium

Suricata Rule

alert http any any -> any any (msg:"CVE-2025-69361 - Post Expirator Missing Authorization"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=expirationdate_save_meta"; http_client_body; classtype:attempted-recon; sid:1000001; rev:1;)

Remediation & Mitigation

Immediate Actions:

  1. Disable the plugin if not critical to operations.
  2. Restrict access to /wp-admin/admin-ajax.php via .htaccess or WAF rules for low-privilege users.
  3. Apply virtual patching using a Web Application Firewall (WAF) to block requests containing action=expirationdate_save_meta from non-admin roles.

Long-Term Fix:

  • Upgrade to a patched version once released by PublishPress.
  • Implement custom code fix as shown in the patched code section above.
  • Enforce capability checks using current_user_can() for all AJAX handlers.

Workaround:

  • Use a security plugin like Wordfence to add role-based restrictions on AJAX actions.

Valters IT
Senior DevSecOps & Cyber Threat Intelligence Expert

👁️ SHODAN DORKS (THREAT HUNTING)

What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.

http.title:"Post Expirator"
http.html:"post-expirator"

💣 PoC CODE AVAILABLE

Exploit code for this CVE is tracked in our database. Access poc_code via API Pro.

[ API_PRO ] →
◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-69361/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.