HTML パーサー自作で理解する mXSS (CVE-2019-16728・CVE-2020-6413 篇)
Mutation XSS を利用した DOMPurify < 2.0.1 のバイパス (CVE-2019-16728・CVE-2020-6413) のメカニズムを、HTML パーサーを実装する観点から解剖する。HTML パーサーの仕様・実装を読み解き、「なぜその挙動になるのか」の理解を試みる。
Mutation XSS を利用した DOMPurify < 2.0.1 のバイパス (CVE-2019-16728・CVE-2020-6413) のメカニズムを、HTML パーサーを実装する観点から解剖する。HTML パーサーの仕様・実装を読み解き、「なぜその挙動になるのか」の理解を試みる。
Go の iter.Seq の定義は、見慣れないもののようで、見慣れていて、見慣れていた。
このブログを構築する過程の紆余曲折を綴ります。
最近、『[作って学ぶ]ブラウザのしくみ』という本を参考に自作ブラウザをちまちま作っている。今は HTML パーサーの章まで進めたところなのでまだブラウザと呼べるものではないものの。 ところで自作ブラウザの要素の一つとして HTML パーサーをせっかく作ったので、ずっと苦手意識を持っていた mXSS 的な問題の理解を、HTML パーサー自作を通して深めたいと思った。 去年の11月に公開された Flatt Security XSS Challenge の1問目はまさに、コンテキストの違いによる HTML パースのズレによって DOMPurify によるサニタイズを潜り抜けて XSS をする challenge だった。そこでこの challenge を題材に HTML パースの仕様に deep dive して、パース結果がズレるメカニズムを理解したいと思う。