retool-postmessage-xss: Retool Self-Hosted - postMessage XSS via Custom Component Collections

2026-05-09 Retool Self-Hosted PoC Public

Description

Retool Self-Hosted versions 3.284.0 through 3.284.11 contain a cross-site scripting (XSS) vulnerability in the custom component collections iframe handler. The postMessage event listener in custom-component-collections.html accepts messages from any origin without validation and dynamically imports the received code via data:text/javascript URLs, allowing arbitrary JavaScript execution in the Retool instance origin context.

PoC

id: retool-postmessage-xss

info:
  name: Retool Self-Hosted - postMessage XSS via Custom Component Collections
  author: DhiyaneshDk
  severity: high
  description: |
    Retool Self-Hosted versions 3.284.0 through 3.284.11 contain a cross-site scripting (XSS) vulnerability in the custom component collections iframe handler. The postMessage event listener in custom-component-collections.html accepts messages from any origin without validation and dynamically imports the received code via data:text/javascript URLs, allowing arbitrary JavaScript execution in the Retool instance origin context.
  reference:
    - https://docs.retool.com/releases
    - https://docs.retool.com/changelog/disclosures/custom-component-xss
  metadata:
    max-request: 2
    vendor: retool
    product: retool
    shodan-query: title:"Retool"
    fofa-query: title="Retool"
  tags: retool,xss,postmessage,vuln

http:
  - method: GET
    path:
      - "{{BaseURL}}/custom-component-collections.html"

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains_all(body, "Custom Component", "custom-component-collections")'
        condition: and
        internal: true

    extractors:
      - type: regex
        name: js-bundle
        part: body
        group: 1
        regex:
          - '["'']/?(libs/custom-component-collections[^"'']+\.js)["'']'
        internal: true

  - method: GET
    path:
      - "{{BaseURL}}/{{js-bundle}}"

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains_all(body, "customComponentCode", "data:text/javascript", "addEventListener(\"message\"")'
        condition: and
# digest: 4a0a004730450220229db5e3c267581dc3fa00456d7b49def7b8f882a4bed0fb625ec4cbf77bb4d4022100e764b2c995b5008a97503eea80aae799a5a3ee2efbd2bb8ec68993c143aa1b01:922c64590222798bb761d5b6d8e72950

# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.

References

Related Vulnerabilities