セキュリティポリシー • セキュリティポリシーの例 • ピクセルキャッシュ同期ポリシー • ゼロコンフィギュレーションセキュリティポリシー • その他のセキュリティに関する考慮事項
ImageMagick を利用する前に、ローカル環境に適したセキュリティポリシーを策定することを強くお勧めします。
デフォルトのポリシーはオープンであり、Dockerコンテナ内やファイアウォールの背後など、安全な環境で実行されている ImageMagick インストールに役立ちます。
ImageMagick は、画像を操作できるツールです。幅広い機能を提供しますが、セキュリティと利便性の間にはトレードオフが存在することがよくあります。最適なセキュリティを確保するために、ImageMagick を GIF、JPEG、PNG などのWebセーフな画像形式の読み取りまたは書き込みのみに制限できます。または、ローカル環境または組織のポリシーのニーズに合わせてセキュリティポリシーをカスタマイズできます。このポリシーには、メモリ使用量の制限、読み取りと書き込みの許可パス、シーケンス内の画像数の制限、ワークフローの最大実行時間、画像ピクセル用の許容ディスク容量、リモート接続用の秘密パスフレーズ、許可または拒否されるコーダーなど、詳細を含めることができます。セキュリティポリシーをカスタマイズすることにより、環境を保護し、大きな画像によるオーバーロードを防ぐなど、ImageMagick がローカルシステムの責任あるメンバーであることを保証できます。
潜在的に有害な状況を防ぐために、ImageMagick のリソース使用量に制限を設定することが重要です。たとえば、非常に大きな画像(例:20000 x 20000ピクセル)を生成するように細工された画像をインターネットから誤ってダウンロードした場合、ImageMagick は必要なリソース(メモリやディスク容量など)を割り当てようとし、システムが要求を拒否したり、プログラムが終了したりする可能性があります。または、コンピューターが一時的に低速または無反応になるか、ImageMagick が強制終了される可能性があります。このような状況を回避するには、policy.xml 設定ファイルに制限を設定します。
ある環境で妥当と見なされるものが、別の環境には適さない場合があることに注意してください。たとえば、安全な環境で ImageMagick をサンドボックス化している場合もあれば、公開Webサイトで画像を処理するために使用している場合もあります。または、ImageMagick が大量のメモリを搭載したホストで実行されている場合もあれば、リソースが限られているデバイスで実行されている場合もあります。メモリが大きいホストの場合は、大きな画像処理を許可することは理にかなっていますが、リソースが限られているデバイスでは許可しません。公開Webサイトで ImageMagick を使用している場合は、MVG や HTTPS などの特定のコーダーを無効にすることでセキュリティを強化できます。
使い始めるために、バージョン 7.1.1-16 以降、ImageMagick は ImageMagick をインストールするときに選択できるセキュリティポリシーを提供しています。次の中から選択してください
- オープン
- ImageMagick インストールのデフォルトポリシーは、オープンセキュリティポリシーです。このポリシーは、ファイアウォールで保護されている環境や Docker コンテナ内など、安全な設定での使用向けに設計されています。このフレームワーク内では、ImageMagick はリソースと機能に幅広くアクセスできます。このポリシーは、画像操作のための便利で適応性の高いオプションを提供します。ただし、規制の少ない状況ではセキュリティの脆弱性が発生する可能性があることに注意することが重要です。したがって、組織は、特定のユースケースとセキュリティの前提条件に従って、オープンポリシーの適切性を徹底的に評価する必要があります。
- 制限付き
- 制限付きセキュリティポリシーの主な目的は、利便性とセキュリティのバランスをとることです。このポリシーには、SVG や HTTP などの特定のコーダーなど、潜在的に危険な機能の無効化が含まれます。さらに、メモリ、ストレージ、処理時間などのリソースの使用にいくつかの制約を設定します。これらはすべて調整可能です。このポリシーは、一般的な画像形式の基本的な機能を維持しながら、悪意のある、または要求の厳しい画像を処理する潜在的な脅威を軽減する必要がある場合に役立ちます。
- セキュア
- この厳格なセキュリティポリシーは、ImageMagick を使用しながら、厳格な制御と制限されたリソース使用の実装を優先し、非常に安全な設定を確立します。 SVG や HTTP などの特定のコーダーなど、潜在的に危険な機能を無効にします。このポリシーは、ローカル環境の要件と組織のガイドラインに合わせてセキュリティ対策を調整することを促進します。このプロトコルには、メモリ消費量の制限、読み取りと書き込みの許可パス、画像シーケンスの制限、ワークフローの最大許容期間、画像データ用のディスク容量の割り当て、リモート接続用の秘密パスフレーズなど、明示的な詳細が含まれます。この堅牢なポリシーを採用することにより、エンティティは全体的なセキュリティ体制を強化し、潜在的な脆弱性を軽減できます。
- Webセーフ
- Webセーフな使用向けに設計されたこのセキュリティプロトコルは、ImageMagick が Web サイトなどの公開アクセス可能なコンテキストで適用される状況に焦点を当てています。 GIF、JPEG、PNG などの Web セーフな形式以外の画像形式の読み取りまたは書き込み機能を無効にします。さらに、このポリシーは画像フィルターの実行と間接読み取りを禁止し、潜在的なセキュリティ違反を阻止します。これらの制限を実装することにより、Webセーフポリシーは、公開アクセス可能なシステムの保護を強化し、潜在的な攻撃のために ImageMagick の機能が悪用されるリスクを軽減します。
Linux では、 `--with-security-policy={open, limited, secure, websafe}` configure スクリプトオプションを使用してポリシーを選択します。 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>
]>
<!--
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.dokyumento.jp/script/security-policy.php,
and it's important to verify your policy using the validation tool located
at https://imagemagick-secevaluator.doyensec.com/.
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 neumonics, 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"/>
<!-- Do not create temporary files in the default shared directories, instead
specify a private area to store only ImageMagick temporary files. -->
<!-- -->
<!-- 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 -->
<!-- -->
<!-- Do not permit any 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="-"/>
<!-- don't read sensitive paths. -->
<policy domain="path" rights="none" pattern="/etc/*"/>
<!-- Indirect reads are 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"/>
</policymap>
複数のセッションを同時に処理するときに、1つのセッションが使用可能なすべてのメモリを消費するのを防ぐために、このポリシーでは大きな画像がディスクにキャッシュされます。画像がピクセルキャッシュディスクの制限を超えると、プログラムは終了します。さらに、処理タスクが長時間実行されないように、時間制限が設定されています。画像の幅または高さが8192ピクセルを超える場合、または画像シーケンスが32フレームを超える場合、処理は停止し、例外がスローされます。
ImageMagick 7.0.1-8 以降、任意のデリゲートまたはすべてのデリゲートの使用を防ぐことができます(パターンを "*" に設定することにより)。これらのリリースより前は、coder のドメインを使用し、権限を none に設定し、glob パターンを HTTPS に設定して、デリゲートの使用を防ぐことができます。さらに、ユーザーは画像フィルターを実行したり、間接読み取りを実行したりすることができません。たとえば、ファイルからテキストを読み取る場合(例:caption:@myCaption.txt)、このパスポリシーを無効にする必要があります。
ImageMagick 7.1.1-16 より前のポリシー glob パターン は、*大文字と小文字が区別されます*。期待どおりの動作を得るには、コーダーとモジュールは大文字にする必要があります(例:「EPS」ではなく「EPS」)または、[Pp][Nn][Gg] などの大文字と小文字を区別しないパターンを使用する必要があります。
たとえば、HTTPS コーダーを制限すると、次のようになります。
$ magick https://imagemagick.dokyumento.jp/image/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}" />
モジュールポリシーは、読み取りと書き込みの両方でモジュール全体を有効または無効にします。画像形式を読み書きするだけの場合は、代わりにコーダーポリシーを使用します。たとえば、いくつかの Postscript 関連の形式の読み取りを無効にしますが、書き込みは引き続き可能です
<policy domain="coder" rights="write" pattern="{PDF,PS,PS2,PS3,XPS}" />
ImageMagick 7.0.7-0 以降、ピクセルキャッシュといくつかの内部バッファを、ヒープではなく匿名メモリマッピングで割り当てることができます。結果として、ピクセルはゼロに初期化され、パフォーマンスがわずかに低下します。また、特定のメモリバッファの内容を jumble することもできます(バージョン 7.1.0-38 以降が必要)。解放または削除される前に一時ファイルを jumble することもできます。シュレッド値は、コンテンツをランダムデータに置き換える回数です。例えば、
<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)が付いた浮動小数点数です。
リソース制限とポリシー設定ファイルの詳細については、リソースとアーキテクチャをご覧ください。
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: Coder 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 ポリシーはリストされていません。
Doyensec は、セキュリティポリシーの設計と監査に役立つポリシー評価ツールを提供しています。このツールは、imagemagick-secevaluator.doyensec.com にあります。
ピクセルキャッシュ同期ポリシー
ImageMagickは、画像ピクセルをディスクに書き込む際、最初にディスクファイルの領域を事前に確保します。これは、ファイルをゼロで完全に埋めるよりも高速です。パフォーマンスをさらに向上させるために、ファイルはディスク上でメモリマップされます。これにより、パフォーマンスが最大5倍向上する可能性がありますが、ファイルがデータで満たされるにつれてディスク領域が不足し、オペレーティングシステム(OS)がSIGBUSシグナルを発生させる可能性があります。SIGBUSシグナルは、ImageMagickの続行を妨げます。SIGBUSシグナルの発生を防ぐには、次のセキュリティポリシーを使用してください。
<policy domain="cache" name="synchronize" value="True"/>
すべての画像データが完全にフラッシュされ、ディスクと同期されるようにするには、Trueに設定します。パフォーマンスは低下しますが、システムクラッシュが発生した場合に有効な画像ファイルを確保し、画像ピクセルキャッシュのディスク容量が不足している場合に早期に報告するなどの利点があります。
ゼロコンフィギュレーションセキュリティポリシー
ImageMagickのゼロコンフィギュレーションビルドでは、外部設定ファイルは許可されません。セキュリティポリシーを定義するには、代わりに`MagickCore/policy-private.h`ソースモジュールを編集し、ポリシーを追加してから、ImageMagickディストリビューションをビルドする必要があります。ゼロコンフィギュレーションセキュリティポリシーの例を次に示します。
static const char *ZeroConfigurationPolicy = \ "<policymap> \ <policy domain=\"coder\" rights=\"none\" pattern=\"MVG\"/> \ </policymap>";
その他のセキュリティに関する考慮事項
ImageMagickに脆弱性が見つかった場合は、まず、セキュリティポリシーによって脆弱性を軽減できるかどうかを確認してください。ImageMagickは、デフォルトではオープンです。セキュリティポリシーを使用して、ローカルセキュリティガバナンスの要件を満たす制約を追加します。セキュリティポリシーで脆弱性に対処できないと確信できる場合は、脆弱性をセキュリティアドバイザリとして投稿してください。ほとんどの脆弱性は48時間以内にレビューされ、解決されます。
ImageMagickの安全性を高める方法はいくつかあります。
- Webセーフな画像形式を使用する:ImageMagickがGIF、JPEG、PNGなどのWebセーフな画像形式のみを読み書きするように制限すると、セキュリティを強化できます。
- セキュリティポリシーをカスタマイズする:ローカル環境または組織のポリシーのニーズに合わせてセキュリティポリシーをカスタマイズできます。このポリシーは、メモリ使用量、読み取りと書き込みに使用できるパス、シーケンスで許可される画像の数、ワークフローを実行できる最大時間、画像ピクセルに許可されるディスク容量、リモート接続の秘密パスフレーズ、許可または拒否されるコーダーなど、さまざまな側面をカバーできます。
- リソース使用量に制限を設定する:メモリ使用量、ディスク容量、ワークフローの実行時間などのリソースに制限を設定して、潜在的に有害な状況を防ぐことができます。
- サンドボックスを使用する:サンドボックスは、プログラムを制限された環境で実行して、機密情報へのアクセスやシステムの変更を防ぐセキュリティ技術です。
- 潜在的に危険なコーダーを無効にする:ImageMagickを公開Webサイトで使用している場合は、MVGやHTTPSなどの特定のコーダーを無効にしてセキュリティを強化できます。
- 画像フィルターの実行と間接的な読み取りを防ぐ:ユーザーが画像フィルターを実行したり、間接的な読み取りを実行したりできないようにすることで、セキュリティを強化できます。
- 最新バージョンのImageMagickを使用する:最新のセキュリティ修正と更新を利用するには、最新バージョンのImageMagickを使用することが重要です。