CVE-2026-77768: OpenPanel report.get Returns Any Report by Identifier Without Checking Project Access

Published Aug 21, 2026
·
Updated

The report.get procedure in packages/trpc/src/routers/report.ts accepted only a reportId and returned getReportById(reportId) directly. The enforceAccess middleware in packages/trpc/src/trpc.ts evaluates membership only when the input carries a projectId or organizationId key, so an input consisting of a reportId alone passed through unchecked, and getReportById in packages/db/src/services/reports.service.ts performs a findUnique on the report id with no project scoping. Any authenticated user could therefore read the full configuration of any saved report on the instance, including the owning projectId, event series, filters, breakdowns and formulas, by supplying its identifier. The adjacent update, delete and duplicate procedures resolve the report first and check getProjectAccess against the report's own projectId, so the omission was specific to this procedure.

Affected Software

2 affected components
trpc/report.get
npm/trpc

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Configuration

    Update the report.get procedure so it does not call getReportById(reportId) without project scoping; instead resolve the report first and check getProjectAccess against the report's own projectId before returning the report.

    OpenPanel trpc router: packages/trpc/src/routers/report.ts (report.get) getProjectAccess enforcement = Require project scoping for report.get using the report's own projectId (reject/deny when getProjectAccess fails)
  2. Configuration

    Modify enforceAccess so that when a request only carries reportId (no projectId or organizationId keys), access is still enforced (e.g., by deriving the report's projectId and evaluating membership accordingly) rather than passing the input through unchecked.

    packages/trpc/src/trpc.ts (enforceAccess middleware) enforceAccess membership evaluation keys = Evaluate membership when resolving report access even if input contains only reportId
  3. Configuration

    Change getReportById in packages/db/src/services/reports.service.ts to scope the lookup by report id AND the authorized projectId/organizationId; avoid findUnique on report id without project scoping.

    packages/db/src/services/reports.service.ts (getReportById) Project scoping in findUnique = Add project scoping to the findUnique query instead of querying by report id alone

Event History

Aug 21, 2026
CVE Published
via MITRE·11:05 AM
Data Sourced
via MITRE·11:05 AM
DescriptionSeverityWeakness

Frequently Asked Questions

1

Who can exploit this issue?

Any authenticated user on the same OpenPanel instance can exploit it. The user does not need membership in the project that owns the targeted report.

2

What does an attacker need to retrieve another project's report?

They need only the report identifier and access to the report.get procedure. No user interaction or elevated privileges are required.

3

What information could be exposed?

The procedure can return the full saved-report configuration, including its owning projectId, event series, filters, breakdowns, and formulas. The issue is limited to reading reports; the described update, delete, and duplicate procedures perform project-access checks.

4

How can we determine whether this access-control gap exists in our deployment?

Review the report.get implementation and verify whether it accepts only reportId and directly calls getReportById(reportId) without resolving the report and checking access to its project. Also verify whether access middleware relies on projectId or organizationId being present in the request input.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203