Skip to content

Fix stored XSS in finance notification charge summary report#1779

Open
labkey-martyp wants to merge 2 commits into
release26.3-SNAPSHOTfrom
26.3_fb_finance_notification_xss
Open

Fix stored XSS in finance notification charge summary report#1779
labkey-martyp wants to merge 2 commits into
release26.3-SNAPSHOTfrom
26.3_fb_finance_notification_xss

Conversation

@labkey-martyp

Copy link
Copy Markdown
Contributor

Rationale

FinanceNotification.writeResultTable and its overriding subclass DCMFinanceNotification.writeResultTable are divergent copies of the ehr_billing BillingNotification report that concatenated editor-entered database values (investigator, project, alias/account, OGA project number, category) and their derived URLs directly into HTML with no escaping. That HTML is rendered verbatim into the LDK RunNotificationAction admin preview via HtmlString.unsafe and is also sent as the HTML email body, so a stored payload in any of those project/alias fields executed in the browser of any user who previewed the notification or received the email — a stored XSS with privilege-escalation potential toward admins. Both are registered, active notifications (ONPRC_BillingModule). This is the ONPRC counterpart to the BillingNotification fix; unlike that copy, the top category summary table here was also unescaped.

Related Pull Requests

Changes

  • FinanceNotification: wrap every editor-entered value (investigator, project, account, project number, category) and its derived href URL in PageFlowUtil.filter in the per-financial-analyst tables, and filter the top category summary table (url and category), which was unescaped in this copy.
  • DCMFinanceNotification: apply the same filtering to its writeResultTable override, which the parent-class fix did not cover; mapped to this override's token layout (tokens[0] project, tokens[1] alias, tokens[2] OGA project number).
  • Add the org.labkey.api.util.PageFlowUtil import to both files.

FinanceNotification.createChargeSummaryReport is a divergent copy of the ehr_billing BillingNotification report and interpolated editor-entered database values (investigator, project, debitedAccount, projectNumber, category) and their derived URLs directly into HTML without escaping. That HTML is rendered verbatim into the LDK RunNotificationAction admin preview via HtmlString.unsafe and is also sent as the HTML email body, so a stored payload in any of those project/alias fields executed in the browser of any user who previewed the notification or received the email. Wrap every tainted value with PageFlowUtil.filter in both the per-financial-analyst tables and the top category summary table (which was also unescaped in this copy), matching the fix applied to BillingNotification.
DCMFinanceNotification overrides FinanceNotification.writeResultTable with its own copy of the report, so the escaping fix to the parent class did not cover it. It concatenated editor-entered database values (project, alias/account, OGA project number, category) and their derived URLs directly into HTML without escaping, reaching the same LDK RunNotificationAction admin preview (HtmlString.unsafe) and HTML email sink. It is registered as an active notification in ONPRC_BillingModule. Wrap every tainted value with PageFlowUtil.filter in both the per-project tables and the top category summary table, mapping to this override's token layout (tokens[0] project, tokens[1] alias, tokens[2] OGA project number).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant