Koa框架存在开放重定向漏洞:尾部双斜杠(//)绕过重定向逻辑

Koa.js框架在处理重定向逻辑时存在安全漏洞,攻击者可通过构造特殊格式的Referer头部实现开放重定向,可能导致钓鱼攻击和社会工程攻击,影响版本包括2.16.2-2.16.2和3.0.1-3.0.2。

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的请求:

1
curl -i -H "Referer: //haymiz.dev" http://127.0.0.1:3000/test

易受攻击的响应将包含:

1
2
HTTP/1.1 302 Found
Location: //haymiz.dev

浏览器接收到该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

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计