Feb 28, 2026·4 min read·52 visits
Unauthenticated attackers can bypass registration restrictions and create active accounts via the WebAuthn API endpoint in phpMyFAQ versions < 4.0.18.
A critical authorization bypass vulnerability exists in the WebAuthn implementation of phpMyFAQ prior to version 4.0.18. The flaw allows unauthenticated attackers to create active user accounts even when public registration is explicitly disabled in the system configuration. This occurs due to missing configuration checks and CSRF validation in the `/api/webauthn/prepare` endpoint.
phpMyFAQ, a widely used open-source FAQ content management system, contains a logic flaw in its WebAuthn authentication flow. The vulnerability, identified as CVE-2026-27836, resides in the WebAuthnController class responsible for handling WebAuthn registration and authentication requests.
Normally, user registration is governed by global configuration settings (security.enableRegistration) and requires specific authorization checks. However, the prepare method in the API endpoint /api/webauthn/prepare failed to consult these configuration settings. Furthermore, it lacked Cross-Site Request Forgery (CSRF) protection, creating a direct path for unauthenticated actors to interact with the user creation logic.
The consequence is a complete bypass of the application's registration gates. An attacker can create valid, active user accounts regardless of administrative intent to close registration, potentially expanding the attack surface for further exploitation.
The root cause of this vulnerability is CWE-862: Missing Authorization. Specifically, the prepare method in src/phpMyFAQ/Controller/Frontend/WebAuthnController.php did not enforce the application's security policy before processing input.
In the vulnerable implementation, the controller directly processed JSON payloads containing a username field. Upon receiving this request, the application would:
security.enableWebAuthnSupport or security.enableRegistration were set to true.$this->user->createUser($username) and immediately followed it with $this->user->setStatus('active'). This explicitly set the new user's status to active, bypassing any manual approval workflows or email verification steps that might otherwise apply.This sequence meant that the mere presence of the code path was sufficient to allow account creation, irrespective of the system's runtime configuration.
The patch provided in commit f2ab673f0668753cd0f7c7c8bc7fd2304dcf5cb1 introduces strict guards at the beginning of the prepare method. Below is a comparative analysis of the logic flow.
Prior to the fix, the method accepted the request and processed the user creation immediately:
public function prepare(Request $request): JsonResponse
{
// ... (Payload decoding)
$username = $data->username;
// DIRECT CREATION WITHOUT CHECKS
if (!$this->user->getUserByLogin($username, false)) {
$this->user->createUser($username);
$this->user->setStatus('active'); // Account is immediately usable
// ...
}
}The fix introduces three critical layers of defense: configuration verification, CSRF validation, and safe default status.
public function prepare(Request $request): JsonResponse
{
// 1. Configuration Gates
if (!$this->configuration->get('security.enableWebAuthnSupport')) {
return $this->json(['error' => 'WebAuthn support is disabled.'], Response::HTTP_FORBIDDEN);
}
if (!$this->configuration->get('security.enableRegistration')) {
return $this->json(['error' => 'Registration is disabled.'], Response::HTTP_FORBIDDEN);
}
// ... (Payload decoding)
// 2. CSRF Validation
$csrfToken = Filter::filterVar($data->csrf, FILTER_SANITIZE_SPECIAL_CHARS);
if (!Token::getInstance()->verifyToken('webauthn-prepare', $csrfToken)) {
return $this->json(['error' => Translation::get('ad_msg_noauth')], Response::HTTP_UNAUTHORIZED);
}
// 3. Safe Default Status
if (!$this->user->getUserByLogin($username, false)) {
$this->user->createUser($username);
$this->user->setStatus('blocked'); // Account created but disabled by default
}
}Exploitation of CVE-2026-27836 is trivial and requires no authentication or special tooling. An attacker simply needs to send a crafted HTTP POST request to the target server. This can be performed via curl, Burp Suite, or any HTTP client.
Prerequisites:
Attack Vector:
POST /api/webauthn/prepare HTTP/1.1
Host: target-phpmyfaq.com
Content-Type: application/json
{
"username": "malicious_user"
}Outcome:
If successful, the server responds with a 200 OK status (or similar success indicator related to WebAuthn challenge generation). A new user with the login malicious_user is created in the database with active status. The attacker has successfully bypassed the "Registration Disabled" setting.
The impact of this vulnerability is classified as High (CVSS 7.5) due to the complete compromise of the integrity of the user registration system.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
phpMyFAQ phpMyFAQ | < 4.0.18 | 4.0.18 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-862 |
| CVSS v3.1 | 7.5 (High) |
| Attack Vector | Network |
| Privileges Required | None |
| Exploit Maturity | PoC Available |
| Vendor | phpMyFAQ |
The npm package 'pickem' is vulnerable to a terminal escape-sequence injection (CWE-150). Unsanitized terminal outputs allow attackers to execute arbitrary shell commands via clipboard hijacking (OSC 52) or manipulate terminal displays through Control Sequence Introducers (CSI).
CVE-2026-55537 is a server-side request forgery (SSRF) and time-of-check time-of-use (TOCTOU) vulnerability in the PraisonAI multi-agent framework before version 4.6.58. The flaw exists in the job-submission component's webhook URL validation logic. When DNS resolution fails during verification, the application fails open, enabling attackers to register unresolvable URLs. When a completed job triggers the webhook, the application performs a fresh DNS resolution that attackers can manipulate to target internal resources.
Prior to version 5.0.8, django CMS fails to respect dynamically declared Vary HTTP headers in its internal page cache. This allows remote attackers to bypass authorization, leak sensitive information across user sessions, or poison the page cache by sending requests with custom headers.
A security vulnerability in the github.com/gorilla/websocket Go library allows remote attackers to predict client-to-server frame masking keys. This occurs because the library generates 32-bit mask keys using Go's non-cryptographically secure pseudo-random number generator (math/rand). Predicting these keys enables adversaries to bypass proxy-based security protections, facilitating HTTP request smuggling and cache poisoning attacks.
MHSanaei 3X-UI is a web control panel for managing Xray-core servers. In versions prior to 3.3.1, an authenticated administrator can abuse database import functions or raw template config fields to overwrite or append to arbitrary files on the host filesystem. This is achieved by altering the Xray log configuration variables to target system files, leveraging logging components to inject payloads.
Cloudreve is vulnerable to an incorrect authorization bypass. When listing files, Cloudreve returns a context_hint (represented as a UUID) to the client. If this context hint is replayed on the /file/url or /file/thumb routes, Cloudreve's database file system caches the shareNavigatorState containing the loaded share root. Within the cache lifetime (TTL of 300 seconds), if the user re-requests the same file with the cached hint, the system restores the state and completely bypasses the root security checks (which validate share expiration, remaining download limits, owner status, and passwords). This allows unauthorized users to continue generating signed file URLs and downloading files even after a share has been deleted, has expired, or has reached its download limit.