🐈‍⬛

Zennで見つけたXSSとmarkdown-it

2021/12/29に公開

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 の値がエスケープされていなかったためですね。

https://github.com/jGleitz/markdown-it-prism/pull/137
https://snyk.io/vuln/SNYK-JS-MARKDOWNITPRISM-1040462

markdown-it-texmath

Katexの文法でエラーが発生した際の出力がエスケープされていなかったため、エラーをわざと発生させてその中に攻撃コードを入れるとXSSとなりました。

https://github.com/goessner/markdown-it-texmath/pull/22
https://snyk.io/vuln/SNYK-JS-MARKDOWNITTEXMATH-1040463

markdown-itのplugin

その後、しばらくしてからnpmに公開されているmarkdown-itのpluginをよく利用されているものから順にまとめて確認しました。
https://www.npmjs.com/search?q=keywords%3Amarkdown-it-plugin&page=1&perPage=20&ranking=popularity

このタイミングの前後でhackeroneのNode.js third-party modulesが閉じられてしまい報告先に困りましたが、Synk社の脆弱性報告フォーム (https://snyk.io/vulnerability-disclosure/) から報告し、CVEが割り当てられました。

修正された脆弱性も受け付けているようでしたので、ついでにmarkdown-it-prismとmarkdown-it-texmathについても報告しました。

脆弱性DBの同期がどういう扱いになっているかよくわからないのですが、これらはGithub advisoryには2021年12月末時点では記載されていないため、 npm audit を使った検査でも検出できないようです。 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)

markdown-it-decorateとmarkdown-it-tocについては現在メンテナンスされていないようで、修正はリリースされない可能性があります。他にもmarkdown-it-katexについてもXSSが報告されていますが、いまだ修正がリリースされていません。https://github.com/waylonflinn/markdown-it-katex/pull/31

markdown-it、または他のmarkdownライブラリであっても、サービス内で使う場合は既存の脆弱性について確認をしておいたほうが良いでしょう。

Discussion