Vulnerability Report for March 2026

Executive Summary

This monthly summary captures what our AI‑powered vulnerability analysis engine reviewed in March 2026, analyzing 600+ new or updated vulnerabilities across ecosystems and vendors.

This report highlights the 10 high‑severity vulnerabilities prioritized by severity, CVSS and potential business impact. Below are this month’s key stats: total analyzed, critical/high counts, average CVSS, and KEV (if present).

Σ
600+
Total Vulnerabilities
C
64
Critical
H
225
High
Avg
7.2
Avg CVSS
Prefer the full picture? Visit our vulnerability database to explore everything we analyzed this month.

Table of Contents

CVE-2026-26954: SandboxJS has a Sandbox Escape Critical

CVSS Score
10.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Severity
critical
Published Date
March 13, 2026

Affected Packages

  • @nyariv/sandboxjs (npm) vulnerable: <= 0.8.33 patched in 0.8.34

Vulnerability Analysis

The vulnerability lies in the SandboxJS execution engine, specifically in the handler for function calls made from within the sandboxed environment. The root cause was a failure to sanitize the return values of these function calls. When sandboxed code executed a native JavaScript function (e.g., Object.values(this)), the raw return value was passed back into the sandbox. The vulnerability could be triggered by calling a function that returns an array containing a reference to the host's Function constructor. With access to the Function constructor, an attacker could create and execute arbitrary code, escaping the sandbox and leading to Remote Code Execution (RCE). The patch addresses this by introducing a sanitizeArray function, which is now invoked on the return value of every function call. This new function recursively inspects arrays and replaces any references to sensitive objects like the Function constructor with their sandboxed, safe counterparts, effectively preventing the leak.

Identified Vulnerable Functions

addOps(LispType.Call handler)
src/executor.ts

This anonymous handler function for LispType.Call is responsible for executing function calls originating from the sandboxed code. Prior to the patch, it would return the results of these function calls without sanitization. This allowed built-in functions like Object.values(this) to return an array containing a reference to the powerful Function constructor, which could then be used to escape the sandbox and achieve remote code execution. The patch fixes this by calling the new sanitizeArray function on the return values to replace sensitive objects like the Function constructor with their safe, sandboxed equivalents.


CVE-2026-30860: WeKnora Vulnerable to Remote Code Execution via SQL Injection Bypass in AI Database Query Tool Critical

CVSS Score
10.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Severity
critical
Published Date
March 06, 2026

Affected Packages

  • github.com/Tencent/WeKnora (go) vulnerable: <= 0.2.11 patched in 0.2.12

Vulnerability Analysis

The vulnerability exists in the SQL injection validation logic within the internal/utils/inject.go file. The security advisory explicitly identifies the validateNode function as the source of the vulnerability. The function fails to recursively validate all nodes in the PostgreSQL abstract syntax tree (AST), specifically ArrayExpr and RowExpr. This allows an attacker to craft a malicious SQL query with dangerous functions hidden inside these expressions. When the validateNode function encounters these expression types, it does not inspect their child nodes, effectively bypassing the security checks. The exploit PoC demonstrates how to use this flaw to upload and execute a malicious shared library on the database server, resulting in remote code execution. Since no patch is available, the evidence is taken directly from the vulnerability description which includes a snippet of the vulnerable code.

Identified Vulnerable Functions

sqlValidator.validateNode
internal/utils/inject.go

The validateNode function is responsible for recursively validating the abstract syntax tree (AST) of a SQL query. It lacks handlers for ArrayExpr and RowExpr node types. This omission allows an attacker to embed malicious SQL functions (e.g., pg_read_file, lo_from_bytea) within these expressions, bypassing the SQL injection validation and leading to remote code execution.


CVE-2026-30966: Parse Server has role escalation and CLP bypass via direct `_Join` table write Critical

Common Weakness Enumeration (CWE)
CWE-284 — Improper Access Control
CVSS Score
10.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:L
Severity
critical
Published Date
March 11, 2026

Affected Packages

  • parse-server (npm) vulnerable: >= 9.0.0-alpha.1, < 9.5.2-alpha.7 patched in 9.5.2-alpha.7
  • parse-server (npm) vulnerable: < 8.6.20 patched in 8.6.20

