Während der Prototyping-Phase wurde die Sicherheit des PDF-Exports überprüft.
Da für die PDF-Exports ein Browser am Server mit User-Content ausgeführt wird, gibt es die Gefahr, dass ein Angreifer Javascript-Execution bekommen könnte und somit auf das interne Netzwerk zugreifen kann.
Um dafür Sicherheit zu schaffen, haben sich zwei externe Kolleg:innnen (Benjamin Komar, TUW und Katharina Divos, FHSTP) bereiterklärt, White-Box-Test an einem Prototypen durchzuführen.
Dabei wurde eine Schwachstelle im KaTeX-Rendering gefunden. Bei einem fehlerhaften KaTeX-Input wird der Input in roter Farbe im Output von markdown-it markiert.
Error-Handling, das den fehlerhaften Output rot markiert:
md.renderer.rules.latex_inline = (tokens, index) => {
const content = tokens[index].content;
try {
return katex.renderToString(content);
} catch {
return `<span style="color: red">${content}</span>`;
}
};
Das KaTeX-Rendering wird mit markdown-it implementiert. Bei einem zusätzlichen selbsterstellten Renderer in markdown-it wird die sonst standardmäßig aktivierte Sanitization von markdown-it übersprungen. Das Problem ist, dass im catch-Block der Userinput ohneweiters übernommen wird. So kann über z.B. ein fehlerhaftes Bild JS-Exection erreicht werden.
Beispiel-Input: $\<img src="notfound" onerror="document.body.innerHTML = 'ALERT'"></img>$
Als Lösung wird nun DOMPurify von Cure53 als Sanitizer im Frontend und Backend verwendet.