/

CVE-2026-25947

Severity:

HIGH RISK

(8.8)

SQL Injection in Worklenz Project and Task Management

CVE-2026-25947

Analyzed

Vulnerability type

Category:

SQL Injection

CWE:

CWE-89

Impact:

Arbitrary SQL Query Execution and Data Compromise

Severity:

HIGH RISK

(8.8)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

Multiple SQL injection flaws in the Worklenz backend allow untrusted input to be incorporated directly into database queries across project/task management, reporting, finance, and real-time collaboration features.

When attackers can control parameters reaching these query builders, they may execute arbitrary SQL, exposing or modifying sensitive project, resource, and financial data, and potentially impacting application integrity and availability.

Multiple SQL injection flaws in the Worklenz backend allow untrusted input to be incorporated directly into database queries across project/task management, reporting, finance, and real-time collaboration features.

When attackers can control parameters reaching these query builders, they may execute arbitrary SQL, exposing or modifying sensitive project, resource, and financial data, and potentially impacting application integrity and availability.

Affected context

The vulnerability occurs in Worklenz server-side components that dynamically build SQL queries for:

  • Project and task management controllers
  • Reporting and financial data endpoints
  • Real-time socket.io handlers
  • Resource allocation and scheduling logic

It is relevant in deployments where attacker-controlled or user-supplied input (such as filters, sort parameters, identifiers, or search terms) is used to construct SQL statements without strict parameterization, allowing crafted input to alter query structure.

The vulnerability occurs in Worklenz server-side components that dynamically build SQL queries for:

  • Project and task management controllers
  • Reporting and financial data endpoints
  • Real-time socket.io handlers
  • Resource allocation and scheduling logic

It is relevant in deployments where attacker-controlled or user-supplied input (such as filters, sort parameters, identifiers, or search terms) is used to construct SQL statements without strict parameterization, allowing crafted input to alter query structure.

Exploit preconditions

  • Attack surface: HTTP(S) APIs and WebSocket/socket.io endpoints exposed by the Worklenz backend.
  • Required access: Ability to send crafted requests to affected endpoints (e.g., valid or limited user account, or in some cases unauthenticated access depending on deployment configuration).
  • Trigger point: Parameters used for filtering, sorting, searching, or selecting entities that are interpolated into SQL strings (e.g., project IDs, task fields, date ranges, reporting parameters).
  • Why exploitation is possible: The backend constructs SQL statements by concatenating or interpolating raw input into query strings rather than using strongly typed, parameterized queries or vetted ORM primitives, allowing injected SQL syntax to change the intended command.
  • Attack surface: HTTP(S) APIs and WebSocket/socket.io endpoints exposed by the Worklenz backend.
  • Required access: Ability to send crafted requests to affected endpoints (e.g., valid or limited user account, or in some cases unauthenticated access depending on deployment configuration).
  • Trigger point: Parameters used for filtering, sorting, searching, or selecting entities that are interpolated into SQL strings (e.g., project IDs, task fields, date ranges, reporting parameters).
  • Why exploitation is possible: The backend constructs SQL statements by concatenating or interpolating raw input into query strings rather than using strongly typed, parameterized queries or vetted ORM primitives, allowing injected SQL syntax to change the intended command.

Why this happens

The core issue maps to CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection').

In affected Worklenz components, the backend appears to:

  • Accept user-controllable input for operations such as listing projects, aggregating financial data, reporting, or managing resource calendars.
  • Embed that input directly into SQL commands (or into fragments of WHERE/ORDER BY clauses) without reliable neutralization or parameter binding.

This pattern treats untrusted data as part of the SQL instruction stream rather than as data, enabling attackers to inject additional clauses or statements (e.g., UNIONs, Boolean conditions, or data modification commands). Because it touches multiple controllers and real-time handlers, the injection points may be spread across several code paths that share similar dynamic query builders or helper utilities.

The core issue maps to CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection').