Vulnerability Analysis

The vulnerability allows for role escalation by permitting unauthenticated users to directly write to internal _Join tables, which manage relationships like role memberships. The analysis of the provided patches shows that the root cause was a missing access control check in the enforceRoleSecurity function located in src/SharedRest.js. This function is a central point for security enforcement for REST API operations. The patch introduces a new block of code that explicitly checks if an operation is targeting a class with a _Join: prefix. If so, it verifies that the request is made with a master or maintenance key, throwing an OPERATION_FORBIDDEN error otherwise. The test cases added in spec/rest.spec.js confirm that this vulnerability affected create, find, get, update, and delete operations on these internal tables. Therefore, the enforceRoleSecurity function is identified as the vulnerable function, as it failed to properly secure a critical internal data structure.

Identified Vulnerable Functions

enforceRoleSecurity
src/SharedRest.js

The enforceRoleSecurity function in src/SharedRest.js was missing a check to prevent unauthorized access to internal _Join tables. These tables manage relationships, including user-to-role mappings. An attacker could directly manipulate these tables through the REST API to grant themselves administrative roles, bypassing normal security controls. The patch adds a check to ensure only users with master or maintenance keys can access these tables.


CVE-2026-32760: File Browser Self Registration Grants Any User Admin Access When Default Permissions Include Admin Critical

Common Weakness Enumeration (CWE)
CWE-269 — Improper Privilege ManagementCWE-284
CVSS Score
10.0
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Severity
critical
Published Date
March 20, 2026

Affected Packages

  • github.com/filebrowser/filebrowser/v2 (go) vulnerable: <= 2.61.2 patched in 2.62.0

Vulnerability Analysis

The vulnerability allows an unauthenticated user to gain administrative privileges by creating a new account through the signup form. This is possible when the application is configured to allow signups and the default user permissions have been set to include administrator rights. The root cause is in the signupHandler function in http/auth.go. This handler applies default settings to a new user without sanitizing the permissions to prevent privilege escalation. The settings.UserDefaults.Apply function in settings/defaults.go is also involved as it's the function that copies the permissions, including the admin flag, to the new user. The fix, found in commit a63573b67eb302167b4c4f218361a2d0c138deab, adds a line to the signupHandler to explicitly set the new user's admin permission to false, thus preventing the privilege escalation.

Identified Vulnerable Functions

signupHandler
http/auth.go

The signupHandler function is responsible for creating new user accounts. It applies default user settings to the new user, which can include administrative permissions if so configured by an administrator. The vulnerability lies in the fact that it does not explicitly deny administrative privileges to users created via this public-facing endpoint. An attacker can register a new account and, if the default permissions are misconfigured, this new account will have full administrative rights. The patch mitigates this by adding user.Perm.Admin = false to ensure that no user created through the signup handler can become an administrator.

UserDefaults.Apply
settings/defaults.go

This function applies the default user settings to a newly created user object. It directly copies the entire permission set from the default settings (d.Perm) to the new user's permissions (u.Perm). This includes the Admin permission. While this function itself is not the root of the vulnerability, it is a critical component in the exploit chain, as it's the mechanism by which the elevated privileges are transferred to the new user account during the signup process.


CVE-2026-33054: Mesop: Path Traversal utilizing `FileStateSessionBackend` leads to Application Denial of Service and File Write/Deletion Critical

CVSS Score
10.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Severity
critical
Published Date
March 20, 2026

Affected Packages

  • mesop (pip) vulnerable: <= 1.2.2 patched in 1.2.3

Vulnerability Analysis

The vulnerability described is a path traversal within the FileStateSessionBackend. The advisory points to the _make_file_path function in mesop/server/state_session.py as the source of the vulnerability. To confirm this and identify the exact function signature, I first identified the patched version (1.2.3) and the last vulnerable version (1.2.2) from the advisory. By comparing the git tags for these versions in the mesop-dev/mesop repository, I located the commit that introduced the fix: c6b382f363b73ac32c402a2db3aadc7784f66a5b. The diff in this commit clearly shows changes to the _make_file_path function in mesop/server/state_session.py. The original code return self.base_dir / (self.prefix + token) was removed. This line is the vulnerability, as it combines a base path with an unsanitized user-provided token. The patch adds validation to the token using a regular expression and resolves the path to ensure it remains within the base directory, thus mitigating the path traversal risk. Therefore, the FileStateSessionBackend._make_file_path function is the precise location of the vulnerability.

