292 lines
20 KiB
HTML
292 lines
20 KiB
HTML
|
|
|
|
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
|
|
<title>ImageMagick - Security Policy</title>
|
|
<meta name="application-name" content="ImageMagick" />
|
|
<meta name="description" content="Use ImageMagick® to create, edit, compose, and convert bitmap images. Resize an image, crop it, change its shades and colors, add captions, and more." />
|
|
<meta name="application-url" content="https://legacy.imagemagick.org" />
|
|
<meta name="generator" content="PHP" />
|
|
<meta name="keywords" content="security, policy, image converter, image resizer, image editor, photo editor, jpg converter, png converter, tiff converter, vector images, online, free, swiss army" />
|
|
<meta name="rating" content="GENERAL" />
|
|
<meta name="robots" content="INDEX, FOLLOW" />
|
|
<meta name="generator" content="ImageMagick Studio LLC" />
|
|
<meta name="author" content="ImageMagick Studio LLC" />
|
|
<meta name="revisit-after" content="2 DAYS" />
|
|
<meta name="resource-type" content="document" />
|
|
<meta name="copyright" content="Copyright (c) 1999-2020 ImageMagick Studio LLC" />
|
|
<meta name="distribution" content="Global" />
|
|
<meta name="magick-serial" content="P131-S030410-R485315270133-P82224-A6668-G1245-1" />
|
|
<meta property='og:url' content='https://legacy.imagemagick.org/' />
|
|
<meta property='og:title' content='ImageMagick Legacy' />
|
|
<meta property='og:image' content='https://legacy.imagemagick.org/images/logo.png' />
|
|
<meta property='og:type' content='website' />
|
|
<meta property='og:site_name' content='ImageMagick Legacy' />
|
|
<meta property='og:description' content="Create, Edit, Compose, or Convert Bitmap Images" />
|
|
<meta name="google-site-verification" content="_bMOCDpkx9ZAzBwb2kF3PRHbfUUdFj2uO8Jd1AXArz4" />
|
|
<meta name="msvalidate.01" content="103012B23499FEB70AEA89C83C274AC7" />
|
|
<link href="security-policy.html" rel="canonical" />
|
|
<link href="../images/wand.png" rel="icon" />
|
|
<link href="../images/wand.ico" rel="shortcut icon" />
|
|
<link href="assets/magick.css" rel="stylesheet" />
|
|
</head>
|
|
<body>
|
|
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
|
|
<a class="navbar-brand" href="../index.html"><img class="d-block" id="wand" alt="ImageMagick" width="32" height="32" src="../images/wand.ico"/></a>
|
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsMagick" aria-controls="navbarsMagick" aria-expanded="false" aria-label="Toggle navigation">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
|
|
<div class="navbar-collapse collapse" id="navbarsMagick" style="">
|
|
<ul class="navbar-nav mr-auto">
|
|
<li class="nav-item ">
|
|
<a class="nav-link" href="../index.html">Home <span class="sr-only">(current)</span></a>
|
|
</li>
|
|
<li class="nav-item ">
|
|
<a class="nav-link" href="download.html">Download</a>
|
|
</li>
|
|
<li class="nav-item ">
|
|
<a class="nav-link" href="command-line-tools.html">Tools</a>
|
|
</li>
|
|
<li class="nav-item ">
|
|
<a class="nav-link" href="command-line-processing.html">Command-line</a>
|
|
</li>
|
|
<li class="nav-item ">
|
|
<a class="nav-link" href="develop.html">Develop</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" target="_blank" href="https://github.com/ImageMagick/ImageMagick6/discussions">Community</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<iframe src="https://github.com/sponsors/ImageMagick/button" title="Sponsor ImageMagick" height="35" width="107" style="border: 0;"></iframe>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<form class="form-inline my-2 my-lg-0" action="https://legacy.imagemagick.org/script/search.php">
|
|
<input class="form-control mr-sm-2" type="text" name="q" placeholder="Search" aria-label="Search" />
|
|
<button class="btn btn-outline-success my-2 my-sm-0" type="submit" name="sa">Search</button>
|
|
</form>
|
|
</nav>
|
|
<div role="main" class="container">
|
|
<script async="async" src="https://localhost/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle"
|
|
style="display:block"
|
|
data-ad-client="ca-pub-3129977114552745"
|
|
data-ad-slot="6345125851"
|
|
data-full-width-responsive="true"
|
|
data-ad-format="horizontal"></ins>
|
|
<script>
|
|
(adsbygoogle = window.adsbygoogle || []).push({});
|
|
</script>
|
|
</div>
|
|
|
|
<main class="container">
|
|
<div class="magick-template">
|
|
<div class="magick-header">
|
|
<h1 class="text-center">Security Policy</h1>
|
|
<p class="text-center"><a href="security-policy.html#policy">Security Policy </a> • <a href="security-policy.html#synchronize">Pixel Cache Synchronize Policy</a> • <a href="security-policy.html#zero-configuration">Zero Configuration Security Policy</a> • <a href="security-policy.html#other">Other Security Considerations</a></p>
|
|
|
|
<p class="lead magick-description">ImageMagick best practices strongly encourages you to configure a security <a href="https://imagemagick.org/source/policy.xml">policy</a> that suits your local environment. The policy is open by default. This affords maximum utility for ImageMagick installations that run in a sandboxed environment, perhaps in a Docker instance, or behind a firewall where security risks are greatly diminished as opposed to a public website.</p>
|
|
|
|
<p>Security is a trade-off between a secure environment and convenience. If you want ImageMagick to be optimally secure, you could, for example, limit ImageMagick to only read or write web safe images (e.g. GIF, JPEG, PNG). However, ImageMagick provides for a more secure option by adjusting the security policy per the requirements of your local environment or organizational policies. The security policy covers areas such as memory, which paths to read or write, how many images are permitted in an image sequence, how long a workflow can run, how much disk the image pixels can consume, a secret passphrase for remote connections, which coders are permitted or denied, and others. These policies should provide robust coverage to not only secure your environment per your requirements but also ensure ImageMagick remains a good citizen (e.g. prevent thrashing with large images) in your local environment.</p>
|
|
|
|
<p>As an example, suppose you download an image from the internet and unbeknownst to you its been crafted to generate a 20000 by 20000 pixel image. ImageMagick attempts to allocate enough resources (memory, disk) and your system will likely deny the resource request and exit. However, its also possible that your computer might be temporarily sluggish or unavailable or ImageMagick may abort. To prevent such a scenario, you can set limits in the <a href="https://imagemagick.org/source/policy.xml">policy.xml</a> configuration file. You might wonder why ImageMagick does not already include reasonable limits? Simply because what is reasonable in your environment, might not be reasonable to someone else. For example, you may have ImageMagick sandboxed where security is not a concern, whereas another user may use ImageMagick to process images on their publically accessible website. Or ImageMagick is runs on a host with 1TB of memory whereas another ImageMagick instance runs on an mobile phone. By policy, permitting giga-pixel image processing on the large memory host makes sense, not so much for the resource constrained mobile phone. If you utilize ImageMagick from a public website, you may want to increase security by preventing usage of the MVG or HTTPS coders. Only you can decide what are reasonable limits taking in consideration your environment. We provide this policy with reasonable limits and encourage you to modify it to suit your local environment:</p>
|
|
|
|
<pre class="pre-scrollable"><code><policymap>
|
|
<!-- temporary path must be a preexisting writable directory -->
|
|
<policy domain="resource" name="temporary-path" value="/data/magick"/>
|
|
<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="120"/>
|
|
<policy domain="filter" rights="none" pattern="*" />
|
|
<policy domain="path" rights="none" pattern="@*"/> <!-- indirect reads not permitted -->
|
|
<policy domain="coder" rights="write" pattern="{HTTP,HTTPS,MSVG,MVG,PS,EPS,PDF,XPS}" />
|
|
<policy domain="cache" name="memory-map" value="anonymous"/>
|
|
<policy domain="cache" name="synchronize" value="true"/>
|
|
<policy domain="cache" name="shared-secret" value="<em>passphrase</em>" stealth="True"/>
|
|
<policy domain="system" name="precision" value="6"/>
|
|
<policy domain="system" name="shred" value="1"/>
|
|
</policymap></code></pre>
|
|
|
|
<p>Since we process multiple simultaneous sessions, we do not want any one session consuming all the available memory. With this policy, large images are cached to disk. If the image is too large and exceeds the pixel cache disk limit, the program exits. In addition, we place a time limit to prevent any run-away processing tasks. If any one image has a width or height that exceeds 8192 pixels or if an image sequence exceeds 32 frames, an exception is thrown and processing stops. As of ImageMagick 6.9.4-6, you can prevent the use of any delegate or all delegates (set the pattern to "*"). Note, prior to these releases, use a domain of <code>coder</code> to prevent delegate usage (e.g. <code>domain="coder" rights="none" pattern="HTTPS"</code>). We prevent users from executing any image filters. The policy also prevents indirect reads. If you want to, for example, read text from a file (e.g. <code>caption:@myCaption.txt</code>), you'll need to disable the <code>path</code> policy.</p>
|
|
|
|
<p>Policy patterns are <em>case sensitive</em>. To get expected behavior, coders and modules must be upper-case (e.g. "EPS" not "eps").</p>
|
|
|
|
<p>Here is what you can expect when you restrict the HTTPS coder, for example:</p>
|
|
|
|
<pre class="highlight"><code>$ convert ../images/wizard.png wizard.jpg
|
|
convert: attempt to perform an operation not allowed by the security policy `HTTPS'
|
|
convert: no images defined `wizard.jpg'</code></pre>
|
|
|
|
<p>As of ImageMagick version 6.9.7-9, you can conveniently deny access to all delegates and coders except for a small subset of proven web-safe image types. For example,</p>
|
|
|
|
<pre class="highlight"><code><policy domain="delegate" rights="none" pattern="*" />
|
|
<policy domain="module" rights="none" pattern="*" />
|
|
<policy domain="module" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" /></code></pre>
|
|
|
|
<p>Here we disable reading just a few Postscript related formats, you can still write them:</p>
|
|
<pre class="highlight"><code><policy domain="module" rights="write" pattern="{PDF,PS,PS2,PS3,XPS}" /></code></pre>
|
|
|
|
<p>As of ImageMagick 6.9.9-11, you can allocate the pixel cache and some internal buffers with anonymous memory mapping rather than from heap. As a consequence, the pixels are initialized to zero resulting in a minor performance penalty. You can also securely delete any temporary files for increased security. The value is the number of times to shred (replace its content with random data) before deleting a temporary file. For example,</p>
|
|
<pre class="highlight"><code><policy domain="system" name="memory-map" value="anonymous"/>
|
|
<policy domain="cache" name="memory-map" value="anonymous"/>
|
|
<policy domain="system" name="shred" value="1"/></code></pre>
|
|
|
|
<p>Some image processing algorithms (e.g. wavelet transform) might consume a substantial amount of memory to complete. ImageMagick maintains a separate memory pool for these large resource requests and as of 6.9.9-0 permits you to set a maximum request limit. If the limit is exceeded, the allocation is instead memory-mapped on disk. Here we limit the maximum memory request by policy:</p>
|
|
<pre class="highlight"><code><policy domain="system" name="max-memory-request" value="256MiB"/> </code></pre>
|
|
|
|
<p>As of ImageMagick version 6.9.9-35, you can limit the maximum number of images in a sequence. For example, to limit an image sequence to at most 64 frames, use:</p>
|
|
<pre class="highlight"><code><policy domain="resource" name="list-length" value="64"/></code></pre>
|
|
|
|
<p>For additional details about resource limits and the policy configuration file, read <a href="resources.html">Resources</a> and <a href="architecture.html">Architecture</a>.</p>
|
|
|
|
<p>As of ImageMagick 6.9.8-10, you can programmatically set the ImageMagick security policy with SetMagickSecurityPolicy() (MagickCore) or MagickSetSecurityPolicy() (MagickWand).</p>
|
|
|
|
<p>As of ImageMagick version 6.9.10-11, you can set a module security policy. For example, to prevent Postscript or PDF interpretation, use:</p>
|
|
<pre class="highlight"><code><policy domain="module" rights="none" pattern="{ps,pdf,xps}/></code></pre>
|
|
|
|
<p>As of ImageMagick version 6.9-10-52, you can set a font policy. Specify a path to a Unicode font that ImageMagick defaults to whenever the user does not specify a font preference:</p>
|
|
<pre class="highlight"><code><policy domain="system" name="font" value="/usr/share/fonts/arial-unicode.ttf"/></code></pre>
|
|
|
|
<p>You can verify your policy changes are in effect with this command:</p>
|
|
|
|
<pre class="pre-scrollable"><code>-> identify -list policy
|
|
Path: ImageMagick-6/policy.xml
|
|
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: System
|
|
name: precision
|
|
value: 6
|
|
Policy: Cache
|
|
name: memory-map
|
|
value: anonymous
|
|
Policy: Cache
|
|
name: synchronize
|
|
value: true
|
|
Policy: Coder
|
|
rights: Write
|
|
pattern: {HTTP,HTTPS,MVG,PS,EPS,PDF,XPS}
|
|
Policy: Filter
|
|
rights: None
|
|
pattern: *
|
|
Policy: Path
|
|
rights: None
|
|
pattern: @*
|
|
Policy: System
|
|
name: font
|
|
value: ImageMagick-6/arial-unicode.ttf
|
|
|
|
Path: [built-in]
|
|
Policy: Undefined
|
|
rights: None </code></pre>
|
|
<p>Notice the <code>shared-secret</code> policy is not listed due to the <code>stealth</code> property.</p>
|
|
|
|
<h2><a class="anchor" id="synchronize"></a>Pixel Cache Synchronize Policy</h2>
|
|
|
|
<p>When writing image pixels to disk, ImageMagick firsts preallocates the disk file, which is much faster than fully populating the file with zeros. To further increase performance, we memory-map the file on disk. With memory-mapping, we get an increase in performance (up to 5x), however, there remains a possibility that as the disk file is populated, it may run out of free space. The OS then throws a SIGBUS signal which prevents ImageMagick from continuing. To prevent a SIGBUS, use this security policy:</p>
|
|
|
|
<pre class="highlight">
|
|
<policy domain="cache" name="synchronize" value="True"/>
|
|
</pre>
|
|
|
|
<p>Set to True to ensure all image data is fully flushed and synchronized to disk. There is a performance penalty, however, the benefits include ensuring a valid image file in the event of a system crash and early reporting if there is not enough disk space for the image pixel cache.</p>
|
|
|
|
<h2><a class="anchor" id="zero-configuration"></a>Zero Configuration Security Policy</h2>
|
|
|
|
<p>A zero configuration build of ImageMagick does not permit external configurat
|
|
ion files. To define your security policy, you must instead edit the <code>magick/policy-private.h</code> source module, add your policy statements, and then build the ImageMagick distribution. Here is an example zero configuration security policy:</p>
|
|
|
|
<pre class="highlight"><code>static const char
|
|
*ZeroConfigurationPolicy = \
|
|
"<policymap> \
|
|
<policy domain=\"coder\" rights=\"none\" pattern=\"MVG\"/> \
|
|
</policymap>";</code></pre>
|
|
|
|
<h2><a class="anchor" id="other"></a>Other Security Considerations</h2>
|
|
|
|
<p>If you spot a security flaw in ImageMagick, post your concern as an issue to
|
|
<a href="https://github.com/ImageMagick/ImageMagick6/issues">GitHub</a>. Be sure to include how to reproduce the security flaw and a link to any images needed to reproduce the flaw. Alternatively, <a href="https://imagemagick.org/script/contact.php">contact us</a> and select Security Issue as the issue.</p>
|
|
|
|
<p>In addition to the security policy, you can make ImageMagick safer by ...</p>
|
|
<ul>
|
|
<li>keeping ImageMagick up-to-date. The latest releases have fixes for any security flaws we discovered in the past;</li>
|
|
<li>sanitizing any filenames or command line options you pass to ImageMagick;</li>
|
|
<li>running ImageMagick in a sanitized software container such as Docker;</li>
|
|
<li>running ImageMagick as the least-privileged user (e.g. 'nobody');</li>
|
|
<li>explicitly setting the image file type. For example, use the filename <code>png:image.png</code> rather than <code>image.png</code>. Without an explicit image type in the filename, ImageMagick guesses the image type.</li>
|
|
<li>do not create temporary files in shared directories, instead specify a private area to store only ImageMagick temporary files by setting the <code>temporary-path</code> security policy or the <code>-define registry:temporary-path=/data/magick</code> command-line option.</li>
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
</main><!-- /.container -->
|
|
<footer class="magick-footer">
|
|
<div class="container">
|
|
<p><a href="security-policy.html">Security</a> •
|
|
<a href="news.html">News</a>
|
|
|
|
<a href="security-policy.html#"><img class="d-inline" id="wand" alt="And Now a Touch of Magick" width="16" height="16" src="../images/wand.ico"/></a>
|
|
|
|
<a href="links.html">Related</a> •
|
|
<a href="sitemap.html">Sitemap</a>
|
|
<br/>
|
|
|
|
<a href="support.html">Sponsor</a> •
|
|
<a href="http://pgp.mit.edu/pks/lookup?op=get&search=0x89AB63D48277377A">Public Key</a> •
|
|
<a href="https://imagemagick.org/script/contact.php">Contact Us</a>
|
|
<br/>
|
|
<a href="https://github.com/imagemagick/imagemagick6" target="_blank" rel="noopener" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="navbar-nav-svg" viewBox="0 0 512 499.36" width="2%" height="2%" role="img" focusable="false"><title>GitHub</title><path fill="currentColor" fill-rule="evenodd" d="M256 0C114.64 0 0 114.61 0 256c0 113.09 73.34 209 175.08 242.9 12.8 2.35 17.47-5.56 17.47-12.34 0-6.08-.22-22.18-.35-43.54-71.2 15.49-86.2-34.34-86.2-34.34-11.64-29.57-28.42-37.45-28.42-37.45-23.27-15.84 1.73-15.55 1.73-15.55 25.69 1.81 39.21 26.38 39.21 26.38 22.84 39.12 59.92 27.82 74.5 21.27 2.33-16.54 8.94-27.82 16.25-34.22-56.84-6.43-116.6-28.43-116.6-126.49 0-27.95 10-50.8 26.35-68.69-2.63-6.48-11.42-32.5 2.51-67.75 0 0 21.49-6.88 70.4 26.24a242.65 242.65 0 0 1 128.18 0c48.87-33.13 70.33-26.24 70.33-26.24 14 35.25 5.18 61.27 2.55 67.75 16.41 17.9 26.31 40.75 26.31 68.69 0 98.35-59.85 120-116.88 126.32 9.19 7.9 17.38 23.53 17.38 47.41 0 34.22-.31 61.83-.31 70.23 0 6.85 4.61 14.81 17.6 12.31C438.72 464.97 512 369.08 512 256.02 512 114.62 397.37 0 256 0z"/></svg></a> •
|
|
<a href="https://twitter.com/imagemagick" target="_blank" rel="noopener" aria-label="Twitter"><svg xmlns="http://www.w3.org/2000/svg" class="navbar-nav-svg" viewBox="0 0 512 416.32" width="2%" height="2%" role="img" focusable="false"><title>Twitter</title><path fill="currentColor" d="M160.83 416.32c193.2 0 298.92-160.22 298.92-298.92 0-4.51 0-9-.2-13.52A214 214 0 0 0 512 49.38a212.93 212.93 0 0 1-60.44 16.6 105.7 105.7 0 0 0 46.3-58.19 209 209 0 0 1-66.79 25.37 105.09 105.09 0 0 0-181.73 71.91 116.12 116.12 0 0 0 2.66 24c-87.28-4.3-164.73-46.3-216.56-109.82A105.48 105.48 0 0 0 68 159.6a106.27 106.27 0 0 1-47.53-13.11v1.43a105.28 105.28 0 0 0 84.21 103.06 105.67 105.67 0 0 1-47.33 1.84 105.06 105.06 0 0 0 98.14 72.94A210.72 210.72 0 0 1 25 370.84a202.17 202.17 0 0 1-25-1.43 298.85 298.85 0 0 0 160.83 46.92"/></svg></a>
|
|
<br/>
|
|
<small>© 1999-2021 ImageMagick Studio LLC</small></p>
|
|
</div>
|
|
</footer>
|
|
|
|
<!-- Javascript assets -->
|
|
<script>window.jQuery || document.write('<script src="assets/jquery.slim.min.js"><\/script>')</script><script src="assets/bootstrap.bundle.min.js" crossorigin="anonymous" />
|
|
</body>
|
|
</html>
|
|
<!-- Magick Cache 1st January 2021 19:38 -->
|