🤖 fix: add rehype-sanitize to prevent XSS in markdown rendering #1050
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
The error
The tag <noun> is unrecognized in this browserindicated that arbitrary HTML tags were being parsed and rendered. This exposed the app to XSS attacks.Root Cause
The markdown rendering pipeline used:
rehype-raw- Parses raw HTML embedded in markdownrehype-harden- Only sanitizes URLs in<a>and<img>tagsThe gap:
rehype-hardendoes NOT strip unknown/dangerous HTML elements (<script>,<style>,<form>,<noun>, etc.) or remove event handlers (onclick,onerror, etc.).Solution
Add
rehype-sanitizeto the plugin chain with a schema that:<details>/<summary>for collapsible sectionsTesting
make static-checkpassesmake typecheckpassesGenerated with
mux