LoginSignup
2

More than 5 years have passed since last update.

policy.xmlが使えない古いImageMagickでImageTragickを回避する (3)

Posted at

第一話はこちら
第二話はこちら

本当の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として処理する可能性を先だってつぶしてまわることになる。

  1. ファイルの先頭にpush graphic-contextと書かれていたら、MVGとして扱われる。
  2. 拡張子や擬似スキーマでMVGと指示されるならば、MVGとして扱われる。
  3. 拡張子や擬似スキーマでMSLと指示されるならば、MSLとして扱われる。

全てのXMLを生まれる前に消し去りたい。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2