Identified Vulnerable Functions

FileStateSessionBackend._make_file_path
mesop/server/state_session.py

The function _make_file_path within the FileStateSessionBackend class is vulnerable to path traversal. It constructs a file path by directly concatenating the user-supplied token to a base directory without proper sanitization. An attacker can provide a token with path traversal sequences (e.g., ../../) to read, write, or delete files outside of the intended storage directory, leading to denial of service or arbitrary file manipulation.


GHSA-5wp8-q9mx-8jx8: zeptoclaw has Shell allowlist-blocklist bypass via command/argument injection and file name wildcards Critical

CVSS Score
10.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Severity
critical
Published Date
March 05, 2026

Affected Packages

  • zeptoclaw (rust) vulnerable: <= 0.6.1 patched in 0.6.2

Vulnerability Analysis

The core of the vulnerability lies in the zeptoclaw::security::shell::ShellSecurityConfig::validate_command function, which inadequately validated shell commands. The analysis of the patch 68916c3e4f3af107f11940b27854fc7ef517058b reveals several critical flaws that were addressed.

  1. Allowlist Bypass via Command Chaining: The original code only validated the first token (the command executable) against the allowlist. This allowed an attacker to append malicious commands using shell metacharacters like ;, |, or $(). For instance, a command like git status; rm -rf / would pass if git was allowlisted, leading to arbitrary command execution. The patch mitigates this by explicitly detecting and blocking these command-chaining metacharacters.

  2. Blocklist Bypass via Argument Injection: The regular expressions designed to block dangerous commands (e.g., inline Python execution with -c) were too specific. An attacker could bypass them by inserting other command-line flags, such as python3 -P -c '...'. The patch strengthens these regexes to correctly identify such patterns regardless of intervening flags.

  3. Blocklist Bypass via Glob Wildcards: The blocklist for sensitive file paths (like /etc/passwd) used a simple substring match. This was easily circumvented by using shell globbing wildcards (e.g., cat /etc/pass[w]d). The patch introduces logic to interpret these wildcards, effectively preventing the bypass.

  4. Logic Flaw in Strict Mode: A significant logic error caused the validation to be skipped entirely if the allowlist was empty in Strict mode, thereby allowing any command. The fix ensures that an empty allowlist in Strict mode correctly blocks all commands as intended.

The ShellSecurityConfig::validate_command function is the central point where these flawed controls were implemented. A secondary related issue was fixed in the device_shell function in src/tools/android/actions.rs, which had a naive blocklist for rm -rf that could be bypassed by altering the flags. Both functions were processing user-controlled commands in an unsafe manner.

Identified Vulnerable Functions

ShellSecurityConfig::validate_command
src/security/shell.rs

The function validate_command contained multiple vulnerabilities. It only checked the first token of a command against the allowlist, which allowed attackers to bypass the check by chaining commands with shell metacharacters (e.g., ';', '|', '&', '$()'). Additionally, the blocklist for sensitive file paths was based on literal string matching, making it vulnerable to bypass using shell globbing wildcards (e.g., '/etc/pass[w]d'). The regex patterns for blocking command execution were also weak and could be bypassed by injecting arguments. Finally, an empty allowlist in 'Strict' mode incorrectly permitted all commands.

device_shell
src/tools/android/actions.rs

This function, responsible for executing shell commands on an Android device, had its own flawed blocklist logic. It used a naive substring check for rm -rf, which could be bypassed by reordering flags (e.g., rm -r -f) or using long-form flags (rm --recursive --force). While the primary vulnerability is in shell.rs, this function represents a direct, vulnerable entry point for command execution that was also patched.


GHSA-h343-gg57-2q67: OneUpTime's Unsandboxed Code Execution in Probe Allows Any Project Member to Achieve RCE Critical

CVSS Score
10.0
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Severity
critical
Published Date
March 07, 2026

Affected Packages

  • @oneuptime/common (npm) vulnerable: < 10.0.18 patched in 10.0.18

Vulnerability Analysis

