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



CVE-2026-49144

CVE-2026-49144: Unauthenticated Arbitrary File Read via Path Traversal in BrowserStack Runner

Amit Schendel
Amit Schendel
Senior Security Researcher

Jun 3, 2026·7 min read·5 visits

Executive Summary (TL;DR)

BrowserStack Runner through 0.9.5 permits unauthenticated remote file disclosure due to lack of path sanitization in its internal HTTP server handlers.

An unauthenticated path traversal vulnerability in BrowserStack Runner versions up to and including 0.9.5 allows remote or adjacent network attackers to read arbitrary files from the host system. The flaw exists within the local HTTP test server's fallback and patch file handlers, which fail to sanitize path inputs before passing them to file resolution APIs.

Vulnerability Overview

The BrowserStack Runner utility is an integration tool developed to automate JavaScript-based unit tests across a range of remote web browsers. During test runs, the utility initializes a local HTTP server using the Node.js native http module. This server acts as the central mechanism for hosting and delivering JavaScript test suites, static testing assets, and framework-specific patch files to both the local host and remote BrowserStack worker instances.

The default binding configuration of this HTTP server exposes it to any reachable network interface, resolving to 0.0.0.0. While this configuration simplifies communication with remote cloud-based browsers, it opens an unauthenticated listening port on the system execution context. Any host on the local or adjacent network can communicate with this service, establishing a direct attack surface.

A validation failure exists within the component responsible for routing incoming HTTP requests. The routing mechanism fails to perform directory containment verification on user-controlled URI paths before handling file reads. This flaw corresponds to CWE-22 (Improper Limitation of a Pathname to a Restricted Directory) and permits an unauthenticated threat actor to bypass directory boundaries and read arbitrary files residing on the target system.

Root Cause Analysis

The root cause of CVE-2026-49144 is located within lib/server.js. The local HTTP server relies on a manual routing implementation to classify and process incoming client requests. The server extracts the raw request pathname into the uri variable, then attempts to determine the target handler by splitting the pathname at slash separators and selecting the first subdirectory segment as the routing key (method = uri.split('/')[1]).

If an incoming URL pathname does not begin with one of the predefined routing paths (such as _progress, _report, or _log), the router evaluates the key as undefined and defaults the processing task to handlers._default. Because the router passes the original, unmodified, and unvalidated uri parameter directly to the fallback handler, an attacker can supply directory traversal sequences like ../ to alter the target path.

Inside the _default handler, the path resolution is performed via path.join(process.cwd(), uri). Node.js's native path.join helper normalizes the directory traversal sequences, resulting in an absolute file path that escapes the current working directory boundary. A secondary vector exists in the _patch handler, which behaves similarly by resolving paths relative to the package installation folder (__dirname) via path.join(__dirname, uri) without validation.

The vulnerability is compounded by the behavior of the internal file-serving mechanism handleFile. For non-HTML files, handleFile executes the third-party send library to stream the file contents to the client. While the send package features native directory traversal protection, this security boundary is only activated when a root path is configured in its options. Because handleFile invokes the function without defining a root directory, the utility processes arbitrary absolute file paths directly, executing the disk read without constraint.

Code Analysis: Vulnerable vs. Patched Code

To illustrate the vulnerability, analyze the vulnerable implementation of the router fallback and path resolution logic in lib/server.js:

// Vulnerable Routing and Fallback Implementation
return http.createServer(function(request, response) {
  var uri = url.parse(request.url).pathname;
  var method = uri.split('/')[1];
  var body = '';
 
  request.on('data', function(data) {
    body += data;
  });
  request.on('end', function() {
    // Unvalidated fallback allows traversal sequences in 'uri'
    (handlers[method] || handlers._default)(uri, body, request, response);
  });
});

The following segment exhibits the vulnerable _default and _patch handlers, where unchecked concatenations allow boundary escapes:

// Vulnerable Handlers
var handlers = {
  '_patch': function patchHandler(uri, body, request, response) {
    // Concatenating unchecked uri to __dirname
    var filePath = path.join(__dirname, uri);
    logger.trace('_patch', filePath);
    handleFile(filePath, request, response, true);
  },
 
  '_default': function defaultHandler(uri, body, request, response) {
    // Concatenating unchecked uri to current working directory
    var filePath = path.join(process.cwd(), uri);
    logger.trace('_default', filePath);
    handleFile(filePath, request, response);
  }
};

