CVE-2026-28445
Typebot: Stored XSS via Rating Block Custom Icon Bypasses isUnsafe Sandbox in Builder Preview
Typebot is a chatbot builder tool. In versions 3.15.2 and prior, the RatingButton component in the embed package renders the user-controlled customIcon.svg field directly via Solid's innerHTML directive without any sanitization, even though DOMPurify is already a dependency and is used elsewhere in the codebase (e.g., StreamingBubble.tsx). Because rating blocks are not flagged as isUnsafe by the import sanitizer and the builder preview renders bots inline on the builder's own origin (builder.typebot.io) under a CSP permitting 'unsafe-inline', a malicious imported or collaborator-crafted typebot can execute arbitrary HTML/JS in the builder's authenticated context, bypassing the Web Worker sandbox that protects Script blocks during preview. This allows session hijacking and privilege escalation within the builder application. This issue has been fixed in version 3.16.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- Required
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
8.7
Typebot: Stored XSS via Rating Block Custom Icon Bypasses isUnsafe Sandbox in Builder Preview
Typebot is a chatbot builder tool. In versions 3.15.2 and prior, the RatingButton component in the embed package renders the user-controlled customIcon.svg field directly via Solid's innerHTML directive without any sanitization, even though DOMPurify is already a dependency and is used elsewhere in the codebase (e.g., StreamingBubble.tsx). Because rating blocks are not flagged as isUnsafe by the import sanitizer and the builder preview renders bots inline on the builder's own origin (builder.typebot.io) under a CSP permitting 'unsafe-inline', a malicious imported or collaborator-crafted typebot can execute arbitrary HTML/JS in the builder's authenticated context, bypassing the Web Worker sandbox that protects Script blocks during preview. This allows session hijacking and privilege escalation within the builder application. This issue has been fixed in version 3.16.0.
- Record
CVE-2026-28445- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
EUVDEUVD-2026-31466
8.7
Typebot is a chatbot builder tool. In versions 3.15.2 and prior, the RatingButton component in the embed package renders the user-controlled customIcon.svg field directly via Solid's innerHTML directive without any sanitization, even though DOMPurify is already a dependency and is used elsewhere in the codebase (e.g., StreamingBubble.tsx). Because rating blocks are not flagged as isUnsafe by the import sanitizer and the builder preview renders bots inline on the builder's own origin (builder.typebot.io) under a CSP permitting 'unsafe-inline', a malicious imported or collaborator-crafted typebot can execute arbitrary HTML/JS in the builder's authenticated context, bypassing the Web Worker sandbox that protects Script blocks during preview. This allows session hijacking and privilege escalation within the builder application. This issue has been fixed in version 3.16.0.
- Record
EUVD-2026-31466- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-6m7c-xfhp-p9fh
8.7
Typebot has Stored XSS via Rating Block Custom Icon that Bypasses isUnsafe Sandbox in Builder Preview
Summary
The rating block's custom icon feature accepts arbitrary HTML/SVG via the customIcon.svg field and renders it using Solid's innerHTML directive without any sanitization. When a malicious typebot is imported or crafted by a workspace collaborator, the payload executes in the builder's DOM context (builder.typebot.io), bypassing the isUnsafe Web Worker sandbox that protects Script blocks during preview. This allows session hijacking and privilege escalation within the builder application.
Severity
High (CVSS 3.1: 8.7)
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
-
Attack Vector: Network — malicious typebot can be delivered via import/template sharing or crafted by a collaborator
-
Attack Complexity: Low — payload is a trivial HTML injection, no special conditions required
-
Privileges Required: Low — attacker needs either collaborator access to a workspace or the ability to distribute a typebot template
-
User Interaction: Required — victim must preview the bot in the builder
-
Scope: Changed — the vulnerable component (embed JS rating renderer) impacts the builder application's authentication context, a different security scope
-
Confidentiality Impact: High — full access to builder session cookies, auth tokens, and API access
-
Integrity Impact: High — can modify bots, workspace settings, or perform any action as the victim user
-
Availability Impact: None — no denial of service vector
-
Builder preview context (CONFIRMED): This is the real vulnerability. The rating block innerHTML bypasses the
isUnsafesandbox mechanism that protects against imported/untrusted Script blocks. The builder preview renders inline on the builder's origin with'unsafe-inline'CSP, giving the attacker full access to the victim's builder session. -
Viewer/embed context (NOT incremental): Bot creators already have intentional arbitrary JavaScript execution via Script blocks in production mode (
executeScript.ts:22-24). The rating innerHTML does not provide additional capability in this context. This is by design — bot creators control what code runs in their published bots.
The adjusted severity reflects the builder-preview-specific impact, which is still High due to session hijacking potential on the privileged builder origin.
Affected Component
packages/embeds/js/src/features/blocks/inputs/rating/components/RatingForm.tsx—RatingButtoncomponent (lines 153-160)apps/builder/src/features/typebot/helpers/sanitizers.ts—sanitizeBlockfunction (lines 63-119) — missing rating block SVG sanitization
CWE
- CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
Description
Unsanitized innerHTML in Rating Block Custom Icon
The RatingButton component in the embeds JS package renders the custom icon SVG directly into the DOM via Solid's innerHTML directive with no sanitization:
// packages/embeds/js/src/features/blocks/inputs/rating/components/RatingForm.tsx:153-160
<div
class="flex justify-center items-center rating-icon-container"
innerHTML={
props.customIcon?.isEnabled && !isEmpty(props.customIcon.svg)
? props.customIcon.svg
: defaultIcon
}
/>
The customIcon.svg field is stored as a plain string with no content validation at any layer:
// packages/blocks/inputs/src/rating/schema.ts:21-26
customIcon: z
.object({
isEnabled: z.boolean().optional(),
svg: z.string().optional(), // No sanitization — any HTML/JS accepted
})
.optional(),
Inconsistent Defenses — DOMPurify Available But Not Used
The codebase is aware of innerHTML XSS risks. StreamingBubble.tsx uses dompurify to sanitize content before passing it to innerHTML:
// packages/embeds/js/src/components/bubbles/StreamingBubble.tsx:2,28
import domPurify from "dompurify";
// ...
domPurify.sanitize(marked.parse(line, { breaks: true }), {…
- Record
GHSA-6m7c-xfhp-p9fh- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
NVD
8.7
Typebot is a chatbot builder tool. In versions 3.15.2 and prior, the RatingButton component in the embed package renders the user-controlled customIcon.svg field directly via Solid's innerHTML directive without any sanitization, even though DOMPurify is already a dependency and is used elsewhere in the codebase (e.g., StreamingBubble.tsx). Because rating blocks are not flagged as isUnsafe by the import sanitizer and the builder preview renders bots inline on the builder's own origin (builder.typebot.io) under a CSP permitting 'unsafe-inline', a malicious imported or collaborator-crafted typebot can execute arbitrary HTML/JS in the builder's authenticated context, bypassing the Web Worker sandbox that protects Script blocks during preview. This allows session hijacking and privilege escalation within the builder application. This issue has been fixed in version 3.16.0.
- Record
CVE-2026-28445- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
OSV
8.7
Typebot: Stored XSS via Rating Block Custom Icon Bypasses isUnsafe Sandbox in Builder Preview
Typebot is a chatbot builder tool. In versions 3.15.2 and prior, the RatingButton component in the embed package renders the user-controlled customIcon.svg field directly via Solid's innerHTML directive without any sanitization, even though DOMPurify is already a dependency and is used elsewhere in the codebase (e.g., StreamingBubble.tsx). Because rating blocks are not flagged as isUnsafe by the import sanitizer and the builder preview renders bots inline on the builder's own origin (builder.typebot.io) under a CSP permitting 'unsafe-inline', a malicious imported or collaborator-crafted typebot can execute arbitrary HTML/JS in the builder's authenticated context, bypassing the Web Worker sandbox that protects Script blocks during preview. This allows session hijacking and privilege escalation within the builder application. This issue has been fixed in version 3.16.0.
- Record
CVE-2026-28445- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
OSVGHSA-6m7c-xfhp-p9fh
8.7
Typebot has Stored XSS via Rating Block Custom Icon that Bypasses isUnsafe Sandbox in Builder Preview
Summary
The rating block's custom icon feature accepts arbitrary HTML/SVG via the customIcon.svg field and renders it using Solid's innerHTML directive without any sanitization. When a malicious typebot is imported or crafted by a workspace collaborator, the payload executes in the builder's DOM context (builder.typebot.io), bypassing the isUnsafe Web Worker sandbox that protects Script blocks during preview. This allows session hijacking and privilege escalation within the builder application.
Severity
High (CVSS 3.1: 8.7)
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
-
Attack Vector: Network — malicious typebot can be delivered via import/template sharing or crafted by a collaborator
-
Attack Complexity: Low — payload is a trivial HTML injection, no special conditions required
-
Privileges Required: Low — attacker needs either collaborator access to a workspace or the ability to distribute a typebot template
-
User Interaction: Required — victim must preview the bot in the builder
-
Scope: Changed — the vulnerable component (embed JS rating renderer) impacts the builder application's authentication context, a different security scope
-
Confidentiality Impact: High — full access to builder session cookies, auth tokens, and API access
-
Integrity Impact: High — can modify bots, workspace settings, or perform any action as the victim user
-
Availability Impact: None — no denial of service vector
-
Builder preview context (CONFIRMED): This is the real vulnerability. The rating block innerHTML bypasses the
isUnsafesandbox mechanism that protects against imported/untrusted Script blocks. The builder preview renders inline on the builder's origin with'unsafe-inline'CSP, giving the attacker full access to the victim's builder session. -
Viewer/embed context (NOT incremental): Bot creators already have intentional arbitrary JavaScript execution via Script blocks in production mode (
executeScript.ts:22-24). The rating innerHTML does not provide additional capability in this context. This is by design — bot creators control what code runs in their published bots.
The adjusted severity reflects the builder-preview-specific impact, which is still High due to session hijacking potential on the privileged builder origin.
Affected Component
packages/embeds/js/src/features/blocks/inputs/rating/components/RatingForm.tsx—RatingButtoncomponent (lines 153-160)apps/builder/src/features/typebot/helpers/sanitizers.ts—sanitizeBlockfunction (lines 63-119) — missing rating block SVG sanitization
CWE
- CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
Description
Unsanitized innerHTML in Rating Block Custom Icon
The RatingButton component in the embeds JS package renders the custom icon SVG directly into the DOM via Solid's innerHTML directive with no sanitization:
// packages/embeds/js/src/features/blocks/inputs/rating/components/RatingForm.tsx:153-160
<div
class="flex justify-center items-center rating-icon-container"
innerHTML={
props.customIcon?.isEnabled && !isEmpty(props.customIcon.svg)
? props.customIcon.svg
: defaultIcon
}
/>
The customIcon.svg field is stored as a plain string with no content validation at any layer:
// packages/blocks/inputs/src/rating/schema.ts:21-26
customIcon: z
.object({
isEnabled: z.boolean().optional(),
svg: z.string().optional(), // No sanitization — any HTML/JS accepted
})
.optional(),
Inconsistent Defenses — DOMPurify Available But Not Used
The codebase is aware of innerHTML XSS risks. StreamingBubble.tsx uses dompurify to sanitize content before passing it to innerHTML:
// packages/embeds/js/src/components/bubbles/StreamingBubble.tsx:2,28
import domPurify from "dompurify";
// ...
domPurify.sanitize(marked.parse(line, { breaks: true }), {…
- Record
GHSA-6m7c-xfhp-p9fh- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@typebot.io/jsnpm |
before 0.10.1 | 0.10.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-28445 is a high vulnerability (CVSS 8.7) in Baptistearno Typebot.io, published May 22, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.26%, the 17th percentile. Fixed in @typebot.io/js 0.10.1.
References
github.com/baptisteArno/typebot.io/security/advisories/GHSA-6m7c-xfhp-p9fh
github.com/baptisteArno/typebot.io/commit/474ecbf46bc47a75265bada2599f12b2179de375
github.com/baptisteArno/typebot.io/releases/tag/v3.16.0
nvd.nist.gov/vuln/detail/CVE-2026-28445
github.com/baptisteArno/typebot.io/blob/v3.16.0/packages/embeds/js/package.json
github.com/advisories/GHSA-6m7c-xfhp-p9fh
github.com/CVEProject/cvelistV5/tree/main/cves/2026/28xxx/CVE-2026-28445.json
github.com/baptisteArno/typebot.io
Left out here: the rest of 2 source descriptions. The JSON record has them.