🟠 高危 | CVE-2026-48795 — AdonisJS is a TypeScript-first web framework. From...
🟠 【深度分析】高危安全漏洞:CVE-2026-48795
CVSS 评分: 高危(8.6)🟠 状态: Deferred 发布时间: 2026-07-15
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-48795 |
| CVSS 评分 | 8.6 🟠 |
| 严重程度 | 高危 |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:H |
| CWE 分类 | CWE-1321 |
| 发布时间 | 2026-07-15 |
| 最后更新 | 2026-07-16 |
| 状态 | Deferred |
| 数据来源 | security-advisories@github.com |
好的,作为一名资深网络安全分析师,我将基于您提供的 NVD 原始数据,生成一篇专业的漏洞深度分析文章。
CVE-2026-48795:AdonisJS Bodyparser 原型污染漏洞深度分析
CVSS 评分:8.6(高危)
CVSS 向量:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:H
漏洞概述
CVE-2026-48795 是一个存在于 AdonisJS Web 框架 @adonisjs/bodyparser 组件中的**原型污染(Prototype Pollution)**漏洞。该漏洞源于对先前类似漏洞(CVE-2026-25754)的不完全修复,导致攻击者仍能通过精心构造的、包含嵌套字段的多部分(multipart)请求载荷,污染 JavaScript 的 Object.prototype。
当 Object.prototype 被污染后,可能会引发一系列严重的安全问题,包括但不限于:拒绝服务(DoS)、绕过安全校验、属性注入以及在特定情况下可能导致远程代码执行(RCE)。由于该漏洞可通过网络远程触发,无需身份验证,且攻击复杂度低,因此被评为 高危。
受影响组件与版本
- 受影响项目:
@adonisjs/bodyparser - 受影响框架版本:
- AdonisJS v10.x (从 10.1.3 开始至 10.1.5 之前的版本)
- AdonisJS v11.x (从开始至 11.0.3 之前的版本)
- 修复版本:
- AdonisJS v10.1.5 及更高版本
- AdonisJS v11.0.3 及更高版本
- 利用位置: 应用程序中所有解析
multipart/form-data类型请求的端点。
漏洞原理分析
该漏洞属于 CWE-1321: Improperly Controlled Modification of Object Prototype Attributes (‘Prototype Pollution’)。
漏洞成因:
AdonisJS 使用@poppinss/utils工具库中的lodash_.set()方法来处理嵌套的请求体数据。在接收到多部分表单数据时,@adonisjs/bodyparser会将表单字段名(如user.name)解析为一个路径,并使用_.set()方法将对应的值设置到目标对象中。不完整的修复:
前一个漏洞 CVE-2026-25754 被修复后,开发者可能阻止了诸如__proto__这种直接的、作为顶层键的污染,但并未考虑到 JavaScript 原型链污染的其他变体。例如,攻击者可以构造如下嵌套的字段名:user.__proto__.pollutedconstructor.prototype.polluted
利用过程:
当@adonisjs/bodyparser解析一个包含user.__proto__.polluted字段的 multipart 请求时,_.set()函数会执行以下操作:- Step 1: 创建目标对象
result = {}。 - Step 2: 解析路径
["user", "__proto__", "polluted"]。 - Step 3: 创建中间对象。当路径解析到
__proto__时,_.set()会创建一个普通的中间对象(如result.user = {}),并访问result.user.__proto__。 - Step 4: 关键点在于,
result.user.__proto__指向的是Object.prototype。因此,当_.set()继续执行设置polluted属性时,它实际上是在全局的Object.prototype上设置了一个名为polluted的属性。
类似地,
constructor.prototype.polluted路径通过result.user.constructor获取到Object构造函数,再访问其prototype属性,最终也指向了Object.prototype,从而达到相同的污染效果。- Step 1: 创建目标对象
影响评估
攻击复杂度:低 (AC:L)
- 攻击向量:网络 (AV:N) - 攻击者无需物理或本地网络访问,只需能够向目标服务器发送 HTTP 请求。
- 所需权限:无 (PR:N) - 漏洞利用不需要任何身份验证或用户会话。
- 用户交互:无 (UI:N) - 攻击无需诱骗用户点击链接或执行任何操作,完全由服务端解析逻辑触发。
- 影响范围:无变化 (S:U) - 漏洞影响的主体是同一个安全组件,而非其向外的子系统。
潜在后果:
- 高可用性影响 (A:H): 这是最直接的威胁。攻击者可以污染
Object.prototype,在其中注入一个toString、valueOf或其他广泛使用的属性。这会导致几乎所有对象在隐式转换时都抛出一个TypeError,或者返回一个导致无限循环的字符串,从而引发服务器进程崩溃或不可响应,实现 拒绝服务(DoS)。 - 低机密性影响 (C:L) 和 低完整性影响 (I:L): 原型污染也可能被用于绕过安全检查(例如,通过设置
admin: true到某个对象的原型上),或者在特定情况下(如配合模板引擎或代码生成器)被利用为远程代码执行,但这通常需要更复杂的条件。然而,仅仅 DoS 就足以使该漏洞的严重性达到高危级别。
修复建议
1. 立即升级(强烈推荐)
最直接、最有效的修复方案是立即将您的 AdonisJS 项目更新到包含修复的版本。
- 如果您使用的是 AdonisJS v10.x,请升级到 v10.1.5 或更高版本。
- 如果您使用的是 AdonisJS v11.x,请升级到 v11.0.3 或更高版本。
请执行以下命令:
# 升级到指定版本
npm install @adonisjs/bodyparser@10.1.5 # 或 11.0.3
# 或者,如果框架已经整合了该依赖
npm update
2. 临时缓解措施(在无法立即升级的情况下)
如果由于业务原因无法立即升级,可以考虑以下临时缓解措施:
- 中间件过滤: 编写一个自定义中间件,在所有涉及
multipart/form-data的请求处理逻辑之前,检查请求体中的字段名。拒绝任何包含__proto__、constructor、prototype等敏感关键字的字段。这种方法可以作为一种临时防护,但可能被复杂的编码绕过,且会影响正常业务逻辑的健壮性。 - 输入验证与清洗: 在处理完请求体后,对所有对象属性进行严格的验证。例如,检查对象是否有非预期的属性,或者使用
Object.create(null)创建不带原型的纯净对象来存储用户可控的数据。 - 禁用不安全的功能: 如果业务场景允许,暂时关闭或替换
@adonisjs/bodyparser对深层嵌套路径的解析能力,避免使用_.set()进行对象赋值。
参考资料
- CVE 官方页面 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2026-48795
- CWE-1321: https://cwe.mitre.org/data/definitions/1321.html (Improperly Controlled Modification of Object Prototype Attributes)
- GitHub Security Advisory: (建议查阅
@poinss/utils和@adonisjs/bodyparser的 GitHub 仓库安全公告页面)