セキュリティポリシー
セキュリティポリシー • セキュリティポリシーの例 • ピクセルキャッシュ同期ポリシー • ゼロコンフィグレーションセキュリティポリシー • その他のセキュリティ上の考慮事項
ImageMagick のセキュリティポリシー
ImageMagick を利用する前に、ローカル環境に適したセキュリティポリシーを確立してください。ImageMagick のセキュリティモデルは「拒否されない限りすべて許可」であり、最後にマッチしたポリシーが優先されます。新しいルールを追加する際は注意してください。後のポリシーは、先の deny や allow を上書きできます。広範な deny ルールを先に置き、その後に個別の例外を続け、意図しない許可を避けるために順序を見直してください。
ImageMagick は意図的に既定で開放的であり、その設計上の選択は、Docker コンテナや他のサンドボックス化されたデプロイメントなど、管理された環境での主要な利用を反映しています。
セキュリティには常に、潜在的な脆弱性からの保護と、作業を片付けるという実務上の必要との釣り合いを取ることが伴います。ImageMagick では、その釣り合いを調整する仕組みがセキュリティポリシーです。厳格な締め付けと運用上の利便性の間の調整点として働き、環境内でどの機能・コーダー・操作を許可するかを決められます。
よく設計されたポリシーでは、次のことができます:
- 高リスクのコーダーや操作を制限または無効化する。
- リソース使用量を制約して悪用を防ぐ。
- ImageMagick が処理してよい入力の種類を正確に定める。
- 画一的な構成を押し付けるのではなく、システムを自分の脅威モデルに合わせる。
この柔軟性は意図的なものです。ImageMagick は開放的な状態で出荷されるので、管理された環境・コンテナ・パイプライン・隔離されたサーバーに組み込めます。管理者はそのうえで、ニーズに合わせてポリシーを引き締めます。信頼できない入力を扱う見込みが大きいほど、ポリシーは制限的にすべきです。
最適なセキュリティを確保するには、ImageMagick を GIF・JPEG・PNG のような web セーフな画像フォーマットの読み書きだけに制限できます。あるいは、ローカル環境や組織のポリシーのニーズに合わせてセキュリティポリシーをカスタマイズできます。このポリシーには、メモリ使用量の上限、読み書きを許可するパス、シーケンス内の画像数の上限、ワークフローの最大実行時間、画像ピクセル用に許可するディスク容量、リモート接続用の秘密パスフレーズ、許可・拒否するコーダーといった詳細を含められます。セキュリティポリシーをカスタマイズすることで、環境を保護し、たとえば大きな画像による過負荷を防ぐなど、ImageMagick がローカルシステムの責任ある一員となるよう保てます。
潜在的に有害な状況を防ぐため、ImageMagick のリソース使用量に制限を設けることが重要です。たとえば、非常に大きな画像(例: 20000×20000 ピクセル)を生成するよう細工された画像をインターネットから誤ってダウンロードした場合、ImageMagick は必要なリソース(メモリやディスク容量など)を確保しようとし、システムがその要求を拒否したりプログラムが終了したりすることがあります。あるいは、コンピューターが一時的に遅くなったり応答しなくなったり、ImageMagick が中断を強いられたりすることがあります。こうした状況を避けるため、policy.xml 設定ファイルに制限を設定できます。
ある環境で妥当とされるものが、別の環境では適切でないことがある点に留意してください。たとえば、あなたは ImageMagick を安全な環境でサンドボックス化しているかもしれませんが、別の人は公開 Web サイトで画像処理に使っているかもしれません。あるいは、ImageMagick が大容量メモリのホストで動いている一方、別のインスタンスがリソースの限られたデバイスで動いているかもしれません。大容量メモリのホストでは大きな画像処理を許可するのが理にかなっていても、リソースの限られたデバイスではそうではありません。公開 Web サイトで ImageMagick を使う場合は、MVG や HTTPS などの特定のコーダーを無効にしてセキュリティを高めるとよいでしょう。
手始めとして、バージョン 7.1.1-16 以降、ImageMagick はインストール時に選択できるセキュリティポリシーを提供しています。次から選べます:
- open
- ImageMagick インストールの既定ポリシーは open セキュリティポリシーです。これはファイアウォールで保護された環境や Docker コンテナ内など、安全な設定での使用を想定しています。この枠組みでは、ImageMagick はリソースと機能へ広くアクセスできます。このポリシーは画像操作に便利で柔軟な選択肢を提供します。ただし、規制の緩い条件下ではセキュリティ脆弱性を生む可能性がある点に注意が必要です。したがって、組織は自らのユースケースとセキュリティ要件に応じて、open ポリシーの妥当性を十分に評価すべきです。
- limited
- limited セキュリティポリシーの主目的は、利便性とセキュリティの中間点を見つけることです。このポリシーは、SVG や HTTP などの特定のコーダーといった潜在的に危険な機能を無効化します。さらに、メモリ・ストレージ・処理時間などのリソース利用にいくつかの制約(いずれも調整可能)を設けます。このポリシーは、悪意ある、あるいは要求の高い画像を扱う潜在的脅威を軽減しつつ、一般的な画像フォーマットに不可欠な機能を保持する必要がある状況で有用です。
- secure
- この厳格なセキュリティポリシーは、ImageMagick 使用時に極めて安全な環境を確立するため、厳重な制御と制限されたリソース利用の実装を優先します。SVG や HTTP などの特定のコーダーを含む、危険となりうる機能を無効化します。このポリシーは、ローカル環境の要件や組織のガイドラインに合わせてセキュリティ対策を調整することを促します。このプロトコルは、メモリ消費の制限、読み書きを認可するパス、画像シーケンスの上限、ワークフローの最大許容時間、画像データ用のディスク容量割り当て、さらにはリモート接続用の非公開パスフレーズといった明示的な詳細を含みます。この堅牢なポリシーを採用することで、組織は全体的なセキュリティ態勢を高め、潜在的な脆弱性を緩和できます。
- websafe
- web セーフな利用向けに設計されたこのセキュリティプロトコルは、ImageMagick が Web サイトなど公開されたコンテキストで使われる状況に焦点を当てます。GIF・JPEG・PNG のような web セーフフォーマット以外の画像フォーマットの読み書き機能を無効化します。さらに、このポリシーは画像フィルタの実行と間接読み込みを禁止し、潜在的なセキュリティ侵害を阻止します。これらの制限を実装することで、websafe ポリシーは公開システムの保護を強化し、ImageMagick の機能が攻撃に悪用されるリスクを低減します。
Linux では、configure スクリプトのオプション --with-security-policy={open, limited, secure, websafe} でポリシーを選択します。Windows では、configure アプリの実行時に選択肢が提示されます。
policy.xml 設定ファイルの各ルールを見直すことをおすすめします。組織の要件に応じてパラメータを調整してください。セキュリティニーズに基づいて、許可する画像フォーマットの変更、特定パスの設定、特定操作の制限ができます。セキュリティポリシーのカスタマイズは、機能性とセキュリティの微妙なバランスである点を忘れないでください。過度に制限的なポリシーは正当な画像処理を妨げ、過度に寛容なポリシーは脆弱性を生みます。
Doyensec は、セキュリティポリシーの設計と監査を支援するポリシー評価ツールを提供しています。ツールは imagemagick-secevaluator.doyensec.com にあります。
セキュリティポリシーの例
セキュリティポリシーの例を示します:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policymap [
<!ELEMENT policymap (policy)*>
<!ATTLIST policymap xmlns CDATA #FIXED "">
<!ELEMENT policy EMPTY>
<!ATTLIST policy xmlns CDATA #FIXED "">
<!ATTLIST policy domain NMTOKEN #REQUIRED>
<!ATTLIST policy name NMTOKEN #IMPLIED>
<!ATTLIST policy pattern CDATA #IMPLIED>
<!ATTLIST policy rights NMTOKEN #IMPLIED>
<!ATTLIST policy stealth NMTOKEN #IMPLIED>
<!ATTLIST policy value CDATA #IMPLIED>
]>
<!--
Creating a security policy that fits your specific local environment
before making use of ImageMagick is highly advised. You can find guidance on
setting up this policy at https://imagemagick.org/security-policy/,
and it's important to verify your policy using the validation tool located
at https://imagemagick-secevaluator.doyensec.com/. We also strongly
recommend that all users validate their security assumptions by testing their
configurations after making any policy changes. This helps ensure that the
intended restrictions are functioning as expected in their specific
deployment environment.
Web-safe ImageMagick security policy:
This security protocol designed for web-safe usage focuses on situations
where ImageMagick is applied in publicly accessible contexts, like websites.
It deactivates the capability to read from or write to any image formats
other than web-safe formats like GIF, JPEG, and PNG. Additionally, this
policy prohibits the execution of image filters and indirect reads, thereby
thwarting potential security breaches. By implementing these limitations,
the web-safe policy fortifies the safeguarding of systems accessible to
the public, reducing the risk of exploiting ImageMagick's capabilities
for potential attacks.
-->
<policymap>
<!-- Set maximum parallel threads. -->
<policy domain="resource" name="thread" value="2"/>
<!-- Set maximum time in seconds or mnemonics, e.g. "2 minutes". When this
limit is exceeded, an exception is thrown and processing stops. -->
<policy domain="resource" name="time" value="60"/>
<!-- Set maximum number of open pixel cache files. When this limit is
exceeded, any subsequent pixels cached to disk are closed and reopened
on demand. -->
<policy domain="resource" name="file" value="768"/>
<!-- Set maximum amount of memory in bytes to allocate for the pixel cache
from the heap. When this limit is exceeded, the image pixels are cached
to memory-mapped disk. -->
<policy domain="resource" name="memory" value="256MiB"/>
<!-- Set maximum amount of memory map in bytes to allocate for the pixel
cache. When this limit is exceeded, the image pixels are cached to
disk. -->
<policy domain="resource" name="map" value="512MiB"/>
<!-- Set the maximum width * height of an image that can reside in the pixel
cache memory. Images that exceed the area limit are cached to disk. -->
<policy domain="resource" name="area" value="16KP"/>
<!-- Set maximum amount of disk space in bytes permitted for use by the pixel
cache. When this limit is exceeded, the pixel cache is not be created
and an exception is thrown. -->
<policy domain="resource" name="disk" value="1GiB"/>
<!-- Set the maximum length of an image sequence. When this limit is
exceeded, an exception is thrown. -->
<policy domain="resource" name="list-length" value="16"/>
<!-- Set the maximum width of an image. When this limit is exceeded, an
exception is thrown. -->
<policy domain="resource" name="width" value="4KP"/>
<!-- Set the maximum height of an image. When this limit is exceeded, an
exception is thrown. -->
<policy domain="resource" name="height" value="4KP"/>
<!-- Periodically yield the CPU for at least the time specified in
milliseconds. -->
<policy domain="resource" name="throttle" value="2"/>
<!-- Dynamically yield the CPU relative to the system load average. -->
<policy domain="resource" name="dynamic-throttle" value="false"/>
<!-- Do not create temporary files in the default shared directories, instead
specify a private area to store only ImageMagick temporary files. -->
<!-- <policy domain="resource" name="temporary-path" value="/magick/tmp"/> -->
<!-- Force memory initialization by memory mapping select memory
allocations. -->
<policy domain="cache" name="memory-map" value="anonymous"/>
<!-- Ensure all image data is fully flushed and synchronized to disk. -->
<policy domain="cache" name="synchronize" value="true"/>
<!-- Replace passphrase for secure distributed processing -->
<!-- <policy domain="cache" name="shared-secret" value="secret-passphrase" stealth="true"/> -->
<!-- Do not permit any external delegates to execute. -->
<policy domain="delegate" rights="none" pattern="*"/>
<!-- Do not permit any image filters to load. -->
<policy domain="filter" rights="none" pattern="*"/>
<!-- Don't read/write from/to stdin/stdout. -->
<policy domain="path" rights="none" pattern="-"/>
<policy domain="path" rights="none" pattern="[Ff][Dd]:*"/>
<!-- Sensitive paths are not permitted. -->
<policy domain="path" rights="none" pattern="/etc/*"/>
<!-- Relative paths are not permitted. -->
<policy domain="path" rights="none" pattern="*../*"/>
<!-- Indirect reading is not permitted. -->
<policy domain="path" rights="none" pattern="@*"/>
<!-- Deny all image modules and specifically exempt reading or writing
web-safe image formats. -->
<policy domain="module" rights="none" pattern="*" />
<policy domain="module" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" />
<!-- This policy sets the number of times to replace content of certain
memory buffers and temporary files before they are freed or deleted. -->
<policy domain="system" name="shred" value="1"/>
<!-- Enable the initialization of buffers with zeros, resulting in a minor
performance penalty but with improved security. -->
<policy domain="system" name="memory-map" value="anonymous"/>
<!-- Set the maximum amount of memory in bytes that is permitted for
allocation requests. -->
<policy domain="system" name="max-memory-request" value="256MiB"/>
<!-- If the basename of path is a symbolic link, the open fails -->
<policy domain="system" name="symlink" rights="none" pattern="follow"/>
<!-- Blocks all SVG entity‑substitution attempts by denying the
svg:substitute-entities define -->
<policy domain="system" name="svg" rights="none" pattern="substitute-entities"/>
</policymap>
複数のセッションを同時に処理する際に、1 つのセッションが利用可能なメモリをすべて消費しないよう、このポリシーでは大きな画像をディスクにキャッシュします。画像がピクセルキャッシュのディスク上限を超えると、プログラムは終了します。さらに、処理タスクが長く実行されすぎないよう時間制限が設定されています。画像の幅または高さが 8192 ピクセルを超える場合、または画像シーケンスが 32 フレームを超える場合、処理は停止して例外がスローされます。
ImageMagick 7.0.1-8 以降、任意の外部デリゲート、またはすべての外部デリゲート(パターンを "*" に設定)の使用を防げます。これ以前のリリースでは、coder ドメインを使い、rights を none に、glob パターンを HTTPS に設定して外部デリゲートの使用を防げます。さらに、ユーザーは画像フィルタの実行と間接読み込みを禁止されます。たとえばファイルからテキストを読み込みたい場合(例: caption:@myCaption.txt)は、この path ポリシーを無効にする必要があります。
ポリシーの glob パターンは、ImageMagick 7.1.1-16 より前では_大文字小文字を区別します_。期待どおりの動作を得るには、coder と module を大文字にする(例: "eps" ではなく "EPS")か、[Pp][Nn][Gg] のような大文字小文字を区別しないパターンを使う必要があります。
たとえば HTTPS コーダーを制限すると、次のような結果になります:
$ magick ../static/img/wizard.png wizard.jpg
convert: attempt to perform an operation not allowed by the security policy `HTTPS'
convert: no images defined `wizard.jpg'
ImageMagick バージョン 7.0.4-7 以降、実証済みの少数の web セーフ画像タイプを除き、すべての外部デリゲートとコーダーへのアクセスを簡便に拒否できます。例:
<policy domain="delegate" rights="none" pattern="*" />
<policy domain="module" rights="none" pattern="*" />
<policy domain="module" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" />
module ポリシーは、読み書き両方についてモジュール全体を有効化・無効化します。画像フォーマットの読みまたは書きだけを制御するには、代わりに coder ポリシーを使います。たとえば、いくつかの PostScript 関連フォーマットの読み込みだけを無効化し、書き込みは許可します:
<policy domain="coder" rights="write" pattern="{PDF,PS,PS2,PS3,XPS}" />
ImageMagick 7.0.7-0 以降、ピクセルキャッシュと一部の内部バッファを、ヒープからではなく匿名メモリマッピングで確保できます。その結果、ピクセルがゼロで初期化され、わずかな性能低下が生じます。また、解放・削除される前に特定のメモリバッファ(バージョン 7.1.0-38 が必要)や一時ファイルの内容を撹乱できます。shred 値は、内容をランダムデータで置き換える回数です。例:
<policy domain="system" name="memory-map" value="anonymous"/>
<policy domain="cache" name="memory-map" value="anonymous"/>
<policy domain="system" name="shred" value="1"/>
性能上の理由から、最初のパスは、バッファやファイルの内容を上書きするのに必要な分だけランダム列を繰り返すことで高速に行われます。以降のパスは桁違いに遅くなりますが、バッファやファイルの長さ分だけ暗号学的に強いランダムバイトを生成します。
一部の画像処理アルゴリズム(ウェーブレット変換など)は、完了に多大なメモリを消費することがあります。ImageMagick はこうした大きなリソース要求のために別のメモリプールを維持しており、7.0.6-1 以降では最大要求の上限を設定できます。上限を超えると、その確保は代わりにディスク上にメモリマップされます。ここではポリシーで最大メモリ要求を制限します:
<policy domain="system" name="max-memory-request" value="256MiB"/>
ImageMagick バージョン 7.0.4-23 以降、シーケンス内の最大画像数を制限できます。たとえば、画像シーケンスを最大 64 フレームに制限するには、次を使います:
<policy domain="resource" name="list-length" value="64"/>
なお、ポリシー内の数値は、オプションの SI 接頭辞を付けた浮動小数点数です(例: 10MiB)。
リソース制限とポリシー設定ファイルの詳細については、Resources と Architecture を参照してください。
ImageMagick 7.0.6-0 以降、SetMagickSecurityPolicy()(MagickCore)または MagickSetSecurityPolicy()(MagickWand)でプログラム的に ImageMagick のセキュリティポリシーを設定できます。
ImageMagick バージョン 7.0.8-11 以降、module セキュリティポリシーを設定できます。たとえば、PostScript や PDF の解釈を防ぐには、次を使います:
<policy domain="module" rights="none" pattern="{ps,pdf,xps}/>
ImageMagick バージョン 7.0-10-52 以降、font ポリシーを設定できます。ユーザーがフォントを指定しなかったときに ImageMagick が既定で使う Unicode フォントへのパスを指定します:
<policy domain="system" name="font" value="/usr/share/fonts/arial-unicode.ttf"/>
なお、ファイルパスの glob パターンでは、特殊文字として解釈される文字をエスケープするためにバックスラッシュ(\)を使います。例:
<policy domain="path" rights="none" pattern="c:\\\\*"/>
ポリシーの変更が有効になっているかは、次のコマンドで確認できます:
$ magick identify -list policy
Path: ImageMagick-7/policy.xml
Policy: Cache
name: memory-map
value: anonymous
Policy: Cache
name: synchronize
value: true
Policy: Resource
name: list-length
value: 32
Policy: Resource
name: time
value: 120
Policy: Resource
name: thread
value: 2
Policy: Resource
name: file
value: 768
Policy: Resource
name: disk
value: 1GiB
Policy: Resource
name: map
value: 512MiB
Policy: Resource
name: memory
value: 256MiB
Policy: Resource
name: area
value: 16KP
Policy: Resource
name: height
value: 8KP
Policy: Resource
name: width
value: 8KP
Policy: Resource
name: temporary-path
value: /opt/tmp
Policy: Module
rights: Write
pattern: {HTTP,HTTPS,MVG,PS,PDF}
Policy: Filter
rights: None
pattern: *
Policy: Path
rights: None
pattern: @*
Policy: System
name: font
value: ImageMagick-7/arial-unicode.ttf
Path: [built-in]
Policy: Undefined
rights: None
stealth 属性のため、shared-secret ポリシーは一覧に表示されない点に注意してください。
ピクセルキャッシュ同期ポリシー
画像ピクセルをディスクに書き込む際、ImageMagick はまずディスクファイルを事前確保します。これはファイルをゼロで完全に埋めるより高速です。さらに性能を高めるため、ファイルはディスク上にメモリマップされます。これにより最大 5 倍の性能向上が得られますが、書き込み中にディスクファイルの空き容量が尽き、OS が SIGBUS シグナルをスローして ImageMagick の継続を妨げる可能性があります。SIGBUS シグナルの発生を防ぐには、次のセキュリティポリシーを使います:
<policy domain="cache" name="synchronize" value="True"/>
すべての画像データを完全にフラッシュしてディスクに同期させるには True に設定します。性能上のペナルティはありますが、システムクラッシュ時に有効な画像ファイルを保証できる、画像ピクセルキャッシュ用のディスク容量が不足している場合に早期報告できる、といった利点があります。
ゼロコンフィグレーションセキュリティポリシー
ImageMagick のゼロコンフィグレーションビルドは、外部設定ファイルを許可しません。セキュリティポリシーを定義するには、代わりに MagickCore/policy-private.h ソースモジュールを編集してポリシー文を追加し、ImageMagick 配布物をビルドする必要があります。ゼロコンフィグレーションセキュリティポリシーの例を示します:
static const char
*ZeroConfigurationPolicy = \
"<policymap> \
<policy domain=\"module\" rights=\"none\" pattern=\"MVG\"/> \
</policymap>";
その他のセキュリティ上の考慮事項
ImageMagick に脆弱性を見つけた場合は、まずその脆弱性がセキュリティポリシーで緩和できるか判断してください。ImageMagick は既定で開放的です。セキュリティポリシーを使って、ローカルのセキュリティガバナンスの要件を満たす制約を加えてください。セキュリティポリシーでは脆弱性に対処できないと確信した場合は、その脆弱性をセキュリティアドバイザリとして投稿してください。ほとんどの脆弱性は 48 時間以内にレビュー・解決されます。
ImageMagick をより安全に保つ方法はいくつかあります:
- web セーフな画像フォーマットを使う: ImageMagick を GIF・JPEG・PNG のような web セーフフォーマットの読み書きだけに制限すると、セキュリティを高められます。
- セキュリティポリシーをカスタマイズする: ローカル環境や組織のポリシーのニーズに合わせてカスタマイズできます。メモリ使用量、読み書きを許可するパス、シーケンス内の画像数、ワークフローの最大実行時間、画像ピクセル用のディスク容量、リモート接続用の秘密パスフレーズ、許可・拒否するコーダーといった側面をカバーできます。
- リソース使用量に制限を設ける: メモリ使用量・ディスク容量・ワークフロー実行時間などのリソースに制限を設け、潜在的に有害な状況を防げます。
- サンドボックスを使う: サンドボックスは、プログラムを制限された環境で実行し、機密情報へのアクセスやシステムへの変更を防ぐセキュリティ技術です。
- 潜在的に危険なコーダーを無効にする: 公開 Web サイトで ImageMagick を使う場合は、MVG や HTTPS などの特定のコーダーを無効にしてセキュリティを高めるとよいでしょう。
- delegates.xml を見直し、環境に適さないものはポリシーで無効にします。残すものについては
configure --with-frozenpaths=yes(訳注: 原文は--with--frozenpaths)を使い、すべてのデリゲートプログラムが絶対パス名(たとえばgsではなく/usr/bin/gs)を使うようにします。これでデリゲートの解決が決定的になり、環境のPATHに左右されなくなります。 - 画像フィルタの実行と間接読み込みを防ぐ: ユーザーによる画像フィルタの実行や間接読み込みを防いで、セキュリティを高められます。
- 最新版の ImageMagick を使う: 最新のセキュリティ修正と更新を活用するため、最新版の ImageMagick を使うことが重要です。