Executive brief
Openpanel is a data analytics and dashboarding platform. An authenticated attacker can manipulate report layout API calls to access and delete dashboard configurations belonging to other tenants, because the application fails to verify that the requested dashboard belongs to the attacker's own project. An attacker with access to any single project can enumerate other dashboards and read their sensitive report configurations (queries, filters, breakdowns) or wipe their dashboard layouts, causing data loss.
Technical details
The report.getLayouts and report.resetLayout tRPC procedures contain an insecure direct object reference (IDOR) vulnerability rooted in missing authorization binding. Both handlers accept {dashboardId, projectId} input and validate only projectId via getProjectAccess(userId, projectId); they never verify that the supplied dashboardId actually belongs to that projectId. The underlying database queries filter solely by attacker-controlled dashboardId (where: { report: { dashboardId } }) without tenant scoping, allowing an authenticated user to supply their own valid projectId paired with any victim's dashboardId to read report layouts and full Report configuration rows or delete reportLayout rows. Dashboard IDs are low-entropy slugs (4-digit suffix only on collision), making victim dashboards easily enumerable. No user interaction is required. The fix is to bind dashboardId to projectId before query execution, as correctly implemented in the report.list handler. Patches are available in version 2.3.0.
Affected products
- Openpanel Openpanel before 2.3.0
Timeline
- 2026-08-20: disclosed
- 2026-09-04: patched: version 2.3.0