FlawOpen

flawopen.com/Mass Assignment/说明

Mass Assignment:风险与安全字段白名单

CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes参考页面
简答

把模型想成一张表单:有用户可编辑字段,也有员工专用控制项。绑定整个请求体,就等于让客户填写账户归属、审批状态或角色。应在服务器定义字段,并分别授权记录和操作。

VULNERABLE
# Rails: request keys reach model attributes
User.new(params[:user])

// Node / Mongoose: request object used as update
await User.findByIdAndUpdate(id, req.body);

// Express + Sequelize: request object used as create values
await User.create(req.body);

# Django: request keys passed as model fields
User.objects.create(**request.POST.dict())
FIXED
# Rails — permit only user-editable fields
attrs = params.require(:user).permit(:name, :email)
user = User.new(attrs)

// Node — construct an allowlisted update
const { name, email } = req.body;
await User.findByIdAndUpdate(id, { name, email });

# Django — explicit ModelForm fields
class UserForm(ModelForm):
    class Meta:
        model = User
        fields = ["name", "email"]

// .NET — bind a DTO, then map explicitly
user.Name = input.Name;
user.Email = input.Email;

为什么服务器端字段白名单很重要

“除 role 外全部接受”的黑名单可能漏掉后来新增的敏感字段。白名单让新字段默认不可编辑,直到代码明确开放。Rails Strong Parameters 在批量赋值时拒绝未许可属性;控制器仍须只许可当前操作所需字段。DTO或显式字段列表也能建立此边界。

白名单限制请求可设置的属性,但不授予修改记录的权限。将记录限定在已认证主体范围内,单独授权操作,并把特权修改放入独立服务端流程。

需检查的敏感字段类别

检查模型属性、嵌套序列化器和更新接口中的以下类别:

常见问题

这与 prototype pollution 是一回事吗?

这是不同的弱点。Mass Assignment会让输入设置对象的非预期属性。Prototype pollution修改对象原型属性,可能影响其他对象的属性查找。不安全合并可能导致后者;是否形成Mass Assignment取决于应用如何使用属性。参见prototype pollution。

GraphQL 能避免这个问题吗?

不能。GraphQL mutation也可能接受过宽的输入。输入类型仅包含客户端可改字段,并在resolver或服务层授权对象和操作。

服务端渲染表单能保护我吗?

不能。表单不能限制HTTP客户端发送内容。将字段视为攻击者可控,在服务器验证结构,只接受当前操作允许的字段。

参考资料

另请参阅 Serverless 状态泄漏:按请求隔离用户数据 PHP == 与 Magic Hash 比较 Rust 的 unsafe 块仍能保证内存安全吗? strncpy() 比 strcpy() 更安全吗? CWE 与 CVE:有什么区别?