In affected Worklenz components, the backend appears to:

  • Accept user-controllable input for operations such as listing projects, aggregating financial data, reporting, or managing resource calendars.
  • Embed that input directly into SQL commands (or into fragments of WHERE/ORDER BY clauses) without reliable neutralization or parameter binding.

This pattern treats untrusted data as part of the SQL instruction stream rather than as data, enabling attackers to inject additional clauses or statements (e.g., UNIONs, Boolean conditions, or data modification commands). Because it touches multiple controllers and real-time handlers, the injection points may be spread across several code paths that share similar dynamic query builders or helper utilities.

Potential impact

  • Access to sensitive project data, including task descriptions, attachments metadata, comments, and collaboration history.
  • Exposure or manipulation of financial and reporting data such as budgets, invoices, time logs, and cost summaries.
  • Unauthorized modification or deletion of records (projects, tasks, users, schedules, or resource assignments).
  • Circumvention of application-level authorization checks by directly querying or updating protected tables.
  • Potential pivot into underlying database features (e.g., loading server-side files or functions) depending on database configuration and privileges.
  • Degradation of service or full outage through destructive queries or expensive, unbounded queries causing performance issues.
  • Access to sensitive project data, including task descriptions, attachments metadata, comments, and collaboration history.
  • Exposure or manipulation of financial and reporting data such as budgets, invoices, time logs, and cost summaries.
  • Unauthorized modification or deletion of records (projects, tasks, users, schedules, or resource assignments).
  • Circumvention of application-level authorization checks by directly querying or updating protected tables.
  • Potential pivot into underlying database features (e.g., loading server-side files or functions) depending on database configuration and privileges.
  • Degradation of service or full outage through destructive queries or expensive, unbounded queries causing performance issues.

General mitigation guidance

Effective mitigation focuses on systematically removing dynamic string-based SQL construction and constraining how input reaches the database:

  • Prefer parameterized queries or ORM query builders that clearly separate SQL structure from data, including for filters, sorting, and search conditions.
  • Implement allow-list based input handling for query-related parameters (e.g., allowed column names for ORDER BY, fixed sets of status values, constrained date/time ranges).
  • Centralize query construction in well-reviewed helper modules instead of scattering ad-hoc concatenation across controllers and socket handlers.
  • Apply least-privilege database accounts, ensuring the application's DB user only has the minimal permissions needed, reducing the blast radius of injection.
  • Normalize and validate all external inputs that can influence query shape, particularly for "advanced" features like reporting, analytics, and resource scheduling where dynamic filters are common.
  • Consider defense-in-depth controls such as query length limits, strict transaction usage, and monitoring for anomalous query patterns to further limit impact.

Effective mitigation focuses on systematically removing dynamic string-based SQL construction and constraining how input reaches the database:

  • Prefer parameterized queries or ORM query builders that clearly separate SQL structure from data, including for filters, sorting, and search conditions.
  • Implement allow-list based input handling for query-related parameters (e.g., allowed column names for ORDER BY, fixed sets of status values, constrained date/time ranges).
  • Centralize query construction in well-reviewed helper modules instead of scattering ad-hoc concatenation across controllers and socket handlers.
  • Apply least-privilege database accounts, ensuring the application's DB user only has the minimal permissions needed, reducing the blast radius of injection.
  • Normalize and validate all external inputs that can influence query shape, particularly for "advanced" features like reporting, analytics, and resource scheduling where dynamic filters are common.
  • Consider defense-in-depth controls such as query length limits, strict transaction usage, and monitoring for anomalous query patterns to further limit impact.

How teams detect issues like this

