本当のMVGの話をしよう
MVGはMagick Vector Graphicsの頭字語で、PostScriptに似たなにかだ。PDFやSVGに似ているという向きもあるだろう。しかし、それらだってPostScriptに似たなにかである。
実際のところ、ImageMagickに組みこまれたSVG解析器はSVGをMVGに変換する。MVGの処理に脆弱性があったら、SVGの処理に波及する。libRSVGを用いるようにビルドされていれば影響を受けない。
本質的にテキストファイルであるMVGを、ImageMagickはどのようにそれと判じるのか。ファイルの先頭にpush graphic-context
と書かれていたら、MVGであると断ずるのだ。
MSLはXMLって本当ですか?
MSLはMagick Scripting Languageの頭字語で、XMLで処理を書きつらねていくものらしい。DTDやスキーマを探したけれど、見つけられなかった。そんなものはどこにも存在しないのだろう。
SAXでXMLを解析している。MSLStartElement
を読めば、どのような要素の出現が期待されているか判る。しかし、六千八百二十八行ある関数を読むには、黄金週間は短すぎる。
MSLEndElement
ならば九十八行である。</comment>
, </group>
, </image>
, </label>
, </msl>
が解析されるようだ。
幸か不幸か、ファイルの中身からMSLを判別する魔法はない。ImageMagickはそれがMSLだと指示されたときに、それをMSLとして扱う。
奇跡も、魔法も、あるんだよ
なにがないかは先刻ご承知のとおり。
ImageTragickの緩和策として、入力が期待される画像形式かどうか、マジックバイトを検査してから、ImageMagickに処理を渡す方法が提案されている。ホワイトリストが定義可能であるならば、この方法は妥当である。
ホワイトリストが定義できなかったとしたら、しかし、どうだろう。ImageMagickがMVGまたはMSLとして処理する可能性を先だってつぶしてまわることになる。
- ファイルの先頭に
push graphic-context
と書かれていたら、MVGとして扱われる。 - 拡張子や擬似スキーマでMVGと指示されるならば、MVGとして扱われる。
- 拡張子や擬似スキーマでMSLと指示されるならば、MSLとして扱われる。
全てのXMLを生まれる前に消し去りたい。