# AdonisJS Lucid 内部ORM状态覆盖漏洞
## 概述
@adonisjs/lucid 是构建在 Knex 之上的 AdonisJS SQL ORM,存在批量赋值(Mass Assignment)漏洞,允许远程攻击者篡改 Lucid 模型的内部 ORM 状态。
## 影响版本
- @adonisjs/lucid <= 21.8.1
- @adonisjs/lucid 22.x 预发布版本 < 22.0.0-next.6
## 细节
该漏洞存在于 Lucid 模型的数据赋值过程中,未正确过滤用户可控的输入字段。攻击者若能影响传入模型的数据,可利用此漏洞覆盖模型内部的 ORM 状态属性,从而操纵 ORM 的行为逻辑。
## 影响
- 可能导致业务逻辑绕过
- 允许未经授权的数据库记录修改
- 影响特定表或模型的数据完整性与安全性
## 修复版本
- @adonisjs/lucid >= 21.8.2
- @adonisjs/lucid >= 22.0.0-next.6
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: Mass Assignment in AdonisJS Lucid Allows Overwriting Internal ORM State · Advisory · adonisjs/lucid · GitHub -- 🔗来源链接
标签:x_refsource_CONFIRM
神龙速读:
### 关键漏洞信息
#### 漏洞概述
- **漏洞类型**: Mass Assignment (CWE-915)
- **风险等级**: 高 (8.2/10)
- **CVE ID**: CVE-2026-22814
#### 影响版本
- **受影响版本**:
- <= 21.8.1
- <= 22.0.0-next.5
- **修复版本**:
- 21.8.2
- 22.0.0-next.6
#### 描述
- **漏洞详情**:
- **受影响类**: `BaseModelImpl` 类中的`@adonisjs/lucid`
- **问题**: 通过特定属性(如`$isPersisted`, `$attributes`, `$isDeleted`)的直接赋值,攻击者可以覆盖内部类属性,从而篡改内部ORM状态。
- **原因**:
- ORM依赖于`this.hasOwnProperty(key)`来校验属性赋值。
- 由于内部ORM属性作为实例属性被初始化,因此通过`hasOwnProperty`检查。
- 这允许攻击者在使用`merge()`或`$consumeAdapterResult()`方法时传递特定键的载荷,从而劫持内部逻辑。
- **暴露的内部属性**:
- `$attributes`: 存储模型数据的原始容器。
- `$isPersisted`: 控制 `save()` 执行是INSERT还是UPDATE操作。
- `$original`: 存储记录的原始状态,用于计算更改。
- `$isDeleted`: 防止对已删除模型的操作。
- **影响范围**:
- `fill` 和`merge()`实例方法。
- `create`, `createQuietly`, `firstOrNew`, `firstOrCreate`单条记录创建方法。
- `updateOrCreate`条件更新。
- `createMany`, `createManyQuietly`, `fetchOrNewUpMany`, `fetchOrCreateMany`, `updateOrCreateMany`批量操作。
#### 影响
- **风险**: 如果应用程序传递了未验证的数据,或保留了未知属性的已验证数据,容易受到攻击。
- **原理**: 内部键作为实例属性存在,通过`hasOwnProperty`检查,绕过默认的未知属性拒绝机制。
- **示例**:
- 开发者传递`request.all()`, `request.except()`或允许未知属性的模式给`Model.create()`
- 攻击者可通过注入如`$isPersisted: true`或改变`$attributes`来控制数据的增删改查操作。
#### 修复措施
- **已修复版本**:
- `@adonisjs/lucid`版本 >= 21.8.2 或 >= 22.0.0-next.6
- **建议**: 严格验证模型输入,如果可能,使用白名单策略移除未知键。
暂无评论