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

  • 25
    Like
  • 4
    Comment

インターネット一般を眺めると、ImageTragickの緩和策としてpolicy.xmlで危険なコーダを禁止するという方法が示されている。

ImageMagickのChangeLogによれば、policy.xmlは、ちょうど七年前、二〇〇九年五月四日に6.5.2-1で初めてサポートされたという。

手元のCentOS 5を眺める。インストールされているRPMはImageMagick-6.2.8.0-15.el5_8である。どうして、いまだにCentOS 5なんて使っているのだろう。ビジネスだからだ。ビジネスだったらしかたがない。ともあれ、このバージョンではpolicy.xmlは使えない。やれやれ。

さて、どうしてくれようか。ソフトウェアのバージョンを変えずにやりすごす方法を沈思黙考する。緩和策policy.xmlを眺める。

<policymap>
    <policy domain="coder" rights="none" pattern="EPHEMERAL" />
    <policy domain="coder" rights="none" pattern="URL" />
    <policy domain="coder" rights="none" pattern="HTTPS" />
    <policy domain="coder" rights="none" pattern="MVG" />
    <policy domain="coder" rights="none" pattern="MSL" />
</policymap>

すなわち、EPHEMERAL,URL,HTTPS,MVG,MSLというコーダを禁止している。EPHEMERALは昔は存在していなかったようだ。だとすると、残りの四個を動かなくしてやればいい。

まず、HTTPSを禁止しよう。これはdelegates.xmlで禁止してやればよいだろう。手元の環境ではふたつ存在していた。

/usr/lib64/ImageMagick-6.2.8/config/delegates.xml
/usr/lib/ImageMagick-6.2.8/config/delegates.xml

それぞれのdelegates.xmlから、次の一行を削除する(いっそ<delegatemap>の中身を空にしてもよいかもしれぬ)。

  <delegate decode="https" command='"wget" -q -O "%o" "https:%M"' />

残りのURL,MVG,MSLを設定ファイルでどうにかするのは無理であるように思われた。ありがたいことに、しかし、それらはそれぞれ共有リンクライブラリになっていた。こいつらをどこかに投げやってしまえばよい。

/usr/lib64/ImageMagick-6.2.8/modules-Q16/coders/msl.la
/usr/lib64/ImageMagick-6.2.8/modules-Q16/coders/msl.so
/usr/lib64/ImageMagick-6.2.8/modules-Q16/coders/mvg.la
/usr/lib64/ImageMagick-6.2.8/modules-Q16/coders/mvg.so
/usr/lib64/ImageMagick-6.2.8/modules-Q16/coders/url.la
/usr/lib64/ImageMagick-6.2.8/modules-Q16/coders/url.so
/usr/lib/ImageMagick-6.2.8/modules-Q16/coders/msl.la
/usr/lib/ImageMagick-6.2.8/modules-Q16/coders/msl.so
/usr/lib/ImageMagick-6.2.8/modules-Q16/coders/mvg.la
/usr/lib/ImageMagick-6.2.8/modules-Q16/coders/mvg.so
/usr/lib/ImageMagick-6.2.8/modules-Q16/coders/url.la
/usr/lib/ImageMagick-6.2.8/modules-Q16/coders/url.so

これにて、とりあえず、PoCは動かなくなった。

【二〇一六年五月六日追記】

ImageMagick Filtering Vulnerability - CVE-2016-3714のResolveのRHEL 5のMitigationでは、mvg.so, msl.so, label.soをリネームしている。CVE-2016-3717を防ぐためにlabel.soをリネームするというわけみたい。