Koa框架存在开放重定向漏洞:尾部双斜杠(//)绕过重定向逻辑
漏洞详情
摘要: 在Koa.js框架的后退重定向功能中发现了一个绕过漏洞。在某些情况下,攻击者可以操纵Referer头部,强制用户的浏览器导航到外部的、可能恶意的网站。这是因为实现错误地将某些特殊构造的URL视为安全的相对路径。利用此漏洞可能允许攻击者对受影响应用程序的用户执行钓鱼、社会工程或其他基于重定向的攻击。
该漏洞影响GitHub Advisory GHSA-jgmv-j7ww-jx2x中引用的代码(跟踪为CVE-2025-54420)。
详细信息:
修补后的代码尝试将以/开头的值视为安全的相对路径,仅对绝对URL执行源检查。然而,协议相对URL(以//host开头)也以/开头,因此匹配startsWith('/')分支。带有尾部双斜杠的协议相对引用(如//evil.com)被实现视为安全的相对路径,但浏览器将Location: //evil.com解释为重定向到https://evil.com(或基于上下文的http)。
这种差异允许攻击者提供Referer: //evil.com并触发外部重定向 - 绕过预期的同源保护。
概念验证(PoC): 受影响代码行:https://github.com/koajs/koa/blob/master/lib/response.js#L326
有问题的逻辑如下:
使用协议相对Referer的请求:
|
|
易受攻击的响应将包含:
|
|
浏览器接收到该Location头部将导航到https://haymiz.dev(或基于上下文的http),导致开放重定向到攻击者控制的主机:
建议/补丁:
不要将//host视为安全的相对路径。明确将协议相对值从任何相对路径分支中排除。
通过使用基础解析Referer(例如new URL(rawRef, ctx.href)),然后在允许重定向之前比较resolved.origin(方案+主机+端口)与ctx.origin(或ctx.host加上方案/端口)。
影响: 能够导致受害者访问特殊构造链接(或注入具有受控Referer的请求)的攻击者可以导致受害者被重定向到攻击者控制的域。这可用于钓鱼、社会工程或绕过某些依赖同源导航的保护规则。
参考
- GHSA-g8mr-fgfg-5qpc
- koajs/koa@769fd75
技术规格
包: npm koa
受影响版本:
-
= 3.0.1, < 3.0.3
-
= 2.16.2, < 2.16.3
修补版本:
- 3.0.3
- 2.16.3
严重程度: 中等
CVSS评分: 4.7/10
弱点: CWE-601 - URL重定向到不受信任的站点(‘开放重定向’)
CVE ID: CVE-2025-62595
GHSA ID: GHSA-g8mr-fgfg-5qpc
源代码: koajs/koa
报告者: haymizrachi