The vulnerability is a classic sandbox escape within the Node.js vm module, which is explicitly not a security boundary. The advisory points to Common/Server/Utils/VM/VMRunner.ts as the location of the vulnerable code. Analysis of the commits between the last vulnerable version (10.0.17) and the first patched version (10.0.18) revealed commit 2a5a0f972a3ee295194db6e0f26df8f49a923546. This commit's message, "fix: Implement sandbox proxy creation and unwrapping for secure code execution," directly addresses the described vulnerability. The changes are concentrated in the VMRunner.runCodeInNodeVM function. Before the patch, this function passed host-realm objects directly into the VM's context, allowing for prototype chain attacks to break out of the sandbox. The patch mitigates this by creating a null-prototype object for the sandbox and wrapping all exposed host objects in a Proxy that blocks access to sensitive properties like constructor and __proto__, effectively preventing the sandbox escape.

Identified Vulnerable Functions

VMRunner.runCodeInNodeVM
Common/Server/Utils/VM/VMRunner.ts

This function executes user-supplied JavaScript code using the Node.js vm module. The pre-patch version created an insecure sandbox, allowing an attacker to escape by traversing the prototype chain (e.g., using this.constructor.constructor). This enabled access to the host's process object, leading to arbitrary code execution on the server.


GHSA-vvpj-8cmc-gx39: PickleScan's pkgutil.resolve_name has a universal blocklist bypass Critical

CVSS Score
10.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Severity
critical
Published Date
March 03, 2026

Affected Packages

  • picklescan (pip) vulnerable: < 1.0.4 patched in 1.0.4

Vulnerability Analysis

The vulnerability, identified as GHSA-vvpj-8cmc-gx39, represents a complete bypass of the picklescan library's security model. The root cause is the failure to include the Python standard library function pkgutil.resolve_name in its internal blocklist of dangerous functions (_unsafe_globals).

My analysis of the patch commit bf26452ae2e3204429762c2bb1aa9eacd40436bb, which upgrades picklescan to version 1.0.4, confirms this. The patch explicitly adds "pkgutil": {"resolve_name"} to the _unsafe_globals dictionary within src/picklescan/scanner.py.

The vulnerability is not a flaw within a specific function's implementation (like a buffer overflow), but rather a critical omission in the security data used by the scanner functions. The primary functions responsible for scanning, scan_pickle_bytes and scan_pickle_file, would consume this incomplete blocklist. As a result, when scanning a pickle crafted by an attacker, these functions would not recognize the use of pkgutil.resolve_name as a threat. The attacker's pickle could then use resolve_name('os:system') to dynamically load the os.system function and execute arbitrary commands, while picklescan would report the file as safe. Therefore, the scanning functions are identified as the vulnerable components because they provide a false sense of security.

Identified Vulnerable Functions

scan_pickle_bytes
src/picklescan/scanner.py

The function scan_pickle_bytes uses the _unsafe_globals dictionary as a blocklist to detect dangerous operations within a pickle file. In the vulnerable versions, this blocklist did not include pkgutil.resolve_name. An attacker could craft a malicious pickle that uses pkgutil.resolve_name to dynamically obtain a reference to any blocked function (like os.system) and execute it. Because pkgutil.resolve_name itself was not on the blocklist, scan_pickle_bytes would fail to detect the threat and incorrectly report the malicious pickle as safe, leading to a complete bypass of the scanner's security mechanism.

scan_pickle_file
src/picklescan/scanner.py

Similar to scan_pickle_bytes, the scan_pickle_file function relies on the _unsafe_globals blocklist for security scanning. It was vulnerable for the same reason: the blocklist's failure to include pkgutil.resolve_name. This allowed malicious pickle files to be scanned and passed as safe, while they contained a payload to execute arbitrary code via pkgutil.resolve_name.


CVE-2026-30956: OneUptime has authorization bypass via client‑controlled is-multi-tenant-query header Critical

Common Weakness Enumeration (CWE)
CWE-285CWE-862 — Missing Authorization
CVSS Score
9.9
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Severity
critical
Published Date
March 10, 2026

Affected Packages

  • @oneuptime/common (npm) vulnerable: < 10.0.21 patched in 10.0.21

Vulnerability Analysis

