セキュリティポリシー
セキュリティポリシー • セキュリティポリシーの例 • ピクセルキャッシュ同期ポリシー • ゼロコンフィグレーションセキュリティポリシー • その他のセキュリティ上の考慮事項
ImageMagick を利用する前に、ローカル環境に適したセキュリティポリシーを確立することを強くおすすめします。ImageMagick のセキュリティモデルは「拒否されない限りすべて許可」であり、最後にマッチしたポリシーが優先されます。新しいルールを追加する際は注意してください。後のポリシーは、先の deny や allow を上書きできます。広範な deny ルールを先に置き、その後に個別の例外を続け、意図しない許可を避けるために順序を見直してください。
ImageMagick は意図的に既定で開放的であり、その設計上の選択は、Docker コンテナや他のサンドボックス化されたデプロイメントなど、管理された環境での主要な利用を反映しています。
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 設定ファイルの各ルールを見直すことをおすすめします。組織の要件に応じてパラメータを調整してください。セキュリティニーズに基づいて、許可する画像フォーマットの変更、特定パスの設定、特定操作の制限ができます。セキュリティポリシーのカスタマイズは、機能性とセキュリティの微妙なバランスである点を忘れないでください。過度に制限的なポリシーは正当な画像処理を妨げ、過度に寛容なポリシーは脆弱性を生みます。
セキュリティポリシーの例
セキュリティポリシーの例を示します:
<?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>
]>
<policymap>
<!-- Set maximum parallel threads. -->
<policy domain="resource" name="thread" value="2"/>
<policy domain="resource" name="time" value="60"/>
<policy domain="resource" name="file" value="768"/>
<policy domain="resource" name="memory" value="256MiB"/>
<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="list-length" value="16"/>
<policy domain="resource" name="width" value="4KP"/>
<policy domain="resource" name="height" value="4KP"/>
<policy domain="resource" name="throttle" value="2"/>
<policy domain="resource" name="dynamic-throttle" value="false"/>
<policy domain="cache" name="memory-map" value="anonymous"/>
<policy domain="cache" name="synchronize" value="true"/>
<policy domain="delegate" rights="none" pattern="*"/>
<policy domain="filter" rights="none" pattern="*"/>
<policy domain="path" rights="none" pattern="-"/>
<policy domain="path" rights="none" pattern="fd:*"/>
<policy domain="path" rights="none" pattern="/etc/*"/>
<policy domain="path" rights="none" pattern="*../*"/>
<policy domain="path" rights="none" pattern="@*"/>
<policy domain="module" rights="none" pattern="*" />
<policy domain="module" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" />
<policy domain="system" name="shred" value="1"/>
<policy domain="system" name="memory-map" value="anonymous"/>
<policy domain="system" name="max-memory-request" value="256MiB"/>
<policy domain="system" name="symlink" rights="none" pattern="follow"/>
</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 属性のため、共有シークレットのポリシーは一覧に表示されない点に注意してください。
Doyensec は、セキュリティポリシーの設計と監査を支援するポリシー評価ツールを提供しています。ツールは imagemagick-secevaluator.doyensec.com にあります。
ピクセルキャッシュ同期ポリシー
画像ピクセルをディスクに書き込む際、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 などの特定のコーダーを無効にしてセキュリティを高めるとよいでしょう。
- 画像フィルタの実行と間接読み込みを防ぐ: ユーザーによる画像フィルタの実行や間接読み込みを防いで、セキュリティを高められます。
- 最新版の ImageMagick を使う: 最新のセキュリティ修正と更新を活用するため、最新版の ImageMagick を使うことが重要です。