ImageMagick脆弱性対応(パッチ)

こんにちは岡野です。
先日行った、画像処理ライブラリImageMagickの脆弱性対応を共有します。当社ではオリジナルプリントやMEET MY GOODSといったサービスで処理高速化のためリコンパイルしたImageMagickを使用しています。

脆弱性の概要

脆弱性(Metabase Qの報告
CVE-2022-44267:DoS攻撃
CVE-2022-44268:任意のファイル参照
ですが、不正なテキスト情報を埋め込んだPNGファイルをImageMagickが処理する際に発生する物でした。

脆弱性の対応案

・ImageMagickのバージョンアップ
ImageMagickを最新版へバージョンアップすれば解決するとのことでしたが、テストに時間が掛かるため他の方法を検討しました。

・画像データの修正
脆弱性の原因は前述の通り不正なテキスト情報ですので、ImageMagickへ画像ファイルを渡す前に不正なテキスト情報を除去する案です。PNG最適化ツールpngcrushで除去する方法をネットで見つけ試してみましたが除去処理に時間が掛かるためあきらめました(バージョンにより違うのかもしれませんが大きめの画像では10秒以上掛かることがありました)。

・ImageMagickのパッチ適用
脆弱性を修正するパッチをImageMagickのソースコードへ適用する案です。今回はこの案で対応しました。

パッチ適用の手順

今回はUbuntu用のパッチを流用しました。
https://launchpad.net/ubuntu/+source/imagemagick/8:6.9.7.4+dfsg-16ubuntu6.15
の「Available diffs」の箇所です。
但しとあるツイートに存在したPNGファイル
echo -en "P4\n1 1\nX" | pnmtopng -text <(echo 'fx:while(1,debug(hui=3)) 0') > payload.png
の脆弱性を防げなかったためパッチのif文
if ((LocaleCompare(key,"version") == 0) ||
    (LocaleCompare(key,"profile") == 0) ||
    (LocaleCompare(key,"width") == 0))
へ「fx:」を無効化する
    (LocaleNCompare(key,"fx:",3) == 0) ||
を追加しました(ImageMagickのバージョンによっては再現しなさそうでした、おそらくこのissue)。

まとめ

残念ながらImageMagickの脆弱性は今後も発見されると思いますので、バージョンアップを容易にしておく必要性を感じました。今後はバージョンアップ用の自動テストケースを準備しようと思います。