hacktricks/network-services-pentesting/pentesting-web/imagemagick-security.md
2023-07-07 23:42:27 +00:00

15 KiB
Raw Blame History

ImageMagickセキュリティ

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

この投稿は https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html からコピーされました。

監査中に、ImageMagickのセキュリティポリシー設定ファイル(policy.xmlに偶然出くわすことがあります。これは、ライブラリが消費するリソースとデフォルトの動作を制限するのに役立ちます。実際には、これらのファイルには、インターネット上からカーゴカルチャーされた多くの推奨事項が含まれていることがよくあります。これは通常、次の2つの理由によるものです。

  • オンラインドキュメントページでは、ポリシーによって許可される各セキュリティディレクティブが何を制御しているのかが明確に示されておらず、オプションは一般的に説明されています。ポリシーで定義可能なオプションの複雑さと細かさが初心者の主な障害ですが、対応する知識ベースはもっと使いやすくなる可能性があります。ImageMagickはデフォルトで制限のないポリシーを持っており、開発者は使用に応じて調整する必要があります。ドキュメントによると、「これにより、Dockerインスタンスやファイアウォールの背後など、セキュリティリスクが公開ウェブサイトと比較して大幅に低減された環境で実行されるImageMagickインストールに最大の有用性が提供されます」とのことです。セキュリティの厳しいポリシーも提供されていますが、過去に指摘されたように、常に適切に設定されているわけではありません。
  • ImageMagickは100以上の主要なファイル形式(サブフォーマットを含まない)の画像形式をサポートしています。これまでのライブラリに影響を与えた悪名高い脆弱性により、対応策として影響を受ける形式と機能を除外するポリシーアイテムの追加が行われました(2016年のImageTragick2018年の@tavisoのGhostScriptによるRCE2020年の@insertScriptのPDFパスワードによるシェルインジェクション2021年の@alexisdanizanのもの)。

より安全なポリシーへ

これを踏まえ、ImageMagickのセキュリティポリシーパーサーが受け入れるすべてのオプションの効果を調査し、開発者とセキュリティチームの両方がこれらのファイルの設計と監査を支援するためのツールを作成することにしました。利用可能なオプションの数とすべての安全でない設定を明示的に拒否する必要があるため、これは通常手作業で行われますが、これによりポリシーの強度を損なう微妙なバイパスを特定できない場合があります。また、動作するように見えるが、実際にはセキュリティ上の利益を提供しないポリシーを設定することも簡単です。このツールのチェックは、開発者がポリシーを強化し、アプリケーションのセキュリティを向上させるための私たちの研究に基づいており、ポリシーが意味のあるセキュリティ上の利益を提供し、攻撃者によって回避されることがないことを確認します。

ツールはimagemagick-secevaluator.doyensec.com/で見つけることができます。

ホワイトリスト対ブラックリストアプローチ

オンラインで見つかるいくつかの安全なように見えるポリシーでは、次のような安全でないコーダーのリストが指定されています:

...
<policy domain="coder" rights="none" pattern="EPHEMERAL" />
<policy domain="coder" rights="none" pattern="EPI" />
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="none" pattern="MSL" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="PDF" />
<policy domain="coder" rights="none" pattern="PLT" />
<policy domain="coder" rights="none" pattern="PS" />
<policy domain="coder" rights="none" pattern="PS2" />
<policy domain="coder" rights="none" pattern="PS3" />
<policy domain="coder" rights="none" pattern="SHOW" />
<policy domain="coder" rights="none" pattern="TEXT" />
<policy domain="coder" rights="none" pattern="WIN" />
<policy domain="coder" rights="none" pattern="XPS" />
...

ImageMagick 6.9.7-7では、非公開の変更が行われました。ポリシーパーサーの動作が変更され、ポリシー内に少なくとも1つのnoneパーミッションルールがある場合にはコーダーの使用を許可しないようになりました。代わりに、ポリシー内の最後にマッチするルールをコーダーに対して適用するようになりました。これにより、モダンなポリシーではホワイトリストアプローチを採用することが可能であり、まずすべてのコーダーに対してrightsを拒否し、検証済みのコーダーのみを有効にすることができます。より安全なポリシーは以下のように指定されます:

...
<policy domain="delegate" rights="none" pattern="*" />
<policy domain="coder" rights="none" pattern="*" />
<policy domain="coder" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" />
...

大文字と小文字の区別

以下のディレクティブを考えてみましょう:

...
<policy domain="coder" rights="none" pattern="ephemeral,epi,eps,msl,mvg,pdf,plt,ps,ps2,ps3,show,text,win,xps" />
...

これにより、変換は許可され続けます。ポリシーパターンは大文字と小文字を区別するため、コーダーとモジュールは常に大文字で指定する必要があります「EPS」ではなく「eps」

リソース制限

ImageMagickのサービス拒否攻撃は非常に簡単に実行できます。新しいペイロードを取得するためには、最近のGithubリポジトリで報告された問題の中から「oom」や類似のキーワードを検索することが便利です。これは、潜在的に悪意のある入力を受け入れるImageMagickインスタンス通常の場合が常に攻撃の対象になる可能性があるため、問題です。そのため、ツールはポリシーによって明示的に適切な制限が設定されていない場合にも報告します。

ポリシーの断片化

ポリシーが定義されたら、ポリシーファイルが効果を発揮していることを確認することが重要です。ディストリビューションにバンドルされたImageMagickパッケージや複数のパッケージマネージャを介してインストールされた依存関係によって、干渉し合う異なるポリシーが指定される場合があります。ローカルマシンでのfindコマンドを使用すると、複数のpolicy.xmlファイルの出現箇所を特定できます:

$ find / -iname policy.xml

# Example output on macOS
/usr/local/etc/ImageMagick-7/policy.xml
/usr/local/Cellar/imagemagick@6/6.9.12-60/etc/ImageMagick-6/policy.xml
/usr/local/Cellar/imagemagick@6/6.9.12-60/share/doc/ImageMagick-6/www/source/policy.xml
/usr/local/Cellar/imagemagick/7.1.0-45/etc/ImageMagick-7/policy.xml
/usr/local/Cellar/imagemagick/7.1.0-45/share/doc/ImageMagick-7/www/source/policy.xml

# Example output on Ubuntu
/usr/local/etc/ImageMagick-7/policy.xml
/usr/local/share/doc/ImageMagick-7/www/source/policy.xml
/opt/ImageMagick-7.0.11-5/config/policy.xml
/opt/ImageMagick-7.0.11-5/www/source/policy.xml

ポリシーは、-limit CLI引数、MagickCore APIメソッド、または環境変数を使用して設定することもできます。

初心者向けの制限のあるポリシー

公式ドキュメントで説明されている最も制限のあるポリシーを出発点に、私たちの観察結果をすべて集約した制限のあるポリシーを設計しました。

<policymap xmlns="">
<policy domain="resource" name="temporary-path" value="/mnt/magick-conversions-with-restrictive-permissions"/> <!-- the location should only be accessible to the low-privileged user running ImageMagick -->
<policy domain="resource" name="memory" value="256MiB"/>
<policy domain="resource" name="list-length" value="32"/>
<policy domain="resource" name="width" value="8KP"/>
<policy domain="resource" name="height" value="8KP"/>
<policy domain="resource" name="map" value="512MiB"/>
<policy domain="resource" name="area" value="16KP"/>
<policy domain="resource" name="disk" value="1GiB"/>
<policy domain="resource" name="file" value="768"/>
<policy domain="resource" name="thread" value="2"/>
<policy domain="resource" name="time" value="10"/>
<policy domain="module" rights="none" pattern="*" />
<policy domain="delegate" rights="none" pattern="*" />
<policy domain="coder" rights="none" pattern="*" />
<policy domain="coder" rights="write" pattern="{PNG,JPG,JPEG}" /> <!-- your restricted set of acceptable formats, set your rights needs -->
<policy domain="filter" rights="none" pattern="*" />
<policy domain="path" rights="none" pattern="@*"/>
<policy domain="cache" name="memory-map" value="anonymous"/>
<policy domain="cache" name="synchronize" value="true"/>
<!-- <policy domain="cache" name="shared-secret" value="my-secret-passphrase" stealth="True"/> Only needed for distributed pixel cache spanning multiple servers -->
<policy domain="system" name="shred" value="2"/>
<policy domain="system" name="max-memory-request" value="256MiB"/>
<policy domain="resource" name="throttle" value="1"/> <!-- Periodically yield the CPU for at least the time specified in ms -->
<policy xmlns="" domain="system" name="precision" value="6"/>
</policymap>

セキュリティポリシーがアクティブであることをidentifyコマンドを使用して確認できます:

identify -list policy
Path: ImageMagick/policy.xml
...

上記のポリシーを使用して、カスタマイズされたポリシーを開発中に評価ツールを使用することもできます。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