批量赋值漏洞
批量赋值漏洞 是什么?
批量赋值漏洞应用将客户端提交的请求字段盲目绑定到内部对象属性,导致攻击者能写入本不应控制的字段的漏洞。
当 Rails、Spring、ASP.NET、NestJS、Django 等框架在没有显式白名单的情况下,自动将传入的 JSON 或表单字段映射到模型属性时,就会出现批量赋值漏洞。攻击者会附加额外的属性——isAdmin、role、balance、tenantId——服务器随后将其持久化。由于绑定是隐式的,该缺陷在代码审查中很难被发现:单个 update_attributes(params) 或模型绑定器调用掩盖了每一个属性都可写这一事实。它被登记为 CWE-915,并出现在 OWASP API 安全 Top 10 中(2019 年的 A6,2023 年被并入 API3「对象属性级授权失效」)。
最典型的事件是 Egor Homakov 于 2012 年 3 月对 GitHub 的入侵:由于 SSH 密钥表单在没有白名单的情况下绑定了 public_key[user_id],他附加了一个精心构造的字段,把自己的密钥挂到了 Rails 组织账户上,并向 rails/rails 推送了一次提交。GitHub 在数小时内完成修复,这一事件也促使 Rails 将 attr_accessible 白名单机制——后来的 strong_parameters——设为默认。
缓解措施包括使用显式的 DTO 或输入模式、严格白名单化可绑定字段、将仅内部使用的属性与可供用户绑定的模型分离,以及编写提交意料之外 JSON 键的反向测试。
flowchart TD
A["客户端 POST JSON<br/>{name, isAdmin:true}"] --> B[框架自动绑定器]
B --> C{是否有显式的<br/>字段白名单?}
C -->|否 — 批量赋值| D[所有键都写入模型]
D --> E[(isAdmin=true<br/>持久化到数据库)]
C -->|是 — DTO / strong params| F[仅绑定被允许的字段]
F --> G[(特权字段被忽略)]● 示例
- 01
向 /api/users 发送 {"name":"Bob","isAdmin":true},直接被提升为管理员。
- 02
通过 POST 在订单中附加隐藏折扣字段,绕过定价规则。
● 常见问题
批量赋值漏洞 是什么?
应用将客户端提交的请求字段盲目绑定到内部对象属性,导致攻击者能写入本不应控制的字段的漏洞。 它属于网络安全的 漏洞 分类。
批量赋值漏洞 是什么意思?
应用将客户端提交的请求字段盲目绑定到内部对象属性,导致攻击者能写入本不应控制的字段的漏洞。
如何防御 批量赋值漏洞?
针对 批量赋值漏洞 的防御通常结合技术控制与运营实践,详见上方完整定义。
批量赋值漏洞 还有哪些其他名称?
常见的别称包括: 自动绑定漏洞, 对象注入。