概述
Express 是一个最小且灵活的 Node.js 网络应用程序框架,可为网络和移动应用程序提供一系列强大的功能。
在Express 3 响应对象中发现了开放重定向漏洞(CVE-2024-9266)。
根据OWASP 的定义,开放式重定向(也称为 URL 重定向)是一种输入验证漏洞,当应用程序接受用户控制的输入,指定指向可能是恶意的外部 URL 的链接时,就会出现这种漏洞。这种漏洞可用于完成网络钓鱼攻击或将受害者重定向到感染页面。
这影响到大于或等于 3.4.5 和小于 4.0.0 的 Express 版本。
详细信息
模块信息
- 产品:快递
- 受影响组件:快递
- Affected versions: >=3.4.5 <4.0.0
- Github 存储库: https://github.com/expressjs/express
- 发布包: https://www.npmjs.com/package/express
- 软件包管理器:npm
漏洞信息
在 Express 软件包中的response.js中发现此中严重性漏洞。
当出现以下情况时,Express响应对象中的location()方法容易受到开放重定向的影响:
- 请求路径以双斜线(//) 开头
AND - 重定向的相对路径以./开头,由用户控制的输入
和 - 位置标头由用户控制的输入设置
location()方法将提取路径//并使用 resolve()方法将其添加到相对 URL 前, resolve()方法将评估./并将其返回为 / ,因此位置重定向的结果 url 将变成类似"///example.com "的内容。在大多数浏览器中,这将被评估为等同于 `//example.com`,这是一个有效的方案-相对-特殊-url,并将以 "Location.//example.com "的形式在标头中发送 :///example.com",可将用户重定向到攻击者的网站。
复制步骤
- 在 Express 应用程序代码中,创建一个路径,将用户重定向到通过 URL 查询参数提供的位置。
app.get(['/'], function (req, res) {
const pageId = req.query.pageId;
if (pageId && pageId[0] == '.') {
res.status(301).location(pageId);
}
res.send('OK');
});
- 在浏览器中,访问 Express 应用程序路由,并进行如下查询:
http://localhost:3000//?pageId=./example.com
- 浏览器应重定向至https://example.com。使用 Chrome DevTools 检查浏览器的头信息也可以观察到结果。
概念验证
与上述代码类似的完整重现可在此处找到:
Express 3.x 开放式重定向重现
荣誉
- 马特维耶斯-马申科(寻找者)
缓解
Express 3 已达到生命周期终点,将不会收到任何解决此问题的更新。
受影响组件的用户应采用以下缓解措施之一:
- 迁移到新版本的 Express
- 打上自己的补丁
- 利用HeroDevs这样的商业支持合作伙伴提供 EOL 后的安全支持。
每当我们支持的开源软件修复了新的漏洞,我们就会发出警报。