FlawOpen

flawopen.com/Mass assignment/Explicado

Mass assignment: riesgos y listas seguras de campos

CWE-915: Improperly Controlled Modification of Dynamically-Determined Object AttributesPágina de referencia
Respuesta breve

Imagina el modelo como un formulario con campos editables y controles reservados al personal. Vincular toda la solicitud permite al cliente rellenar también propiedad, aprobación o rol. Define los campos editables en el servidor y autoriza registro y operación por separado.

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;

Por qué importan las listas permitidas en el servidor

Una lista de exclusión como «acepta todo salvo role» puede fallar cuando aparece un campo sensible nuevo. Con una lista permitida, el campo nuevo no se edita hasta que el código lo exponga. En Rails, Strong Parameters rechaza atributos no permitidos al asignar parámetros en masa; el controlador aún debe permitir solo los campos propios de la acción. DTO, serializador o formulario explícito crean el mismo límite.

La lista limita los atributos de la solicitud, pero no autoriza a modificar el registro. Limítalo al usuario autenticado, autoriza la operación y separa los cambios privilegiados en flujos del servidor.

Categorías de campos sensibles

Revisa los atributos del modelo, serializadores anidados y endpoints de actualización:

Preguntas frecuentes

¿Es lo mismo que prototype pollution?

Son fallos distintos. Mass assignment establece atributos imprevistos en el objeto creado o actualizado. Prototype pollution cambia propiedades de un prototipo y puede afectar la búsqueda de otros objetos. Una combinación insegura puede abrir esa vía; el efecto de mass assignment depende del uso de esas propiedades. Consulta prototype pollution.

¿GraphQL evita el problema?

No. Una mutación puede aceptar una entrada demasiado amplia. Limita sus tipos a campos editables y autoriza objeto y operación en el resolver o servicio.

¿Protegen los formularios renderizados en servidor?

No. El formulario no limita lo que envía un cliente HTTP. Trata los campos como controlados por el atacante, valida la estructura en el servidor y acepta solo los previstos para la acción.

Referencias

Véase también Filtración de estado serverless: aísla datos por solicitud PHP == y las comparaciones de magic hash ¿El bloque unsafe de Rust sigue siendo seguro? ¿strncpy() es más segura que strcpy()? CWE frente a CVE: ¿cuál es la diferencia?