Vulnerability Report for May 2026

Executive Summary

This monthly summary captures what our AI‑powered vulnerability analysis engine reviewed in May 2026, analyzing 350+ 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).

Σ
350+
Total Vulnerabilities
C
53
Critical
H
155
High
Avg
7.4
Avg CVSS
KEV
1
Known Exploited
Prefer the full picture? Visit our vulnerability database to explore everything we analyzed this month.

Table of Contents

CVE-2026-42208: LiteLLM: SQL injection in Proxy API key verification Critical

CVSS Score
9.3
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/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
May 08, 2026

Affected Packages

  • litellm (pip) vulnerable: >= 1.81.16, < 1.83.7 patched in 1.83.7

Vulnerability Analysis

The vulnerability exists in the get_data function within litellm/proxy/utils.py. The security advisory and the provided patch clearly indicate a SQL injection vulnerability. The patch replaces a formatted string in the SQL query with a parameterized query, which is the standard mitigation for SQL injection. The vulnerable line WHERE v.token = '{token}' directly uses the user-controlled token variable in the SQL query. The fix changes this to WHERE v.token = $1 and passes the token as a parameter to the database driver, preventing the injection. The vulnerability is triggered when the proxy handles an error, and an unauthenticated attacker can exploit it by sending a specially crafted Authorization header.

Identified Vulnerable Functions

get_data
litellm/proxy/utils.py

The get_data function in litellm/proxy/utils.py is vulnerable to SQL injection. The token variable, which is derived from the user-provided Authorization header, is directly formatted into the SQL query string. An attacker can craft a malicious Authorization header to inject arbitrary SQL commands, allowing them to read or modify data in the database.


CVE-2026-40281: Gotenberg vulnerable to argument injection via newlines in ExifTool metadata values Critical

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

Affected Packages

  • github.com/gotenberg/gotenberg/v8 (go) vulnerable: <= 8.30.1 patched in 8.31.0

Vulnerability Analysis

The vulnerability exists in the WriteMetadata function within pkg/modules/exiftool/exiftool.go. The root cause is improper input validation, specifically the failure to sanitize metadata values before passing them to the exiftool command-line utility. The vulnerability description explicitly points out that while metadata keys were sanitized, the values were not. An attacker could craft a metadata value with a newline character (\n) to inject arbitrary command-line arguments into the exiftool process. This could lead to arbitrary file operations on the server, such as moving, renaming, or creating symlinks, as demonstrated in the vulnerability report. The provided patch confirms this analysis by introducing a new function, validateMetadataValue, to sanitize these values by checking for control characters. This new validation is applied directly within the WriteMetadata function, confirming it as the location of the vulnerability.

Identified Vulnerable Functions

exiftool.ExifTool.WriteMetadata
pkg/modules/exiftool/exiftool.go

The WriteMetadata function is responsible for writing metadata to PDF files using the ExifTool command-line utility. Before the fix, this function did not sanitize the values of the metadata it received. An attacker could provide a metadata value containing a newline character. This value was then passed to the underlying go-exiftool library, which in turn writes it to the standard input of the exiftool process. The newline character was interpreted by exiftool as a delimiter for a new command-line argument, allowing an attacker to inject arbitrary arguments and execute malicious commands on the system, such as renaming or moving files.


CVE-2026-41070: openvpn-auth-oauth2 returns FUNC_SUCCESS on client-deny, allowing unauthenticated VPN access Critical

Common Weakness Enumeration (CWE)
CWE-287 — Improper Authentication
CVSS Score
10.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N
Severity
critical
Published Date
May 08, 2026

Affected Packages

  • github.com/jkroepke/openvpn-auth-oauth2 (go) vulnerable: >= 1.26.3, < 1.27.3 patched in 1.27.3

Vulnerability Analysis

The vulnerability lies in the incorrect handling of authentication denial within the openvpn-auth-oauth2 plugin's experimental mode. The root cause was identified in the handleAuthUserPassVerify function located in lib/openvpn-auth-oauth2/openvpn/handle.go. When a client that does not support web authentication attempts to connect, the plugin's logic correctly determines that the client should be denied. However, instead of returning an error code to the OpenVPN server, it returned OPENVPN_PLUGIN_FUNC_SUCCESS. The OpenVPN server treats this success code as an approval for connection, thus bypassing the authentication mechanism entirely. The patch in commit 36f69a6c67c1054da7cbfa04ced3f0555127c8f2 rectifies this by changing the return value to OPENVPN_PLUGIN_FUNC_ERROR in the case of a client denial, ensuring that the OpenVPN server correctly terminates the connection attempt. This makes handleAuthUserPassVerify the direct location of the vulnerability.

