|
| 1 | +--- |
| 2 | +layout: advisory |
| 3 | +title: 'CVE-2026-25500 (rack): Stored XSS in Rack::Directory via javascript: filenames |
| 4 | + rendered into anchor href' |
| 5 | +comments: false |
| 6 | +categories: |
| 7 | +- rack |
| 8 | +advisory: |
| 9 | + gem: rack |
| 10 | + cve: 2026-25500 |
| 11 | + ghsa: whrj-4476-wvmp |
| 12 | + url: https://github.com/rack/rack/security/advisories/GHSA-whrj-4476-wvmp |
| 13 | + title: 'Stored XSS in Rack::Directory via javascript: filenames rendered into anchor |
| 14 | + href' |
| 15 | + date: 2026-02-17 |
| 16 | + description: |- |
| 17 | + ## Summary |
| 18 | +
|
| 19 | + `Rack::Directory` generates an HTML directory index where each file entry is rendered as a clickable link. If a file exists on disk whose basename begins with the `javascript:` scheme (e.g. `javascript:alert(1)`), the generated index includes an anchor whose `href` attribute is exactly `javascript:alert(1)`. Clicking this entry executes arbitrary JavaScript in the context of the hosting application. |
| 20 | +
|
| 21 | + This results in a client-side XSS condition in directory listings generated by `Rack::Directory`. |
| 22 | +
|
| 23 | + ## Details |
| 24 | +
|
| 25 | + `Rack::Directory` renders directory entries using an HTML row template similar to: |
| 26 | +
|
| 27 | + ```html |
| 28 | + <a href='%s'>%s</a> |
| 29 | + ``` |
| 30 | +
|
| 31 | + The `%s` placeholder is populated directly with the file’s basename. If the basename begins with `javascript:`, the resulting HTML contains an executable JavaScript URL: |
| 32 | +
|
| 33 | + ```html |
| 34 | + <a href='javascript:alert(1)'>javascript:alert(1)</a> |
| 35 | + ``` |
| 36 | +
|
| 37 | + Because the value is inserted directly into the `href` attribute without scheme validation or normalization, browsers interpret it as a JavaScript URI. When a user clicks the link, the JavaScript executes in the origin of the Rack application. |
| 38 | +
|
| 39 | + ## Impact |
| 40 | +
|
| 41 | + If `Rack::Directory` is used to expose filesystem contents over HTTP, an attacker who can create or upload files within that directory may introduce a malicious filename beginning with `javascript:`. |
| 42 | +
|
| 43 | + When a user visits the directory listing and clicks the entry, arbitrary JavaScript executes in the application's origin. Exploitation requires user interaction (clicking the malicious entry). |
| 44 | +
|
| 45 | + ## Mitigation |
| 46 | +
|
| 47 | + * Update to a patched version of Rack in which `Rack::Directory` prefixes generated anchors with a relative path indicator (e.g. `./filename`). |
| 48 | + * Avoid exposing user-controlled directories via `Rack::Directory`. |
| 49 | + * Apply a strict Content Security Policy (CSP) to reduce impact of potential client-side execution issues. |
| 50 | + * Where feasible, restrict or sanitize uploaded filenames to disallow dangerous URI scheme prefixes. |
| 51 | + cvss_v3: 5.4 |
| 52 | + patched_versions: |
| 53 | + - "~> 2.2.22" |
| 54 | + - "~> 3.1.20" |
| 55 | + - ">= 3.2.5" |
| 56 | + related: |
| 57 | + url: |
| 58 | + - https://github.com/rack/rack/security/advisories/GHSA-whrj-4476-wvmp |
| 59 | + - https://github.com/rack/rack/commit/f2f225f297b99fbee3d9f51255d41f601fc40aff |
| 60 | + - https://github.com/advisories/GHSA-whrj-4476-wvmp |
| 61 | +--- |
0 commit comments