Dancer2 versions before 2.2.0 for Perl serve a layout as a page when an equivalent spelling of its path misses the guard in the AutoPage handler
Dancer2 versions before 2.2.0 for Perl serve a layout as a page when an equivalent spelling of its path misses the guard in the AutoPage handler. The handler compares the request path against the layout directory name as text, while the lookup that follows canonicalises it. A doubled slash, a dot segment, a percent-encoded slash, or a different capitalisation on a case-insensitive filesystem therefore misses the guard. The handler is off by default, enabled with auto_page. The layout wrapping every page is already public, so this discloses one of the application's other layouts.
- Products
- Not specified
- Affected versions
- Not specified
- Fixed versions
- Not specified
- CVEs
- CVE-2026-93709
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 4 Nov 2026, 23:45 UTC · Revision 1
Source evidence
Dancer2 versions before 2.2.0 for Perl serve a layout as a page when an equivalent spelling of its path misses the guard in the AutoPage handler
core-osv · Original sourcePublished 22 Sept 2026, 00:50 UTC
Dancer2 versions before 2.2.0 for Perl serve a layout as a page when an equivalent spelling of its path misses the guard in the AutoPage handler. The handler compares the request path against the layout directory name as text, while the lookup that follows canonicalises it. A doubled slash, a dot segment, a percent-encoded slash, or a different capitalisation on a case-insensitive filesystem therefore misses the guard. The handler is off by default, enabled with auto_page. The layout wrapping every page is already public, so this discloses one of the application's other layouts.
osv:CVE-2026-93709
Complete source record
{
"id": "1ecebf8cb0f7d37f69fc8ffdd590c0c9283da398f0c42b5675a7174f203514d6",
"url": "https://osv.dev/vulnerability/CVE-2026-93709",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Dancer2 versions before 2.2.0 for Perl serve a layout as a page when an equivalent spelling of its path misses the guard in the AutoPage handler",
"summary": "Dancer2 versions before 2.2.0 for Perl serve a layout as a page when an equivalent spelling of its path misses the guard in the AutoPage handler. The handler compares the request path against the layout directory name as text, while the lookup that follows canonicalises it. A doubled slash, a dot segment, a percent-encoded slash, or a different capitalisation on a case-insensitive filesystem therefore misses the guard. The handler is off by default, enabled with auto_page. The layout wrapping every page is already public, so this discloses one of the application's other layouts.",
"evidence": "osv:CVE-2026-93709",
"products": [],
"severity": "medium",
"structured": {
"id": "CVE-2026-93709",
"aliases": [
"CVE-2026-93709"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N"
}
],
"affected": [
{
"ranges": [
{
"repo": "https://github.com/perldancer/dancer2",
"type": "GIT",
"events": [
{
"introduced": "0"
},
{
"fixed": "9931faa20d48fbd017c500a88f9236a1276c0ea9"
},
{
"fixed": "293fce08812b0928f34ab2d7b9357450707c3630"
},
{
"fixed": "753b385350a54acb8d4b686723890205268634a8"
}
],
"database_specific": {
"extracted_events": [
{
"range": [
{
"introduced": "0"
},
{
"fixed": "2.2.0"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StandardRange"
},
{
"range": [
{
"fixed": "293fce08812b0928f34ab2d7b9357450707c3630"
}
],
"source": "REFERENCES_COMMIT"
},
{
"range": [
{
"fixed": "753b385350a54acb8d4b686723890205268634a8"
}
],
"source": "REFERENCES_COMMIT"
}
]
}
}
],
"versions": [
"v2.1.0",
"v2.0.1",
"v2.0.0",
"v1.1.2",
"v1.1.1",
"v1.1.0",
"v1.0.0",
"v0.400001",
"v0.301004",
"v0.301003",
"v0.301002",
"v0.301001",
"v0.301000",
"v0.300005",
"v0.300004",
"v0.300003",
"v0.300002",
"v0.300001",
"v0.300000",
"v0.208002",
"v0.208001",
"v0.208000",
"v0.207000",
"v0.206000",
"v0.206000_02",
"v0.205002",
"v0.205001",
"v0.205000",
"v0.204004",
"v0.204003",
"v0.204002",
"v0.204001",
"v0.204000",
"v0.203001",
"v0.203000",
"v0.202000",
"v0.201000",
"v0.200004",
"v0.200003",
"v0.200002",
"v0.200001",
"v0.200000",
"v0.166001_04",
"v0.166001_03",
"v0.166001_02",
"v0.166001_01",
"v0.166001",
"v0.166000",
"v0.165000",
"v0.164000",
"v0.163000",
"v0.162000_01",
"v0.162000",
"v0.161000_01",
"v0.161000",
"v0.160003",
"v0.160002",
"v0.160000",
"v0.159003",
"v0.159002",
"v0.159001",
"v0.159000",
"v0.158000",
"v0.157001",
"v0.157000",
"v0.156001",
"v0.156000",
"v0.155004",
"v0.155003",
"v0.155002",
"v0.155001",
"v0.155000",
"v0.154000",
"v0.153002",
"v0.153001",
"v0.153000",
"v0.152000",
"v0.151000",
"v0.150000",
"v0.149000_02",
"v0.149000_01",
"v0.143000",
"v0.142000",
"v0.141000",
"v0.140900_01",
"v0.140001",
"v0.140000",
"v0.13",
"v0.12",
"v0.11",
"v0.10",
"v0.09",
"v0.08",
"v0.06",
"v0.04",
"v0.03",
"v0.02",
"v2.0000_01",
"v1.9999_02",
"v1.9999_01"
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-93709.json"
}
}
],
"modified": "2026-10-28T02:30:40.698680670Z",
"provider": "osv",
"references": [
"https://cpan.org/modules",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/93xxx/CVE-2026-93709.json",
"https://metacpan.org/release/CROMEDOME/Dancer2-2.2.0/changes",
"https://nvd.nist.gov/vuln/detail/CVE-2026-93709",
"https://github.com/PerlDancer/Dancer2/issues/1823",
"https://github.com/PerlDancer/Dancer2/commit/293fce08812b0928f34ab2d7b9357450707c3630.patch",
"https://github.com/PerlDancer/Dancer2/commit/753b385350a54acb8d4b686723890205268634a8.patch",
"https://github.com/PerlDancer/Dancer2"
],
"provider_metadata": {
"cwe_ids": [
"CWE-41"
],
"cna_assigner": "CPANSec",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/93xxx/CVE-2026-93709.json"
}
},
"related_cves": [
{
"value": "CVE-2026-93709",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 508114,
"published_at": "2026-09-22T00:50:45.117+00:00"
}