Axios,作为广泛应用于前端开发中的一个流行的HTTP客户端库,因其简洁的API和承诺(promise)基础的异步处理方式,而得到了众多开发者的青睐。然而,近期在安全社区中,Axios被报告存在一个重要漏洞,该漏洞涉及其对跨站请求伪造(CSRF)保护机制的处理。
描述
在 Axios 1.5.1中发现的一个问题无意中泄露了存储在cookie中的机密 XSRF-TOKEN,方法是将其包含在向任何主机发出的每个请求的 HTTP 标头 X-XSRF-TOKEN 中,从而允许攻击者查看敏感信息。当XSRF-TOKEN cookie可用且withCredentials设置已启用时,该库会在对任何服务器的所有请求中使用秘密的XSRF-TOKEN cookie值插入X-XSRF-TOKEN头。如果恶意用户设法获取这个值,它可能会导致绕过XSRF防御机制。
NVD发布日期:2023-11-08
CVE字典条目:CVE-2023-45857
漏洞类型:CWE-359 将私人信息暴露给未经授权的行为者
严重性:高
影响度:广泛
什么是CWE0359
详细可以查看官网介绍:
https://cwe.mitre.org/data/definitions/359.html
CWE-359:将私人个人信息暴露给未经授权的行为者,是 Common Weakness Enumeration(共同弱点枚举)中的一个条目,代表 "Exposure of Private Information ('Privacy Violation')",即 "暴露私人信息(隐私违规)"。这个弱点描述了一个安全问题,其中应用程序未能充分保护用户的敏感数据,导致未经授权的第三方可以访问或泄露这些信息。
在CWE-359的情景下,可能发生的是:
- 应用程序可能会在没有适当加密的情况下传输敏感信息。
- 存储敏感信息的数据库可能未能正确配置访问控制,导致未授权访问。
- 应用程序日志可能会记录敏感信息,如果没有得到适当保护,可能会被泄露。
- 错误消息或页面上可能会显示敏感信息,没有经过适当处理,导致在用户界面上泄露。
CWE-359 违反了用户隐私权,可以导致个人数据泄露,这对个人和组织都可能产生严重后果。为了避免此类弱点,开发者和组织应实施严格的数据处理和存储政策,定期进行安全审计,并确保使用最佳实践来保护个人数据。对于开发人员而言,理解CWE-359并采取预防措施对于创建安全软件来说至关重要。
什么是CSRF、XSRF
跨站请求伪造(CSRF)是一种网络攻击,它允许攻击者利用用户的登录状态在另一个网站上对目标应用程序发起恶意请求。这种攻击的危险之处在于,它可以在用户毫不知情的情况下,以用户的身份在目标网站上进行操作,例如更改密码、转账等。
XSRF-TOKEN
是一种常用的防御措施,它涉及到在客户端生成一个令牌(Token),这个令牌会在进行敏感操作时由服务器进行验证。该令牌通常在用户打开表单时由服务器生成,并作为表单数据的一部分发送回服务器。服务器将验证提交的表单中的XSRF-TOKEN
是否与用户的会话中存储的令牌相匹配,以确认请求是合法的。
漏洞出现的情况可以是:
- 「服务器配置不当」:如果服务器没有正确设置或验证
XSRF-TOKEN
,那么即使在客户端设置了令牌,攻击者也可能绕过这种保护机制。例如,如果服务器不验证所有敏感请求的令牌,或者验证逻辑存在缺陷,那么攻击者可以发送未经授权的请求。 - 「客户端实现错误」:客户端代码,比如JavaScript或Web框架,可能没有正确地在每个请求中发送
XSRF-TOKEN
,或者在处理cookies时出现错误,导致令牌不被包含在请求中。 - 「安全策略缺失」:如果网站不使用
XSRF-TOKEN
或类似的防御机制,或者没有将其纳入全面的安全策略中,就可能容易受到CSRF攻击。
查看相关文章:
https://portswigger.net/web-security/csrf/preventinghttps://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html
为了保护应用程序不受CSRF攻击,你应该:
- 为所有敏感操作使用CSRF令牌。
- 确保服务器端对所有需要的地方进行令牌验证。
- 设置和强制执行内容安全策略(Content Security Policy,CSP)以减少跨站脚本(XSS)攻击的风险,XSS攻击可以用来窃取
XSRF-TOKEN
。 - 确保使用HTTPS来防止中间人攻击,中间人攻击可能会截取令牌。
- 定期更新和修补所有软件依赖项,包括客户端库和服务器端框架。
再现
复现步骤
通过运行以下命令使用Next.js的最新版本开始一个新项目:npx create-next-app@latest。然后,使用这个命令安装最新版本的Axios库:npm i axios 创建一个Axios实例,配置如下,启用跨站点请求伪造(CSRF)保护,通过在请求中包括凭据:
const instance = axios.create({
withCredentials: true,
});
用特定属性安装XSRF-TOKEN cookie。将cookie值设置为"whatever",并为"localhost"域配置严格的同站策略:
const cookies = new Cookies();
cookies.set("XSRF-TOKEN", "whatever", {
domain: "localhost",
sameSite: "strict",
});
使用你的Axios实例发起跨域请求。在这个例子中,我们向"https://www.com/"发出GET请求,并处理响应及潜在错误:
instance
.get("https://www.com")
.then((res) => console.log(res.data))
.catch((err) => console.error(err.message));
运行你的项目,并打开浏览器的网络标签进行调试和监控网络活动。验证对"https://www.com/"的跨域请求是否包含值为"whatever"的"X-XSRF-TOKEN"头。确认在使用Axios实例发送请求时,"XSRF-TOKEN" cookie的值会泄露给任何第三方主机。这对于安全至关重要,因为你不希望将CSRF令牌泄漏给未授权的实体。代码片段 lib/adapters/xhr.js:191
const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))
预期行为
预期结果:XSRF-TOKEN不会泄露给第三方主机
实际结果:XSRF-TOKEN在每个使用Axios实例发出的请求中泄露
Axios 版本 [v0.8.1] - [v1.5.1]
参考资料:
[1]https://portswigger.net/web-security/csrf/preventing
[2]https://github.com/axios/axios/issues/6006
[3]https://nvd.nist.gov/vuln/detail/CVE-2023-45857
[4]https://cwe.mitre.org/data/definitions/359.html
希里安
2023-11-14
●这些K8s基础术语词汇你知道吗?
●Linux中如何批量删除和定时备份?
●async/await和promise链区别?
●三分钟启动next.js项目
●三分钟快速入门开源世界!
●python如何调用chatgpt接口?
●springboot+vue3快速启动应用