我们已发布 Nuxt 4.5.1 和 Nuxt 3.21.10,它们是 4.x 和 3.x 发布线的安全补丁版本。我们建议现在就升级:
npx nuxt upgrade --dedupe
刷新你的锁文件还会拉取 @nuxt/devtools@3.3.1,它修复了一个独立的、仅在开发环境中存在的关键问题,所以请确保它也被更新。
🔍 修复了什么
下面链接的安全公告包含完整详情。简要说明如下,并附上你是否可能受到影响的说明:
通过 server island props 导致的服务端远程代码执行(高)
只有在你启用了 vue.runtimeCompiler(默认关闭),并且使用了服务端组件或 islands,且这些 props 能够到达 Vue 的动态组件解析时,你才会受到影响:<component :is>、resolveDynamicComponent、h(),或者多态的 as / asChild prop,例如 @nuxt/ui 通过 reka-ui 暴露的那种。在这种配置下,攻击者可以向 island props 注入一个 template 键,并让 Vue 的运行时编译器在服务端(Nitro)进程中执行任意代码。由于 vue.runtimeCompiler 默认关闭,大多数应用不会受到影响,但在满足前置条件时,影响就是完整的服务端远程代码执行。
通过 server island props 未授权实例化组件(中)
这与上面的问题密切相关,但不需要 vue.runtimeCompiler,因此影响范围更广。如果某个服务端 island 将一个未声明的 prop 传递给多态的 as 根节点(同样是 @nuxt/ui / reka-ui 模式,也包括通过 Vue 的属性透传隐式发生的情况),攻击者就可以传入一个普通字符串,例如 { "as": "iframe" },或者一个全局注册组件的名称,从而实例化任意 HTML 元素或组件。它不能导致代码执行。声明 island 接受的 props,或者在其上设置 inheritAttrs: false,也可以防止这个问题。
路由规则授权绕过(高)
如果你依赖带有 appMiddleware 的 routeRules 作为授权门禁,并且任何规则键包含大写字符,就会受到影响;无论这些键是来自 pages/Admin.vue 之类的页面文件,还是显式写成 routeRules: { '/Admin': ... }。区分大小写的路由(默认行为)会正常提供页面,但该规则及其 middleware 会被静默跳过。上面提到的就是这个回归问题。
现在路由规则会像 vue-router 默认行为一样,忽略大小写进行匹配。如果你有意依赖大小写敏感的路由规则匹配,请设置 router.options.sensitive: true。
服务端组件拒绝服务(高)
GHSA-hxcr-hm88-mpq6 和 GHSA-9pgf-384g-p7mv
如果你的应用使用了服务端组件或 islands(/__nuxt_island 端点),你就会受到影响。未认证请求可以通过对某个 prop 展开 v-for 来崩溃服务器,或者在请求体被拒绝之前,先消耗 CPU 去解析和哈希一个过大的请求体。
缓存页面上的跨用户 payload 泄露(高)
GHSA-wm8w-6qjm-cv43,仅 4.x 受影响(>= 4.4.0;3.x 分支不受影响)
如果你在会渲染用户特定数据的已认证页面上使用 cache、swr 或 isr 路由规则,就会受到影响。即使 HTML 已经正确区分了不同用户,缓存的 _payload.json 仍可能被提供给其他用户或未认证访客。
_payload.json 的 CDN 或边缘缓存。错误的响应可能已经被缓存在上游,仅升级并不会将其驱逐。开发服务器路径泄露(低)
只有在你将开发服务器绑定到网络接口(nuxi dev --host),并且运行在不受信任的网络上时,你才会受到影响。Chrome DevTools workspace 端点会向局域网客户端泄露项目的绝对路径和一个 workspace UUID。
Nuxt DevTools 远程代码执行(严重,仅开发环境)
GHSA-279x-mwfv-vcqv,已在 @nuxt/devtools@3.3.1 中修复
如果你在启用 DevTools 的情况下运行 nuxt dev,就会受到影响。一个通过 Vite HMR socket 暴露的未认证 RPC 方法,可能在你的机器上执行任意命令;该命令可由主机上的其他进程、使用 --host 时的局域网同伴,或者在开发服务器运行期间你访问的恶意网站触发。这不会影响生产环境,但请确保你的 lockfile 已获取到新版本。
💚 感谢
非常感谢这些负责任地报告这些问题的研究人员:Pig-Tail、sec-reex、DavidCarliez、manop55555、dinhvaren、quantumshiro、Saku0512 和 TazmiDev。
这些报告是通过 GitHub 的私密安全通告流程提交的,其中一项是通过 HackerOne 上的 Vercel OSS Bug Bounty program 送达我们的。对于服务器端远程代码执行问题,我们还与 Vercel、Netlify 和 Cloudflare 的团队进行了合作,提前发出通知,以便他们能在这次披露之前部署防护措施。
如果你认为自己在 Nuxt 中发现了漏洞,请通过相关仓库的 Security tab 私下报告,或者在无法这样做的情况下发送电子邮件至 security@nuxtjs.org。我们非常感谢负责任的披露。