Identified Vulnerable Functions

openvpn.PluginHandle.handleAuthUserPassVerify
lib/openvpn-auth-oauth2/openvpn/handle.go

The function handleAuthUserPassVerify incorrectly returned OPENVPN_PLUGIN_FUNC_SUCCESS when client authentication was denied for clients not supporting web authentication. The OpenVPN server interprets this status as a successful authentication, granting the client network access despite the intended denial. The fix changes the return value to OPENVPN_PLUGIN_FUNC_ERROR, ensuring the OpenVPN server correctly rejects the unauthenticated client.


CVE-2026-43898: SandboxJS has a sandbox escape via Function.caller leakage of internal call op 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
May 11, 2026

Affected Packages

  • @nyariv/sandboxjs (npm) vulnerable: <= 0.9.5 patched in 0.9.6

Vulnerability Analysis

The vulnerability allows a sandbox escape by accessing Function.caller on a sandboxed function. This leaks an internal callback that can be used to execute arbitrary code. The provided patch in commit 826865251232611ec94078bab5a18ec875dad4a5 directly addresses this issue. The analysis of the patch reveals that the file src/executor/ops/prop.ts was modified to prevent access to caller, callee, and arguments properties of a function. The change is within an anonymous function passed to addOps which is responsible for handling property access in the sandbox. The lack of this check in vulnerable versions is the root cause of the vulnerability. The other modified files in the commit are related to versioning and testing and do not contain vulnerable code.

Identified Vulnerable Functions

addOps
src/executor/ops/prop.ts

The vulnerability lies in the property access logic within an anonymous function passed to addOps in src/executor/ops/prop.ts. Before the patch, this function did not restrict access to the caller, callee, and arguments properties of functions within the sandbox. This allowed an attacker to leak a privileged internal callback (Function.caller) and use it to escape the sandbox and execute arbitrary code in the host environment. The patch introduces a check to throw an error when these properties are accessed, thus mitigating the vulnerability.


CVE-2026-44006: vm2: 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
May 13, 2026

Affected Packages

  • vm2 (npm) vulnerable: <= 3.10.5 patched in 3.11.0

Vulnerability Analysis

The vulnerability, identified as GHSA-qcp4-v2jj-fjx8, is a sandbox escape in vm2. The root cause is the ability to leak a BaseHandler proxy handler instance from the sandbox environment, primarily through util.inspect({showProxy:true}). Once leaked, the trap methods on this handler (e.g., getPrototypeOf, get, set) could be called directly with a forged target argument. These traps lacked validation to ensure that the target they were operating on was the legitimate, intended target of the proxy.

An attacker could exploit this by providing an arbitrary host object as the target. The PoC demonstrates this by using handler.getPrototypeOf to walk the prototype chain of host objects, eventually gaining access to the host's Function constructor and achieving remote code execution.

The patch addresses this by introducing a validateHandlerTarget function. This function is called at the entry point of every proxy trap within BaseHandler and its subclasses (ProtectedHandler, ReadOnlyHandler, ReadOnlyMockHandler). It maintains a WeakMap to pair each handler with its legitimate target at creation time. Any subsequent trap invocation with a mismatched or unregistered target results in an error, effectively closing the vulnerability. All the patched trap methods were vulnerable to this same fundamental flaw.

Identified Vulnerable Functions

BaseHandler.getPrototypeOf
lib/bridge.js

The vulnerability lies in the getPrototypeOf trap of BaseHandler. A leaked handler instance could be used to call this method with a forged target argument. This allows an attacker to traverse the prototype chain of arbitrary host objects, leading to a sandbox escape and remote code execution. The patch adds the validateHandlerTarget call to ensure the target matches the one associated with the handler.

BaseHandler.get
lib/bridge.js

This function, a proxy trap, was vulnerable because it did not validate the target argument. An attacker could leak a handler and call this trap with a forged target to read properties from arbitrary host objects, contributing to a sandbox escape.

BaseHandler.set
lib/bridge.js

This proxy trap was vulnerable as it lacked validation for the target argument. A leaked handler could be used to call this trap with a forged target, allowing an attacker to write properties to arbitrary host objects, leading to prototype pollution or other forms of sandbox escape.

BaseHandler.apply
lib/bridge.js

The apply trap was vulnerable due to the missing target validation. An attacker with a leaked handler could invoke this trap with a forged target, allowing them to execute host functions in an unintended context, which could be leveraged for sandbox escape.

BaseHandler.construct
lib/bridge.js

This constructor trap was vulnerable because it didn't validate the target. A leaked handler could be used to call this trap with a forged target, allowing an attacker to instantiate host objects, which is a primitive for sandbox escape.


