← Base de Vulnerabilidades
Autorização A01:2021-Broken Access Control CVSS 8.8

Mass Assignment — Atribuição em Massa de Parâmetros

Mass Assignment permite que usuários definam campos não expostos (isAdmin, role, balance) via API REST. Veja exemplos em Node.js, Django e Rails com exploit.

Comum em: APIs REST em Node.js/Express, Ruby on Rails, Django, Laravel com ORM automático · Dificuldade: Baixa — requer apenas adicionar campos extras ao request

O Que É Mass Assignment

Mass Assignment (também chamado de AutoBind ou Object Injection em frameworks) ocorre quando uma API aceita um objeto JSON do cliente e o mapeia automaticamente para um model/ORM sem filtrar campos sensíveis. Se o model tem campos como isAdmin, role, balance, creditLimit, ou verified, um usuário pode incluí-los no request e alterá-los diretamente — mesmo sem ter permissão.

Exemplo Real de Ataque

HTTP Request / Response
# Request normal
PUT /api/v1/usuarios/me
Content-Type: application/json
Authorization: Bearer user-token

{"nome": "João Silva", "email": "joao@empresa.com"}

# Mass Assignment attack — campos extras adicionados:
PUT /api/v1/usuarios/me
{"nome": "João Silva", "email": "joao@empresa.com",
 "isAdmin": true, "role": "administrator", "emailVerified": true,
 "creditLimit": 999999, "subscriptionPlan": "enterprise"}

HTTP/1.1 200 OK
{"id": 42, "nome": "João Silva", "isAdmin": true}  ← Privilege escalation!

Impacto no Negócio e Compliance

Escalada de privilégios horizontal e vertical: usuário se torna admin incluindo {"isAdmin": true} no body do request. Alteração de saldo, limites de crédito, status de verificação de conta. Em fintechs: {"saldo": 1000000, "verified": true} pode criar crédito fictício.

CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N

Como Remediar

// ❌ INSEGURO — spread de body direto no model
const usuario = await Usuario.findByPk(id);
await usuario.update(req.body);  // Aceita qualquer campo!

// ✅ SEGURO — whitelist explícita de campos permitidos
const CAMPOS_EDITAVEIS = ['nome', 'email', 'telefone', 'avatar_url'];

const dadosPermitidos = {};
for (const campo of CAMPOS_EDITAVEIS) {
  if (req.body[campo] !== undefined) {
    dadosPermitidos[campo] = req.body[campo];
  }
}
await usuario.update(dadosPermitidos);

// ✅ Django: use fields explícitos no serializer
class UsuarioUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Usuario
        fields = ['nome', 'email', 'telefone']  # explícito — nunca use '__all__'

Como a Veyronn Detecta Esta Vulnerabilidade

Testamos mass assignment incluindo campos de model não documentados (isAdmin, role, status, verified, balance, createdAt) em todos os endpoints de criação e atualização. Analisamos o schema do ORM quando o código-fonte está disponível.

Pronto para Contratar seu Próximo Pentest?

Adquira nossa avaliação pontual feita pelos melhores profissionais do mercado ou implemente o software da Veyronn 24/7.