Detection typically combines static analysis, code review, and runtime monitoring:

  • Static analysis: Use SAST tools or custom rules to flag direct string concatenation into SQL execution APIs, raw query methods, or ORM escape hatches across controllers, reporting modules, and socket handlers.
  • Code review: During reviews, look for patterns like:
  • Template literals or string concatenation used to build WHERE/ORDER BY clauses.
  • Conditional SQL fragments derived from request parameters.
  • Bypassing ORM parameterization in favor of "raw" queries for performance or flexibility.
  • Policy enforcement: Enforce coding standards that:
  • Require parameter binding for all query inputs.
  • Restrict usage of low-level query APIs to vetted helper functions.
  • Mandate input allow-lists for fields that affect query structure (such as sort keys).
  • Runtime monitoring: Analyze database logs or query audit trails for anomalous patterns such as unexpected UNIONs, tautological conditions (e.g., '1=1'), or high-risk functions appearing in queries coming from application traffic.

Detection typically combines static analysis, code review, and runtime monitoring:

  • Static analysis: Use SAST tools or custom rules to flag direct string concatenation into SQL execution APIs, raw query methods, or ORM escape hatches across controllers, reporting modules, and socket handlers.
  • Code review: During reviews, look for patterns like:
  • Template literals or string concatenation used to build WHERE/ORDER BY clauses.
  • Conditional SQL fragments derived from request parameters.
  • Bypassing ORM parameterization in favor of "raw" queries for performance or flexibility.
  • Policy enforcement: Enforce coding standards that:
  • Require parameter binding for all query inputs.
  • Restrict usage of low-level query APIs to vetted helper functions.
  • Mandate input allow-lists for fields that affect query structure (such as sort keys).
  • Runtime monitoring: Analyze database logs or query audit trails for anomalous patterns such as unexpected UNIONs, tautological conditions (e.g., '1=1'), or high-risk functions appearing in queries coming from application traffic.

Sources

SourceLink
github.comgithub.com/Worklenz/worklenz/commit/76e5cb0f5dd566fb65586cd3db30ee951c92a32b
github.comgithub.com/Worklenz/worklenz/releases/tag/v2.1.7
github.comgithub.com/Worklenz/worklenz/security/advisories/GHSA-f2f8-2ppj-85pf

Frequently asked

questions

Yes. As long as the affected HTTP or socket.io endpoints are reachable, an attacker can attempt to exploit SQL injection remotely by sending crafted requests, subject to any authentication or authorization barriers in place.

It depends on which endpoints are exposed and how access control is configured. Some injection points may be behind authenticated routes tied to regular user roles, while others could be reachable with minimal or no authentication. Any parameter that flows into the vulnerable queries is a potential vector.

Replace all dynamic, string-concatenated SQL with parameterized queries or ORM-based constructs. Enforce strict allow-lists for elements that affect query structure (columns, sort directions, filter operators), and centralize query-building logic in well-tested utilities to avoid ad-hoc patterns.

Adopt a standard secure query pattern across the codebase (parameterization by default), back it with automated checks (SAST rules, linters, and CI policies), and perform regular security-focused code reviews on any feature that manipulates database queries—especially reporting, analytics, and real-time data endpoints where complex filtering is common.

Yes. As long as the affected HTTP or socket.io endpoints are reachable, an attacker can attempt to exploit SQL injection remotely by sending crafted requests, subject to any authentication or authorization barriers in place.

It depends on which endpoints are exposed and how access control is configured. Some injection points may be behind authenticated routes tied to regular user roles, while others could be reachable with minimal or no authentication. Any parameter that flows into the vulnerable queries is a potential vector.

Replace all dynamic, string-concatenated SQL with parameterized queries or ORM-based constructs. Enforce strict allow-lists for elements that affect query structure (columns, sort directions, filter operators), and centralize query-building logic in well-tested utilities to avoid ad-hoc patterns.

Adopt a standard secure query pattern across the codebase (parameterization by default), back it with automated checks (SAST rules, linters, and CI policies), and perform regular security-focused code reviews on any feature that manipulates database queries—especially reporting, analytics, and real-time data endpoints where complex filtering is common.

Find out what's already
exploitable in your codebase.