CVE-2026-44523: Note Mark: JWT Secret Weakness allows Full Account Takeover via token forgery Critical

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

Affected Packages

  • github.com/enchant97/note-mark/backend (go) vulnerable: < 0.0.0-20260501152247-18b587758667 patched in 0.0.0-20260501152247-18b587758667

Vulnerability Analysis

The vulnerability exists because the application fails to enforce a minimum length on the JWT signing secret, allowing for weak secrets (less than 32 bytes for HS256) that are vulnerable to offline brute-force attacks. The analysis of the patch and source code identified a two-stage issue.

First, during application startup, the configuration is loaded. The function config.Base64Decoded.UnmarshalText decodes the JWT_SECRET from the environment but does not validate its length. This is orchestrated by config.AppConfig.ParseConfig, which, prior to the patch, lacked the logic to reject secrets shorter than 32 bytes.

Second, the weak secret is then used in core authentication routines. core.CreateAuthenticationToken uses the secret to sign new JWTs, and core.ParseAuthenticationToken uses it to verify incoming tokens. An attacker can capture a token created by the server, crack the weak secret offline, and then forge a new token for any user. The core.ParseAuthenticationToken function would then validate this forged token as legitimate, leading to a full account takeover.

The patch addresses the root cause by adding a validate:"gte=32" struct tag to the JWTSecret field in backend/config/config.go, which is enforced by the ParseConfig function. This ensures the application will not start with a weak secret.

Identified Vulnerable Functions

config.Base64Decoded.UnmarshalText
backend/config/utils.go

This function is responsible for decoding the base64-encoded JWT_SECRET. It does not perform any length validation, allowing a cryptographically weak secret to be loaded into the application's configuration. This is the entry point for the weak secret.

config.AppConfig.ParseConfig
backend/config/utils.go

This function orchestrates the loading of application configuration from environment variables. Prior to the patch, it did not enforce any length constraints on the JWTSecret, thereby failing to prevent weak secrets from being used.

core.CreateAuthenticationToken
backend/core/auth.go

This function signs a new JWT using the configured secret. If a weak secret is loaded due to the lack of validation, this function will generate tokens that an attacker can capture and use to perform an offline brute-force attack to recover the secret.

core.ParseAuthenticationToken
backend/core/auth.go

This function verifies incoming JWTs using the configured secret. During an attack, this function would be called to process a forged token. Because it uses the same weak secret for verification, it will accept the malicious token, granting the attacker unauthorized access.


CVE-2026-45087: Dalfox Server Mode Vulnerable to Unauthenticated Remote Code Execution via `found-action` 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
May 12, 2026

Affected Packages

  • github.com/hahwul/dalfox/v2 (go) vulnerable: <= 2.12.0 patched in 2.13.0

Vulnerability Analysis

The vulnerability lies in the Dalfox server's handling of scan options provided via the REST API. The postScanHandler function in pkg/server/server.go receives scan options from the user, including FoundAction and FoundActionShell. These options are intended for CLI use but were not disabled for the API. The unsanitized options are passed down to the scanning engine. When a vulnerability is found, the foundAction function in pkg/scanning/foundaction.go is triggered, which executes the command specified in the FoundAction and FoundActionShell options. This allows an unauthenticated attacker to achieve remote code execution on the machine running the Dalfox server. The patch mitigates this by introducing a sanitizeAPIScanOptions function that clears these dangerous options at the API boundary in postScanHandler.

Identified Vulnerable Functions

postScanHandler
pkg/server/server.go

This function handles the /scan endpoint and is the entry point for the vulnerability. It accepts a JSON payload with scan options. Before the patch, it did not sanitize the FoundAction and FoundActionShell options, allowing an attacker to specify a command to be executed.

foundAction
pkg/scanning/foundaction.go

This function is the sink for the vulnerability. It is called when a vulnerability is found during a scan. It takes the FoundAction and FoundActionShell options and uses them to execute a shell command. This is the function where the remote code execution occurs.


CVE-2026-7411: Eclipse BaSyx Java Server SDK vulnerable to Path Traversal 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
May 05, 2026

Affected Packages

  • org.eclipse.basyx:basyx.sdk (maven) vulnerable: < 2.0.0-milestone-10 patched in 2.0.0-milestone-10

Vulnerability Analysis

The vulnerability is a classic path traversal issue within the file upload functionality of the Eclipse BaSyx Java Server SDK. An unauthenticated attacker could craft a malicious 'fileName' parameter in a file upload request to write a file to an arbitrary location on the host filesystem. The root cause was twofold: first, at a high level in 'SubmodelFileOperations.setFileValue', the 'fileName' was not validated for traversal sequences. Second, at a lower level in 'InMemoryFileRepository.save', the file path was constructed by unsafely concatenating a directory path and the user-provided filename. The patch addresses both issues by adding explicit validation and safe path handling logic, throwing a 'SecurityException' upon detecting a traversal attempt. During exploitation, a profiler would show calls to these vulnerable functions, originating from the Submodel HTTP API endpoint that handles file uploads.

