GHSA-c2jg-2778-ggm4: XSS

Published Sep 8, 2026
·
Updated

Summary

Prowler's HTML output formatter inserts finding.resourcetags into the generated report without HTML escaping. A cloud principal who can create or edit a resource tag in an account that is later scanned can store HTML or JavaScript in that tag. When another user opens the generated Prowler HTML report, the payload executes in the report page.

Impact

This is stored cross-site scripting in a security report artifact. The attacker needs permission to influence tags on a scanned cloud resource, and the victim must open the generated HTML report. In that context, JavaScript can read and modify the report DOM, alter displayed findings, and interact with any same-origin local or hosted report content available to the browser. This can undermine trust in generated security findings and can expose data contained in the report page.

Gate checks

The repository has 13,875 GitHub stars, which is above the 10,000 star floor. SECURITY.md is present and does not reject GitHub private reporting. The dedicated GitHub private vulnerability reporting endpoint for prowler-cloud/prowler returned true.

Affected versions

The vulnerable sink is present in current master at commit 329dfdf8e6cb8bc0424fb54b6595408e20969782 and in the latest GitHub release tag 5.28.0. The package metadata identifies the Python package as prowler.

Technical details

The HTML formatter builds each finding row with an f-string in prowler/lib/outputs/html/html.py. Neighboring fields are explicitly escaped:

- resourceuid is escaped at line 85 with .replace("<", "&lt;").replace(">", "&gt;"). - statusextended is escaped at line 87 with the same pattern.

The tag column does not apply equivalent escaping:

python <td>{parsehtmlstring(unrolldict(finding.resourcetags))}</td>

unrolldict concatenates tag keys and values into a string, and parsehtmlstring only prefixes each item with an HTML bullet. Neither function escapes <, >, quotes, or event-handler attributes before insertion into the table cell. As a result, a tag value such as this remains active markup in the generated report:

html <img src=x onerror="window.PROWLERTAGXSS=1">

Reproduction

1. Create or identify a cloud resource that Prowler will include in an HTML report. 2. Add a tag value containing a harmless proof payload, for example:

html <img src=x onerror="window.PROWLERTAGXSS=1">

3. Run Prowler against the account and generate HTML output. 4. Open the generated HTML report in a browser. 5. The payload executes from the tags column.

A proof HTML fragment using the same formatter structure set window.PROWLERTAGXSS=1 from resourcetags, while equivalent payloads in resourceuid and statusextended stayed text because those fields are escaped.

Local evidence:

- /home/unkn0wn/securityaudit/vulnerability-reports/prowler-html-tag-xss-evidence-2026-05-26.json - /home/unkn0wn/securityaudit/vulnerability-reports/prowler-html-tag-xss-proof-full.html

PoC

The minimized generated row below mirrors the vulnerable formatter output. The first and third candidate payloads are escaped controls. The middle payload is the unescaped resourcetags value and executes when the report is rendered.

html <tr class="table-danger"> <td>&lt;img src=x onerror="window.PROWLERUIDXSS=1"&gt;</td> <td> &#x2022;Owner=<img src=x onerror="window.PROWLERTAGXSS=1;document.body.setAttribute('data-prowler-tag-xss','1')"> </td> <td>&lt;img src=x onerror="window.PROWLERSTATUSXSS=1"&gt;</td> </tr>

Browser proof result from the local artifact:

json {"tag": 1, "uid": 0, "status": 0, "attr": "1"}

Remediation

Escape tag keys and values before inserting them into HTML output. Prefer a single HTML escaping helper for every finding field that can originate from provider data. If bullets or separators are needed, build the list structure after escaping each key and value, rather than escaping the final HTML string after markup has been added.

Affected Software

2 affected componentsFixes available
pip/prowler-cloud<=5.36.0
5.37.0
pip/prowler<=5.36.0
5.37.0

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade pip/prowler-cloud to a version that resolves this vulnerability.

    Fixed in 5.37.0
  2. Upgrade

    Upgrade pip/prowler to a version that resolves this vulnerability.

    Fixed in 5.37.0
  3. Configuration

    Modify the HTML formatter so that `finding.resource_tags` (from `unroll_dict(...)` / `parse_html_string(...)`) is HTML-escaped before being inserted into the generated report table cell. Ensure each tag key and tag value is escaped, and build the list/bullets after escaping each key/value rather than escaping a final HTML string after markup is added.

    Prowler HTML output formatter (prowler/lib/outputs/html/html.py) HTML escaping for finding.resource_tags = Escape tag keys and values before inserting them into HTML output (including escaping `<` and `>`; do not insert unescaped resource_tags into the table cell)
  4. Compensating control

    Until the formatter is fixed, do not open the generated Prowler HTML report from untrusted scans (where an attacker could influence resource tags). Treat generated HTML reports as potentially executable content and share them only with trusted users/within trusted environments.

Event History

Sep 8, 2026
Advisory Published
via GitHub·06:09 PM
Data Sourced
via GitHub·06:09 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

Who can exploit this issue?

A cloud principal that can create or modify tags on a resource in an account scanned by Prowler can supply the malicious content. Exploitation also requires another user to open the generated HTML report.

2

What can malicious code do when a report is opened?

It can read and modify the report DOM, including altering displayed findings. It can also interact with same-origin local or hosted report content available in the victim's browser and expose data contained in the report page.

3

How can teams reduce risk before a fix is available?

Restrict tag creation and modification privileges on resources that will be scanned. Treat HTML reports generated from accounts where untrusted principals can influence resource tags as unsafe to open.

4

Are unreleased builds affected?

The vulnerable HTML output sink is present in the current master branch. The provided information does not identify specific released version ranges.

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