The vulnerability stems from the application's backend improperly trusting a client-controlled HTTP header, is-multi-tenant-query. When this header was set to true, a flag was enabled that caused critical authorization and tenant isolation checks to be skipped. The core of the issue was in the TenantPermission.addTenantScopeToQuery and ModelPermission.addTenantScopeToQuery functions, where the logic to enforce tenant-scoping on database queries was bypassed. This allowed any authenticated user, regardless of their privilege level, to read and modify data belonging to any other tenant on the platform.

The severity of this authorization bypass was significantly amplified by a secondary weakness: password reset tokens were stored in plaintext. An attacker could exploit the tenant isolation bypass to query the Project model of a victim. By including the createdByUser relation in the query, they could access sensitive fields on the User model, including the plaintext resetPasswordToken. The exploitation chain involved triggering a password reset for a victim and then immediately using the tenant bypass to read the newly generated token from the database, allowing for a complete account takeover. The patches address both issues: first, by correcting the faulty logic in the permission-checking functions to properly handle the is-multi-tenant-query case, and second, by implementing hashing for all password reset tokens to prevent them from being useful even if leaked.

Identified Vulnerable Functions

TenantPermission.addTenantScopeToQuery
Common/Server/Types/Database/Permissions/TenantPermission.ts

This function is responsible for adding tenant-based restrictions to database queries. The vulnerability lies in the original logic that allowed a user to bypass tenant isolation. By sending the is-multi-tenant-query header, props.isMultiTenantRequest becomes true and props.tenantId can be null. The original condition !props.tenantId && props.userGlobalAccessPermission was too permissive and allowed queries to execute without a tenant scope, leading to cross-tenant data access.

ModelPermission.addTenantScopeToQuery
Common/Server/Types/AnalyticsDatabase/ModelPermission.ts

Similar to TenantPermission.addTenantScopeToQuery, this function in the analytics database context had the same logical flaw. It failed to properly enforce tenant boundaries when the is-multi-tenant-query header was present, allowing an attacker to bypass tenant isolation and access data from other tenants in the analytics database.

Authentication.forgotPasswordHandler
App/FeatureSet/Identity/API/Authentication.ts

The route handler for the 'forgot-password' functionality generated a password reset token and stored it in plaintext in the database. This plaintext token could be leaked using the cross-tenant data access vulnerability, which allowed an attacker to read sensitive fields from the User model of any tenant. Leaking this token enabled a full account takeover. The function is the anonymous callback for the router.post call.

StatusPageAuthentication.forgotPasswordHandler
App/FeatureSet/Identity/API/StatusPageAuthentication.ts

Similar to the main application's authentication, the 'forgot-password' handler for status page users also stored the password reset token in plaintext. This exposed status page user accounts to the same takeover risk if the token was leaked via the tenant isolation bypass.


GHSA-fq2j-j8hc-8vw8: SiYuan Vulnerable to Arbitrary File Read in Desktop Publish Service Critical

CVSS Score
9.9
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:H
Severity
critical
Published Date
March 17, 2026

Affected Packages

  • github.com/siyuan-note/siyuan/kernel (go) vulnerable: <= 0.0.0-20260313024916-fd6526133bb3 patched in None

Vulnerability Analysis

The vulnerability allows an authenticated user to read arbitrary files on the server. This is a two-stage attack. First, the attacker uses the /api/lute/html2BlockDOM endpoint to trigger the server to copy a sensitive file from a file:// URI into the web-accessible assets directory. The vulnerability exists because the html2BlockDOM function in kernel/api/lute.go did not validate the file path to prevent access to sensitive directories. The patch addresses this by adding a check using util.IsSensitivePath(). The second stage of the attack involves accessing the copied file via the /assets/ endpoint. The primary vulnerability lies in the html2BlockDOM function, which is the entry point for the malicious action.

Identified Vulnerable Functions

api.html2BlockDOM
kernel/api/lute.go

This function is vulnerable to an arbitrary file read vulnerability. It processes HTML content and copies local files referenced with file:// URIs into the application's asset directory. Before the patch, it did not validate if the file path pointed to a sensitive system file. This allowed an authenticated user to copy arbitrary files from the local filesystem (that the server process has access to) into the web-accessible asset directory, from where they could be retrieved.