Identified Vulnerable Functions

org.eclipse.digitaltwin.basyx.submodelservice.backend.SubmodelFileOperations.setFileValue
basyx.submodelservice/basyx.submodelservice-backend/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/backend/SubmodelFileOperations.java

This function is responsible for setting the file value for a submodel element. It takes a 'fileName' as input, which is user-controllable. Before the patch, this 'fileName' was used to construct a unique file name without proper sanitization, allowing for path traversal attacks. The patch introduces the 'validateLogicalFileName' method to sanitize the 'fileName' and prevent traversal.

org.eclipse.digitaltwin.basyx.core.filerepository.InMemoryFileRepository.save
basyx.common/basyx.filerepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/core/filerepository/InMemoryFileRepository.java

This function saves a file to the in-memory file repository. It constructs the file path using the 'fileName' from the 'FileMetadata'. The original implementation in the private 'createFilePath' method was vulnerable to path traversal as it directly concatenated the temporary directory with the provided file name. The patch fixes this by normalizing the path and checking if it remains within the intended base directory.


CVE-2025-55449: AstrBot is vulnerable to RCE with hard-coded JWT signing keys Critical

CVSS Score
9.8
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Severity
critical
Published Date
May 08, 2026

Affected Packages

  • astrbot (pip) vulnerable: < 3.5.18 patched in 3.5.18

Vulnerability Analysis

The vulnerability stems from a hard-coded JWT signing key, WEBUI_SK, which was defined in astrbot/core/__init__.py. This static, publicly known key was used to both sign and verify authentication tokens. The function Auth.generate_jwt used this key to create tokens, while the DashboardServer.auth_middleware function used the same key to validate tokens for protected routes. An attacker could leverage this knowledge to generate their own valid token, bypassing authentication entirely. Once authenticated, they could access sensitive functionality, such as the plugin installation endpoint mentioned in the vulnerability description, to achieve remote code execution. The patch remediates this by removing the hard-coded key and implementing a system where a unique, random JWT secret is generated and stored in the application's configuration upon first run.

Identified Vulnerable Functions

Auth.generate_jwt
astrbot/dashboard/routes/auth.py

This function used a hard-coded secret ('WEBUI_SK') to sign JSON Web Tokens. An attacker with knowledge of this static key could forge valid authentication tokens to impersonate any user.

DashboardServer.auth_middleware
astrbot/dashboard/server.py

This middleware function verified JSON Web Tokens using a hard-coded secret ('WEBUI_SK'). This allowed an attacker to bypass authentication by providing a self-signed token using the known secret, leading to unauthorized access to protected endpoints and subsequent remote code execution.


CVE-2025-63704: query-parser-string is vulnerable to Prototype Pollution Critical

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

Affected Packages

  • query-string-parser (npm) vulnerable: = 1.0.0 patched in None

Vulnerability Analysis

The vulnerability exists in the query-string-parser package, version 1.0.0. The root cause is the lack of sanitization of keys parsed from the query string, which leads to a prototype pollution vulnerability. The analysis of the source code in index.js reveals two key functions involved in the vulnerability.

The queryStringToObject function is the main function that takes the raw query string as input. It splits the query string into key-value pairs and then calls the _fillValue function to construct a nested object. However, it does not validate the keys before passing them on.

The _fillValue function is a recursive function that builds the result object. It uses the keys from the query string to create or modify properties on the object. The vulnerability is triggered when a key is __proto__. In this case, the function modifies the Object.prototype instead of the intended object, retval. Any subsequent object creation in the application will inherit the polluted properties, which can lead to denial of service, remote code execution, or other security impacts.

Since there is no patch available for this vulnerability, any usage of query-string-parser@1.0.0 is considered vulnerable.

Identified Vulnerable Functions

_fillValue
index.js

This function recursively assigns properties to an object based on keys derived from the input query string. It does not sanitize the keys, allowing an attacker to use keys like 'proto' to access and modify the Object.prototype. The line obj[key] = value; and obj[key] || (obj[key] = {}); directly uses the user-provided key to set a property, which leads to prototype pollution if the key is 'proto'.

queryStringToObject
index.js

This function is the entry point for the vulnerability. It parses the query string and passes the extracted keys and values to the _fillValue function without any sanitization. An attacker can provide a malicious query string with __proto__ which is then processed by this function and passed to _fillValue, leading to prototype pollution.