Remediation requires implementing strict boundary containment checks using path.resolve and verification that the resolved absolute path starts with the base directory path. The following updated source code illustrates the complete patch:

// Safe Path Verification Helper
function isSafePath(baseDir, targetPath) {
  var resolvedBase = path.resolve(baseDir);
  var resolvedTarget = path.resolve(targetPath);
  // Enforce that the target path remains nested within the base directory
  return resolvedTarget.startsWith(resolvedBase);
}
 
var handlers = {
  '_patch': function patchHandler(uri, body, request, response) {
    var filePath = path.join(__dirname, uri);
    
    if (!isSafePath(__dirname, filePath)) {
      sendError(response, 'Forbidden', 403);
      return;
    }
    
    logger.trace('_patch', filePath);
    handleFile(filePath, request, response, true);
  },
 
  '_default': function defaultHandler(uri, body, request, response) {
    var filePath = path.join(process.cwd(), uri);
    
    if (!isSafePath(process.cwd(), filePath)) {
      sendError(response, 'Forbidden', 403);
      return;
    }
 
    logger.trace('_default', filePath);
    handleFile(filePath, request, response);
  }
};

Exploitation & Attack Methodology

Exploitation of CVE-2026-49144 does not require authentication or specific environment state, except that the BrowserStack Runner test server must be actively running and accessible on an reachable network interface. The attacker targets the local port, which defaults to 3000 or can be identified via active network scanning.

Because typical HTTP clients such as web browsers or standard curl utilities automatically normalize path segments locally before transmission, direct exploitation attempts may fail if the client strips the traversal sequences (../). The attacker must transmit the raw, un-normalized dot-dot-slash sequence in the request line. Using curl with the --path-as-is command-line option preserves the exact traversal sequences.

The attack sequence diagram describes the payload flow through the system:

Alternatively, the attacker can leverage the _patch routing handler to bypass checks by prepending the route name to the traversal sequence. The payload GET /_patch/../../../../../../etc/passwd resolves to handlers._patch, escapes __dirname, and exposes /etc/passwd.

Impact & Risk Assessment

The impact of this vulnerability is high confidentiality loss. An unauthenticated network-adjacent or local attacker can retrieve arbitrary files from the system running the BrowserStack Runner process, subject to the file permissions of the user context executing the tests.

Typical targets for data exfiltration in development or continuous integration (CI) environments include SSH private keys, cloud service provider credentials, application source code, API tokens, and local system configuration files. If the runner is executed within a privileged continuous integration pipeline (such as a GitHub runner, GitLab runner, or Jenkins agent), the credentials retrieved could allow the attacker to compromise code repositories or cloud infrastructure.

The vulnerability is tracked with a CVSS v4.0 base score of 7.1, with the vector emphasizing an adjacent network attack path, low complexity, and high confidentiality impact on the affected system. Because BrowserStack Runner is a local development utility and does not perform modifying actions or manage resources, there is zero impact on system integrity or availability.

Remediation, Workarounds, and Detection

The primary mitigation is the application of the path validation check within the lib/server.js file of local installations. If updating the codebase is not immediately possible, security teams must enforce localized binding rules. Modifying the test configuration to bind the local server strictly to the loopback interface (127.0.0.1 or localhost) prevents remote or network-adjacent hosts from accessing the open port.

In addition, local host-based firewalls (such as Windows Defender Firewall, iptables, or ufw) should be configured to drop incoming packets targeting the runner's test ports from external network zones. Host-based intrusion detection systems or web application firewalls can apply pattern matching signatures to block requests containing directory traversal sequences.

Continuous integration agents and development workstations should avoid running test suites with administrative privileges. Restricting the process owner account limits the filesystem exposure to the runner's working directory and prevents the exposure of critical administrative configuration assets like /etc/shadow.

Technical Appendix

CVSS Score
7.1/ 10
CVSS:4.0/AV:A/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
EPSS Probability
0.02%
Top 93% most exploited

Affected Systems

BrowserStack Runner host systems running versions <= 0.9.5

Affected Versions Detail

Product
Affected Versions
Fixed Version
BrowserStack Runner
BrowserStack
<= 0.9.5None
AttributeDetail
CWE IDCWE-22
Attack VectorAdjacent Network (AV:A)
CVSS v4 Score7.1 (High)
EPSS Score0.00024
ImpactArbitrary File Disclosure
Exploit StatusPoC
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1083File and Directory Discovery
Discovery
T1005Data from Local System
Collection
CWE-22
Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')

