Feb 28, 2026·5 min read·90 visits
MyBB versions before 1.8.39 contain a Local File Inclusion vulnerability in the upgrade wizard. Attackers with access to the installation script (admins or uninstalled instances) can manipulate the 'action' parameter to execute arbitrary local files.
A high-severity Local File Inclusion (LFI) vulnerability has been identified in the upgrade component of MyBB, a popular open-source forum software. The flaw resides in the `install/upgrade.php` script, where insufficient input validation on the `action` parameter allows attackers to traverse directories and include arbitrary PHP files. This vulnerability affects all MyBB versions prior to 1.8.39. Successful exploitation can lead to Remote Code Execution (RCE) if the attacker can upload or control a file on the disk, or significant information disclosure depending on the server configuration.
A path traversal vulnerability exists in the upgrade mechanism of MyBB, specifically within the install/upgrade.php script. This component is responsible for handling database schema updates and version migration tasks during the software's installation or upgrade process. The vulnerability stems from improper handling of the action HTTP parameter, which determines which upgrade module to load.
The application fails to adequately sanitize user-supplied input before using it to construct a file path for inclusion. By manipulating this parameter, an attacker can break out of the intended directory structure (install/modules/) and point the application to files located elsewhere on the server. While the inclusion logic appends a .php extension to the file path, this still permits the execution of any PHP file accessible to the web server user.
Access to the vulnerable script is typically restricted by the presence of an install/lock file in a production environment. However, if this file is missing, or if the attacker possesses administrative credentials to bypass the lock check, the vulnerability becomes exploitable. This flaw is tracked as CWE-22 (Improper Limitation of a Pathname to a Restricted Directory).
The root cause of CVE-2025-48940 lies in the logic used to parse the action parameter in install/upgrade.php. The application intends to split this parameter into a module name and an operation. The parsing logic uses the PHP explode function with an underscore delimiter to separate these components.
The code blindly trusts the first segment of the exploded string ($bits[0]) and assigns it to the variable $from. This variable is subsequently passed to the next_function(), which is responsible for loading the appropriate upgrade module. Crucially, there was no validation to ensure $from contained only safe characters (such as alphanumeric characters) before it was used in a file path.
Inside next_function(), the application constructs a path using the pattern "upgrade" . $from . ".php" and passes this string to a custom load_module() function. Because $from is user-controlled and unvalidated, an attacker can inject directory traversal sequences (e.g., ../../) to navigate out of the install/modules directory. The lack of a whitelist or a sanitization routine for directory separators is the direct cause of this LFI.
The vulnerability is evident in the pre-patch logic of install/upgrade.php. The code extracts the action parameter and splits it without verifying the content of the resulting segments.
Vulnerable Code (Pre-Patch):
// The 'action' input is split, and the first part is trusted implicitly.
$bits = explode("_", $mybb->input['action'], 2);
if(!empty($bits[1]))
{
$from = $bits[0]; // $from is tainted user input
$runfunction = next_function($bits[0], $bits[1]);
}
// ... inside next_function($from, ...)
// The tainted variable is used to construct a file path.
load_module("upgrade".$from.".php"); Patched Code (Fix):
The fix, applied in version 1.8.39, introduces strict validation using ctype_alnum(). This function verifies that the input consists solely of alphanumeric characters, effectively rejecting any payload containing dots (.) or slashes (/), which are required for path traversal.
$bits = explode("_", $mybb->input['action'], 2);
if(!empty($bits[1]))
{
// Validation: Ensure the input is only alphanumeric
if(ctype_alnum($bits[0]))
{
$from = $bits[0];
}
else
{
$from = 0; // Fallback to safe default on failure
}
$runfunction = next_function($from, $bits[1]);
}Additionally, a defense-in-depth check was added inside next_function to enforce the same alphanumeric constraint immediately before the load_module call.
Exploiting this vulnerability requires the attacker to have network access to the install/upgrade.php script. In a secure MyBB installation, this directory is locked via a lock file. Therefore, the attacker must either be an authenticated administrator (who is allowed to run upgrades) or target a server where the install/ directory was left unlocked or the lock file was deleted.
Attack Vector:
The attacker constructs a GET or POST request to install/upgrade.php. The malicious payload is injected into the action parameter. Because the application appends .php to the include path, the attacker is limited to including files that end in .php or files that the server will execute as PHP regardless of extension (if configuration allows, though the code explicitly adds the extension).
Payload Example:
GET /install/upgrade.php?action=../../../../tmp/malicious_payload_next&step=... HTTP/1.1
Host: target-forum.com
Cookie: [Admin Session Cookies]In this scenario, if the attacker has previously managed to upload a file named malicious_payload.php to /tmp/ (perhaps via a separate avatar upload vulnerability or session file poisoning), the application would execute load_module("upgrade../../../../tmp/malicious_payload.php"). This resolves to /tmp/malicious_payload.php, resulting in Remote Code Execution (RCE).
The impact of this vulnerability ranges from sensitive information disclosure to full Remote Code Execution (RCE), depending on the attacker's ability to introduce files onto the server's filesystem.
Confidentiality:
While the LFI is restricted by the appended .php extension, an attacker might be able to execute sensitive PHP configuration files. However, since they are executed rather than printed, reading source code is difficult unless the attacker uses PHP wrappers (e.g., php://filter), which may be difficult given the string concatenation structure.
Integrity & Availability: The primary risk is RCE. If an attacker can upload a file (e.g., a disguised image containing PHP code) or manipulate session files, they can use this LFI to execute that code. This grants full control over the web application, allowing the attacker to modify the database, delete forums, redirect users, or pivot to the underlying server operating system. The CVSS score of 7.2 reflects this high impact, tempered only by the high privileges or specific race conditions (unlocked installer) required for exploitation.
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
MyBB MyBB Group | < 1.8.39 | 1.8.39 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-22 |
| Attack Vector | Network |
| CVSS v3.1 | 7.2 (High) |
| EPSS Score | 0.00128 |
| Impact | Remote Code Execution (RCE) / LFI |
| Exploit Status | PoC Available |
The software uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the software does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.
CVE-2026-115895 is a high-severity code injection vulnerability (CWE-94) in the happy-dom npm package prior to version 21.0.4. The vulnerability exists within the ECMAScriptModuleCompiler component, which transforms ECMAScript module syntax into executable Node.js functions when JavaScript evaluation is enabled. Due to an incomplete fix for CVE-2026-33943, the compiler failed to validate local named import aliases against legal JavaScript identifier rules. Attackers supplying crafted module imports—specifically utilizing destructuring default initializers alongside JSON module attributes—can inject arbitrary JavaScript expressions directly into the host Node.js runtime context.
An improper input validation and authorization bypass vulnerability exists in the LangGraph storage layer affecting langgraph, langgraph-checkpoint-postgres, and langgraph-checkpoint-sqlite. Because relational store implementations serialize namespace tuples into dot-delimited strings without validating labels on read, search, delete, and batch operations, an attacker who controls a namespace label can inject periods (.) to traverse namespace boundaries and access, modify, or delete data belonging to other namespaces.
CVE-2026-115886 (GHSA-2wqp-q3c6-ccj5) is a Server-Side Request Forgery (SSRF) and Unsafe Reflection vulnerability in MLflow versions 3.12.0rc0 prior to 3.17.0. Unauthenticated REST API endpoints accept serialized third-party scorer JSON payloads that are dynamically deserialized and reflectively instantiated without sanitizing constructor keyword arguments. When optional dependencies such as trulens and trulens-providers-litellm are installed, attackers can inject egress-steering arguments into the scorer payload, forcing the MLflow server to dispatch outbound HTTP requests to arbitrary internal destinations or cloud metadata services.
CVE-2026-113872 (GHSA-q7qp-rjg7-q26m) is a high-severity denial-of-service vulnerability affecting the multer multipart/form-data upload middleware for Node.js and Express in versions 2.0.0 through 2.4.0. When an endpoint is configured to accept multiple files using an asynchronous fileFilter callback, a crafted, truncated multipart HTTP request can trigger an unhandled error event on the underlying busboy stream parser after request teardown has already completed. Because all error listeners are stripped during teardown, Node.js treats the resulting error event as an uncaught exception and immediately terminates the server process.
CVE-2026-115897 (also tracked as GHSA-m5mm-p8h7-m29v and aliased as CVE-2026-115754) is a Cross-Site Scripting (XSS) vulnerability in the Yahoo serialize-javascript npm package prior to version 7.1.3. The flaw exists in the regular expression used by escapeFunctionBody() to neutralize HTML script closing tags within serialized JavaScript functions. Because function bodies are sanitized in isolation before structural formatting is applied, a function whose string representation terminates directly with the sequence '</script' bypasses the positive lookahead check. When combined with serialization formatting options that introduce whitespace delimiters and a subsequent property that supplies a closing bracket, an attacker can prematurely terminate an enclosing HTML <script> block and inject arbitrary HTML or JavaScript into the rendered document.
CVE-2026-109841 is a Subresource Integrity (SRI) verification bypass vulnerability in undici, the official HTTP/1.1 and HTTP/2 client library for Node.js that powers the global fetch() implementation. The flaw stems from improper handling of case sensitivity (CWE-178) when validating cryptographic hash algorithm tokens within SRI metadata. Because undici compared incoming algorithm identifiers against a strictly lowercase set without prior ASCII-lowercase normalization, valid uppercase or mixed-case tokens such as SHA256- or Sha384- were treated as unrecognized algorithms and discarded. Under SRI forward-compatibility rules, discarding all provided tokens results in an empty integrity list, causing undici to fail open and accept tampered HTTP response bodies without cryptographic verification.