Broken access control — self-service privilege escalation on /v1/users/me
A standard account could promote itself to administrator by including a role field in its own profile update. The server bound the whole request body to the user model and performed no re-authorisation, exposing every tenant record behind the admin console.
PATCH /v1/users/me HTTP/1.1
Host: api.redacted.io
Authorization: Bearer eyJhbGciOi… ← standard user
{"displayName":"j.doe","role":"admin"}
HTTP/1.1 200 OK ← accepted, no re-authorisation
GET /v1/admin/users → 200 OK (1,842 records)
Bind requests to an explicit allowlist of writable fields and reject unknown properties. Role changes must run through a separate, audited endpoint that re-checks the caller’s privileges server-side.