The software uses external input to construct a pathname that should be within a restricted directory, but it does not properly neutralize security-sensitive elements such as directory traversal sequences.

Known Exploits & Detection

VulnCheckExploit maturity analysis and details regarding the unauthenticated HTTP path traversal vulnerability.

Vulnerability Timeline

Official Security Advisory jointly published on GitHub
2026-06-02
CVE-2026-49144 registered and published to NVD
2026-06-02
Complete technical analysis and functional exploit PoC documented
2026-06-03

References & Sources

  • [1]NVD - CVE-2026-49144 Detail
  • [2]GitHub Security Advisory GHSA-8rpw-6cqh-2v9h
  • [3]VulnCheck Security Advisory

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

•30 minutes ago•CVE-2026-42211
8.1

CVE-2026-42211: Remote Code Execution via Insecure Deserialization in React Router Framework Mode

A critical vulnerability exists in React Router v7 when running in Framework Mode. The vulnerability arises from insecure deserialization of TYPE_ERROR objects in the internal turbo-stream library, which resolves constructors from the global scope. If an application contains an independent prototype pollution vulnerability, an attacker can trigger unauthenticated Remote Code Execution (RCE) on the server.

Alon Barad
Alon Barad
2 views•5 min read
•about 2 hours ago•CVE-2026-47265
6.6

CVE-2026-47265: Cross-Origin Cookie Leakage in AIOHTTP Client Redirects

AIOHTTP prior to version 3.14.0 fails to clear request-specific cookies when executing cross-origin automatic HTTP redirects. This vulnerability allows remote web servers to harvest sensitive credentials and session cookies originally scoped to an authorized target domain.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 3 hours ago•CVE-2026-49143
8.8

CVE-2026-49143: Unauthenticated Remote Code Execution in browserstack-runner

An unauthenticated remote code execution (RCE) vulnerability exists in the browserstack-runner npm package (versions up to and including 0.9.5). The flaw lies in the /_log HTTP endpoint handler, which evaluates user-supplied input within a non-secure Node.js VM context combined with dynamic eval() execution. Network-adjacent attackers can exploit this behavior to escape the sandbox and execute arbitrary system commands on the host machine.

Alon Barad
Alon Barad
6 views•6 min read
•about 3 hours ago•GHSA-F9RX-7WF7-JR36
8.1

GHSA-F9RX-7WF7-JR36: Two-Factor Authentication Bypass and Passwordless API Key Creation in Froxlor

An architectural flaw in the Froxlor server administration control panel allows attackers to completely bypass Two-Factor Authentication (2FA) by issuing commands directly through the API. The API authentication routine in 'FroxlorRPC::validateAuth' fails to check the account's 2FA status, enabling arbitrary execution of administrative and customer actions. Furthermore, in versions prior to 2.3.7, API keys could be created without validating the current user password, exposing users to persistent backdoor access via session hijacking or CSRF.

Alon Barad
Alon Barad
4 views•5 min read
•about 4 hours ago•CVE-2026-42342
7.5

CVE-2026-42342: Uncontrolled Resource Consumption and Denial of Service in React Router and Remix

An Uncontrolled Resource Consumption vulnerability (CWE-400) affects React Router in Framework Mode and Remix server runtimes. A remote, unauthenticated attacker can trigger unbounded recursive path expansion in the manifest resolution component, leading to 100% CPU exhaustion and complete Denial of Service. The vulnerability arises because the server does not enforce depth limits when parsing deeply nested path segments in requests directed to the dynamic manifest evaluation endpoints. This blocks the single-threaded Node.js event loop, preventing the processing of subsequent client requests. The issue is resolved in react-router v7.15.0 and @remix-run/server-runtime v2.17.5. Applications using React Router in client-side-only Declarative or Data modes are unaffected.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 4 hours ago•CVE-2026-40181
6.6

CVE-2026-40181: Open Redirect Vulnerability in React Router

An open redirect vulnerability exists in the react-router library due to insufficient validation of double-slash prefix paths in the redirect programmatic navigation helper. Attackers can leverage this to bypass standard destination validation checks and redirect users to malicious domains. This occurs because browsers interpret double-slash URLs as protocol-relative targets rather than relative application paths.

Amit Schendel
Amit Schendel
5 views•7 min read