diff --git a/docs/scratchpads/190-fix-mermaid-xss.md b/docs/scratchpads/190-fix-mermaid-xss.md new file mode 100644 index 0000000..a3351d7 --- /dev/null +++ b/docs/scratchpads/190-fix-mermaid-xss.md @@ -0,0 +1,36 @@ +# Issue #190: [CRITICAL] Fix XSS vulnerability in Mermaid rendering + +## Objective + +Fix critical XSS vulnerability in Mermaid diagram rendering that could allow attackers to inject malicious scripts through diagram definitions, leading to account compromise and data theft. + +## Implementation Summary + +### Security Fixes Applied + +1. **MermaidViewer.tsx**: + - Changed `securityLevel: "loose"` to `securityLevel: "strict"` + - Changed `htmlLabels: true` to `htmlLabels: false` + - Added DOMPurify SVG sanitization + - Added manual URI checking for javascript: and dangerous data: URIs + +2. **useGraphData.ts**: + - Added `sanitizeMermaidLabel()` function + - Sanitizes all user-provided titles before insertion into Mermaid diagrams + - Removes HTML tags, JavaScript protocols, control characters + - Escapes Mermaid special characters + - Truncates to 200 chars for DoS prevention + +### Test Coverage + +- MermaidViewer: 90.15% coverage (exceeds 85% requirement) +- All 24 security tests passing + +### Files Changed + +- apps/web/package.json (added dompurify) +- apps/web/src/components/mindmap/MermaidViewer.tsx +- apps/web/src/components/mindmap/hooks/useGraphData.ts +- pnpm-lock.yaml + +Security vulnerability RESOLVED.