Zennで見つけたXSSとmarkdown-it
1年以上前、リリース直後ぐらいのZennでXSSを見つけた話です。
経験的にはmarkdownをカスタマイズしているサービスは大抵XSSがある……ということでZennのmarkdown記法を確認しながらガチャガチャやっていると見つけました。Zenn自体はReactで書かれているのでXSSは起きにくいのですが、Zennで使用しているmarkdown-itのplugin側に脆弱性がありました。
発見時はZennのeditorのコードがGithubで公開されていることに気づいていなかったので、Zennの問い合わせフォーム経由で報告したところ、catnoseさんによりその日の深夜に修正されて、翌日にはplugin側への修正PRも作成されていました。
markdown-it-prism
コードブロックの言語指定の部分に "
をいれると以降の部分にHTMLを記述できました。lang
の値がエスケープされていなかったためですね。
markdown-it-texmath
Katexの文法でエラーが発生した際の出力がエスケープされていなかったため、エラーをわざと発生させてその中に攻撃コードを入れるとXSSとなりました。
markdown-itのplugin
その後、しばらくしてからnpmに公開されているmarkdown-itのpluginをよく利用されているものから順にまとめて確認しました。
このタイミングの前後でhackeroneのNode.js third-party modulesが閉じられてしまい報告先に困りましたが、Synk社の脆弱性報告フォーム (https://snyk.io/vulnerability-disclosure/) から報告し、CVEが割り当てられました。
- markdown-it-highlightjs - CVE-2020-7773
- markdown-it-decorate - CVE-2020-28459
- markdown-it-toc - CVE-2020-28455
修正された脆弱性も受け付けているようでしたので、ついでにmarkdown-it-prismとmarkdown-it-texmathについても報告しました。
脆弱性DBの同期がどういう扱いになっているかよくわからないのですが、これらはGithub advisoryには2021年12月末時点では記載されていないため、 2022年の間にGitHub Advisory Databaseにもそれぞれ登録されてれていたようです(markdown-it-toc GHSA-wfvx-fx73-3rfj,markdown-it-highlightjs GHSA-f246-xrrj-g8j6,markdown-it-decorate GHSA-rhf5-2378-3w3w)npm audit
を使った検査でも検出できないようです。
markdown-it-decorateとmarkdown-it-tocについては現在メンテナンスされていないようで、修正はリリースされない可能性があります。他にもmarkdown-it-katexについてもXSSが報告されていますが、いまだ修正がリリースされていません。https://github.com/waylonflinn/markdown-it-katex/pull/31
markdown-it、または他のmarkdownライブラリであっても、サービス内で使う場合は既存の脆弱性について確認をしておいたほうが良いでしょう。
Discussion