Skip to content

Fix stored XSS in billing notification charge summary report#1159

Merged
labkey-martyp merged 1 commit into
release25.7-SNAPSHOTfrom
25.7_fb_billing_notification_xss
Jul 22, 2026
Merged

Fix stored XSS in billing notification charge summary report#1159
labkey-martyp merged 1 commit into
release25.7-SNAPSHOTfrom
25.7_fb_billing_notification_xss

Conversation

@labkey-martyp

Copy link
Copy Markdown
Contributor

Rationale

BillingNotification.createChargeSummaryReport built its per-financial-analyst tables by concatenating editor-entered database values (investigator, project, debitedAccount, projectNumber, 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. The adjacent Charge Summary category table already escaped its values with PageFlowUtil.filter; this loop was simply never given the same treatment.

Related Pull Requests

None.

Changes

  • Wrap every editor-entered value (investigator, project, account, project number, category) in PageFlowUtil.filter before rendering it into the charge summary tables.
  • Filter the derived href URLs (project, account, and per-field-descriptor links), which embed those same tainted values.

The per-financial-analyst tables in BillingNotification.createChargeSummaryReport interpolated editor-entered database values (investigator, project, debitedAccount, projectNumber, category) and their derived URLs directly into HTML without escaping. This 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, applying the same encoding the adjacent Charge Summary category table already used.
@labkey-martyp
labkey-martyp merged commit 21d8347 into release25.7-SNAPSHOT Jul 22, 2026
9 checks passed
@labkey-martyp
labkey-martyp deleted the 25.7_fb_billing_notification_xss branch July 22, 2026 17:18
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.

2 participants