Skip to content

Expr has Denial of Service via Unbounded Recursion in Builtin Functions

High severity GitHub Reviewed Published Dec 16, 2025 in expr-lang/expr • Updated Dec 16, 2025

Package

gomod github.com/expr-lang/expr (Go)

Affected versions

< 1.17.7

Patched versions

1.17.7

Description

Several builtin functions in Expr, including flatten, min, max, mean, and median, perform
recursive traversal over user-provided data structures without enforcing a maximum recursion depth.

If the evaluation environment contains deeply nested or cyclic data structures, these functions may recurse
indefinitely until exceed the Go runtime stack limit. This results in a stack overflow panic, causing the host
application to crash.

While exploitability depends on whether an attacker can influence or inject cyclic or pathologically deep data into the
evaluation environment, this behavior represents a denial-of-service (DoS) risk and affects overall library robustness.
Instead of returning a recoverable evaluation error, the process may terminate unexpectedly.

Impact

In affected versions, evaluation of expressions that invoke certain builtin functions on untrusted or insufficiently
validated data structures can lead to a process-level crash due to stack exhaustion.

This issue is most relevant in scenarios where:

  • Expr is used to evaluate expressions against externally supplied or dynamically constructed environments.
  • Cyclic references (directly or indirectly) can be introduced into arrays, maps, or structs.
  • There are no application-level safeguards preventing deeply nested input data.

In typical use cases with controlled, acyclic data, the issue may not manifest. However, when present, the resulting
panic can be used to reliably crash the application, constituting a denial of service.

Patches

The issue has been fixed in the v1.17.7 versions of Expr.

The patch introduces a maximum recursion depth limit for affected builtin functions. When this limit is exceeded,
evaluation aborts gracefully and returns a descriptive error instead of panicking.

Additionally, the maximum depth can be customized by users via builtin.MaxDepth, allowing applications with legitimate
deep structures to raise the limit in a controlled manner.

Users are strongly encouraged to upgrade to the patched release, which includes both the recursion guard and
comprehensive test coverage to prevent regressions.

Workarounds

For users who cannot immediately upgrade, the following mitigations are recommended:

  • Ensure that evaluation environments cannot contain cyclic references.
  • Validate or sanitize externally supplied data structures before passing them to Expr.
  • Wrap expression evaluation with panic recovery to prevent a full process crash (as a last-resort defensive measure).

These workarounds reduce risk but do not fully eliminate the issue without the patch.

References

@antonmedv antonmedv published to expr-lang/expr Dec 16, 2025
Published by the National Vulnerability Database Dec 16, 2025
Published to the GitHub Advisory Database Dec 16, 2025
Reviewed Dec 16, 2025
Last updated Dec 16, 2025

Severity

High

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v3 base metrics

Attack vector
Network
Attack complexity
Low
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

CVSS v3 base metrics

Attack vector: More severe the more the remote (logically and physically) an attacker can be in order to exploit the vulnerability.
Attack complexity: More severe for the least complex attacks.
Privileges required: More severe if no privileges are required.
User interaction: More severe when no user interaction is required.
Scope: More severe when a scope change occurs, e.g. one vulnerable component impacts resources in components beyond its security scope.
Confidentiality: More severe when loss of data confidentiality is highest, measuring the level of data access available to an unauthorized user.
Integrity: More severe when loss of data integrity is the highest, measuring the consequence of data modification possible by an unauthorized user.
Availability: More severe when the loss of impacted component availability is highest.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

EPSS score

Weaknesses

Allocation of Resources Without Limits or Throttling

The product allocates a reusable resource or group of resources on behalf of an actor without imposing any intended restrictions on the size or number of resources that can be allocated. Learn more on MITRE.

CVE ID

CVE-2025-68156

GHSA ID

GHSA-cfpf-hrx2-8rv6

Source code

Credits

Loading Checking history
See something to contribute? Suggest improvements for this vulnerability.