Vulnerability GHSA-2m6q-8v3h-jqww

Medium Risk
MEDIUM RISK
CVSS Score: 6.1
Score Range: 4.0–6.9
Medium severity vulnerabilities (CVSS 4.0–6.9). Important issues that meaningfully reduce security confidence.
7 days ago
October 08, 2026 at 10:09 PM UTC
AdonisJS: Unencoded route parameters can produce open redirects
1.2.4 - 8.2.2 and 9.0.0 - 9.2.0
1.2.4 - 8.2.2 and 9.0.0 - 9.2.0

Summary

AdonisJS: Unencoded route parameters can produce open redirects

Details

Route parameters are inserted into generated URLs without URI encoding.

When an application passes untrusted input to a route whose first path segment is dynamic, a value beginning with / can produce a scheme-relative URL. For example:

router.get('/:page', handler).as('pages.show')

response.redirect().toRoute('pages.show', {
  page: '/evil.example.com',
})

This generates the following redirect:

Location: //evil.example.com

Browsers interpret this value as an external URL and redirect the user to https://evil.example.com.

Details

The shared createURL() helper is used by route URL builders, including Router.makeUrl() and Response.redirect().toRoute().

Route parameter values were appended without encoding:

if (isDefined) {
  uriSegments.push(`${value}${token.end}`)
}

Wildcard parameters had the same behavior:

uriSegments.push(`${values.join('/')}${token.end}`)

The issue does not affect APIs that intentionally accept complete redirect URLs. Exploitation requires an application to pass attacker-controlled data as a route parameter and use the generated URL as a redirect destination.

Impact

An attacker may craft a link on a trusted application domain that redirects a victim to an attacker-controlled website.

This can facilitate phishing and may be chained with authentication or OAuth flows that rely on trusted redirect destinations.

Applications are affected when they:

  • define a route whose first path segment is dynamic; and
  • pass request-derived data to that segment when generating a redirect URL.

Patches

Route parameter values are now encoded using encodeURIComponent.

Wildcard values are encoded individually before being joined with /, preserving their intended segment separators:

if (isDefined) {
  uriSegments.push(`${encodeURIComponent(String(value))}${token.end}`)
}
uriSegments.push(
  `${values.map((value) => encodeURIComponent(String(value))).join('/')}${token.end}`
)

With the fix, /evil.example.com becomes:

/%2Fevil.example.com

Fixes targeting v6 and v7 have been published below.

Impacted packages

Timeline

Published
7 days ago
October 08, 2026 at 10:09 PM UTC
Fixed (8.2.3)
1 month ago
August 24, 2026 at 07:56 AM UTC
Fixed (9.3.0)
1 month ago
August 24, 2026 at 08:01 AM UTC
Last Modified
7 days ago
October 08, 2026 at 10:30 PM UTC