FS-DEMO-01 · demo-corp.test · ejemplo
Cualquier usuario puede leer las facturas de otros clientes
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
Descripción
El endpoint GET /v2/invoices/{id} comprueba que el token es válido, pero no que la factura pertenezca a quien la pide. Basta con cambiar el identificador para leer las facturas de cualquier cliente.
Impacto
Exposición de los datos personales y fiscales de todos los clientes: nombre, NIF, conceptos e importes. Si alguien lo explota, es una brecha de datos personales a efectos del RGPD.
Corrección
router.get('/v2/invoices/:id', auth, async (req, res) => { const invoice = await Invoices.findById(req.params.id); const invoice = await Invoices.findOne({ id: req.params.id, customerId: req.user.customerId, }); if (!invoice) return res.sendStatus(404); res.json(invoice);}); Además: identificadores no secuenciales y una prueba automática de autorización por objeto en la integración continua.
Evidencia
GET /v2/invoices/48214 HTTP/2Host: api.demo-corp.testAuthorization: Bearer eyJhbGciOiJSUzI1NiIs… (usuario A)Accept: application/jsonHTTP/2 200 OKContent-Type: application/jsonCache-Control: no-store{ "id": 48214, "cliente": "usr_9102", "nif": "B••••••••", "concepto": "Licencias anuales", "total": "18.900,00 €"}curl -i https://api.demo-corp.test/v2/invoices/48214 \ -H "Authorization: Bearer $TOKEN_A" \ -H "Accept: application/json"