Koa.js 尾部双斜杠开放重定向漏洞解析

本文详细分析了Koa.js框架中因尾部双斜杠处理不当导致的开放重定向漏洞(CVE-2025-62595),包括漏洞原理、影响版本、攻击向量和修复方案,帮助开发者理解并防范此类安全风险。

Koa 因尾部双斜杠(//)在重定向逻辑中存在开放重定向漏洞

漏洞详情

包管理器: npm
包名称: koa
受影响版本:

  • = 3.0.1, < 3.0.3

  • = 2.16.2, < 2.16.3

已修复版本:

  • 3.0.3
  • 2.16.3

漏洞描述

摘要: 在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视为安全的相对路径。明确将协议相对值从任何相对路径分支中排除。 通过使用基础URL解析Referer(例如new URL(rawRef, ctx.href)),然后在允许重定向之前比较resolved.origin(方案+主机+端口)与ctx.origin(或ctx.host加上方案/端口)。

影响

能够诱使受害者访问特殊构造链接(或注入具有受控Referer的请求)的攻击者可以导致受害者被重定向到攻击者控制的域。这可用于网络钓鱼、社会工程或绕过某些依赖同源导航的保护规则。

参考

  • GHSA-g8mr-fgfg-5qpc
  • koajs/koa@769fd75

安全评分

严重程度: 中等
CVSS总体评分: 4.7/10

CVSS v3基础指标:

  • 攻击向量: 网络
  • 攻击复杂度: 低
  • 所需权限: 无
  • 用户交互: 需要
  • 范围: 已更改
  • 机密性: 无
  • 完整性: 低
  • 可用性: 无

弱点类型: CWE-601 - URL重定向到不受信任的站点(‘开放重定向’)

CVE ID: CVE-2025-62595
GHSA ID: GHSA-g8mr-fgfg-5qpc

源代码: koajs/koa

致谢: haymizrachi(报告者)

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