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.
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
# 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.
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.
Vulnerabilidades Relacionadas
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.
