769

The Imagemagick security policy seems to be not allowing me perform this conversion from pdf to png. Converting other extensions seem to be working, just not from pdf. I haven't changed any of the imagemagick settings since I installed it... I am using Arch Linux, if the OS matters.

user@machine $ convert -density 300 -depth 8 -quality 90 input.pdf output.png
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert: no images defined `output.png' @ error/convert.c/ConvertImageCommand/3288.
DevLoverUmar
  • 11,809
  • 11
  • 68
  • 98
T. Zack Crawford
  • 7,646
  • 3
  • 11
  • 18
  • 5
    Possible duplicate of [ImageMagick not authorized to convert PDF to an image](https://stackoverflow.com/questions/52861946/imagemagick-not-authorized-to-convert-pdf-to-an-image) – Raedwald Nov 23 '18 at 12:11
  • That link is about a FileNotFound error. – Soerendip Jun 23 '22 at 09:25

14 Answers14

825

Well, I added

  <policy domain="coder" rights="read | write" pattern="PDF" />

just before </policymap> in /etc/ImageMagick-7/policy.xml and that makes it work again, but not sure about the security implications of that.

Benjamin Loison
  • 3,782
  • 4
  • 16
  • 33
Stefan Seidel
  • 9,421
  • 3
  • 19
  • 18
  • 10
    I believe that the PDF policy was added due to a bug in Ghostscript, which I believe has now been fixed. So it you are using the current Ghostscript, then you should be fine giving this policy read|write rights. – fmw42 Nov 06 '18 at 21:43
  • 85
    I found the line `` and just uncommented it to make it work. – jakob-r Dec 07 '18 at 12:18
  • 27
    The security vulnerability that caused distributions to implement the policy is referenced here: https://www.kb.cert.org/vuls/id/332928/ – Jason Siefken Jan 08 '19 at 23:58
  • 60
    @jakob-r: I suppose you **commented it out**... ;-) – AstroFloyd Jan 14 '19 at 17:09
  • 5
    Make sure ghostscript is updated https://www.kb.cert.org/vuls/id/332928/ – ykay says Reinstate Monica Mar 05 '19 at 09:35
  • 2
    That doesn't do it for me on the current Arch. – Suuuehgi Nov 05 '19 at 18:01
  • @Suuuehgi see [soloturn's answer](https://stackoverflow.com/a/58438910/6770384). – Socowi Nov 21 '19 at 13:33
  • See https://stackoverflow.com/questions/52861946/imagemagick-not-authorized-to-convert-pdf-to-an-image/52863413#52863413 – fmw42 Feb 05 '20 at 17:28
  • 1
    The bug referenced by @ykaysaysReinstateMonica was *addressed in Ghostscript version 9.24* – qneill May 11 '20 at 22:18
  • Note: if you are trying to solve this problem for conversion from EPS, allowing `rights="read|write"` on `pattern="EPS"` will accomplish nothing if you don't do the same for `pattern="PS'`, or move the EPS line above the PS line. – kyle Jul 24 '20 at 15:57
  • 1
    On Ubuntu 20.04 (LTS), only ImageMagick 6 is available right now, but I have an up to date version of ghostscript. Can confirm this worked for me. – Matthew Sep 27 '20 at 23:09
  • 1
    I get a ghostscript error when I enable this read/write policy: `convert-im6.q16: FailedToExecuteCommand `'gs'` , anybody has a clue how to fix this? I'm using Image Magick 6.9.10-23 Q16 x86_64 20190101 on Ubuntu 20 – basZero Sep 28 '20 at 06:51
  • Isn't there a way to temporarily add this policy only for the time for the conversion? – rubo77 Jun 29 '21 at 19:42
  • 2
    Worked perfectly for me! So ingenious! However in my case it was ImageMagick-6, and not 7. So you might need to check the version by navigating to /etc – Karthik C Aug 25 '21 at 19:08
  • Works perfectly on Ubuntu 20.04 where `convert --version` shows `Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org` and `gs --version` shows `9.50`! Now this command works to convert all jpg images into my dir to a single `out.pdf`!: `convert *.jpg out.pdf`. See: [AskUbuntu: Create a single pdf from multiple text, images or pdf files](https://askubuntu.com/a/473674/327339). – Gabriel Staples Jan 08 '22 at 07:30
  • 1
    Has anyone gotten this working with Circle CI? – Chris Hough Jan 18 '22 at 17:24
  • `` was sufficient in `/etc/ImageMagick-6/policy.xml` on Ubuntu 20.04. – johnrbnz Oct 26 '22 at 16:20
  • Don't forget to restart your server. – Avnish Tiwary Feb 13 '23 at 19:38
  • This file does not exist. Might need to substitute a different version number for other systems. – Cerin Apr 06 '23 at 21:03
  • I ran into this while using `pdfplumber` package's `to_image()` function. I had to reload the package after applying the policy changes. – farhanhubble Jun 16 '23 at 00:00
  • Please edit the answer to mention that the file could be named as `/etc/ImageMagick-6/policy.xml`, like suggested by users johnrbnz, cerin, etc. – Valerio Bozz Jun 27 '23 at 12:20
  • All answers seem to refer to configuration file `/etc/ImageMagick-{6,7}/policy.xml` but you _might_ have a local config at `~/.config/ImageMagick/policy.xml` like I did because I had played with some settings few years ago and forgot that I had it. Changing `/etc...` had no effect as my `~/.config...` was a full copy of the base config and overrode any changes I made to to `/etc...`. Lesson learned. – karttu Jul 03 '23 at 20:40
505

This issue is a workaround for a security vulnerability. The vulnerability has been addressed in Ghostscript 9.24, so if you have that or a newer version, you don't need the workaround anymore.

On Ubuntu 19.04 through 22.04 and probably any later versions with ImageMagick 6, here's how you fix the issue by removing that workaround:

  1. Make sure you have Ghostscript ≥9.24:

    gs --version
    
  2. If yes, just remove this whole following section from /etc/ImageMagick-6/policy.xml:

    <!-- disable ghostscript format types -->
    <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="EPS" />
    <policy domain="coder" rights="none" pattern="PDF" />
    <policy domain="coder" rights="none" pattern="XPS" />
    

 

Details: Removing just the line with pattern="PDF" inside would be enough to re-enable PDF conversion. On my computer, I removed the lines for the other PostScript-based filetypes as well just because I can't see a reason to prevent Image Magick from working with such files. (Talking about a personal computer only. On a web server, you might consider it dangerous as PostScript-based files can contain scripts … actually, PostScript is script.)

Attribution: @jakob-r's comment on another answer. Plus the helpful comments below ↓

Madacol
  • 3,611
  • 34
  • 33
tanius
  • 14,003
  • 3
  • 51
  • 63
176

As pointed out in some comments, you need to edit the policies of ImageMagick in /etc/ImageMagick-7/policy.xml. More particularly, in ArchLinux at the time of writing (05/01/2019) the following line is uncommented:

<policy domain="coder" rights="none" pattern="{PS,PS2,PS3,EPS,PDF,XPS}" />

Just wrap it between <!-- and --> to comment it, and pdf conversion should work again.

Michele
  • 2,148
  • 1
  • 9
  • 14
  • 2
    make sure ghostscript is up to date https://www.kb.cert.org/vuls/id/332928/ – ykay says Reinstate Monica Mar 05 '19 at 09:35
  • 26
    What's the point of this functionality? To prevent users from making PDFs? – lmat - Reinstate Monica Mar 27 '19 at 01:22
  • 25
    Partially, yes. As ImageMagick is often used by websites to process uploaded files - and PDF is among one of the file formats which can basically contain any executable code - anyone with upload permissions could otherwise perform any task your web user has access to. Same if someone tricks you into personally converting a malicious PDF to any other format. – TwoD Apr 14 '19 at 10:37
  • 3
    I am outraged if the decision was prevent me from using my software because someone may find a way to cheat with it. – Gabriel Jun 16 '21 at 20:55
  • @Gabriel It was more about preventing people from feeding malicious PDFs to insufficiently sanitizing image upload fields. (i.e. "Hack their site through the thumbnailer when they never intended to support PDF and Postscript to begin with" situations.) – ssokolow Oct 08 '21 at 11:30
  • Has anyone gotten this working with Circle CI? – Chris Hough Jan 18 '22 at 17:24
  • where is the imagemagick policy.xml file on Debian 11 (bullseye)? I have Imagemagick installed in `/usr/share/bug/imagemagick`, there are no policy.xml file inside imagemagick directory. – minto Jan 11 '23 at 22:09
  • @minto Assuming you're using the ImageMagick version that is bundled with Debian 11, `/etc/ImageMagick-6/policy.xml`. Use `sudoedit` to modify the file. – Seth Falco Feb 21 '23 at 08:59
58

For me on Arch Linux, I had to comment this:

  <policy domain="delegate" rights="none" pattern="gs" />
Benjamin Loison
  • 3,782
  • 4
  • 16
  • 33
soloturn
  • 958
  • 9
  • 8
  • 1
    On my system, there was two policy.xml files : `/etc/ImageMagick-6/policy.xml` and `/etc/ImageMagick-7/policy.xml`. Take care to edit the right one! – SylvainB Jun 03 '20 at 09:38
  • hanks, true!! ``` lang-js > yay -F /etc/ImageMagick-7/policy.xml etc/ImageMagick-7/policy.xml is owned by extra/imagemagick 7.0.10.30-1 > yay -F /etc/ImageMagick-6/policy.xml etc/ImageMagick-6/policy.xml is owned by extra/libmagick6 6.9.11.30-1 > yay -Rs libmagick6 checking dependencies... error: failed to prepare transaction (could not satisfy dependencies) :: removing libmagick6 breaks dependency 'libmagick6' required by inkscape ``` – soloturn Dec 13 '20 at 00:55
  • Odd. I expected that making this `rights="read|write"` like other answers suggest would work, but also found that I needed to fully comment this out. For those familiar with xml, would be sweet to adjust your answer to show that "comment this" means to take `` and make it ``. Would spare the new user one extra search. – Hendy Nov 24 '21 at 22:59
  • As of Arch package "imagemagick" version 7.1.0.20-2 this is not needed anymore. The policy change was [removed from the default config](https://github.com/archlinux/svntogit-packages/commit/3a66d5583e40415f4b70a1bbe4f4f33efb532491#diff-3e341d2d9c67be01819b25b25d5e53ea3cdf3a38d28846cda85a195eb9b7203a). – njam Jan 30 '22 at 17:32
  • this works for me, 2022, archlinux, `/etc/ImageMagick-7/policy.xml` – micfan Mar 09 '22 at 05:24
41

The ImageMagick change was kept after Ghostscript was fixed because applications (especially web applications) often feed arbitrary user-supplied files to ImageMagick, don't always enforce format restrictions properly, and, since Postscript (which PDF uses) is a turing-complete programming language running in a sandbox, there's always the possibility of another hole in the sandbox.

It's much better to leave things configured so ImageMagick refuses to process files that require running a program and, instead, just invoke Ghostscript directly when you intentionally want to permit Postscript rendering.

That would be accomplished by a Ghostscript command like this:

gs -dSAFER -r600 -sDEVICE=pngalpha -o foo.png myfile.pdf

Yes, this is a variation on the GhostScript command ImageMagic calls. (see ImageMagick's delegates.xml. -o is shorthand for -dBATCH -dNOPAUSE -sOutputFile=)

What's important is that ImageMagick stays locked down, you don't needlessly invoke an intermediate program, and you get more control over the rendering parameters. (eg. -r600 is the DPI to render at and changing -sDEVICE=pngalpha allows you to render directly to your desired format)

ssokolow
  • 14,938
  • 7
  • 52
  • 57
  • Wow, thanks for this really great **and safe** "workaround" for the issue; deserves more upvotes! – eMPee584 Sep 05 '21 at 21:37
  • 2
    "attempting to work around ImageMagick's PDF security issues by using Ghostscript directly is also dangerous as Ghostscript is also vulnerable to exploitation when processing malicious PDF files." from https://serverpilot.io/docs/how-to-install-the-imagemagick-executable/ – Avatar Feb 21 '22 at 08:17
  • @Avatar Anything will be vulnerable to malicious PDF files unless you apply sufficient defense in depth, because Postscript is a turing-complete language and PDF uses a form of Postscript modified so you can seek to individual pages without rendering the entire stream. It's like saying that your web browser is vulnerable to maliciously crafted JavaScript. That article is just saying that Ghostscript is as vulnerable to 0-day attacks as Java Applets were. It's "safe" in the sense that you're less likely to expose PDF rendering to random web apps which use ImageMagick internally. – ssokolow Feb 21 '22 at 10:26
  • To output to JPG format instead of PNG use `-sDEVICE=jpeg`. – Paul Tobias Aug 11 '22 at 05:35
  • 1
    "Ghostscript now (as of 9.50) defaults to SAFER being active." per https://ghostscript.com/docs/9.54.0/Use.htm#Safer – Cliff Jan 05 '23 at 19:48
  • 1
    @Cliff Good to know, but better safe than sorry. Who knows how long it'll take to shake the last of the pre-9.50 builds out of LTS system images. – ssokolow Jan 06 '23 at 03:45
39

For me on my archlinux system the line was already uncommented. I had to replace "none" by "read | write " to make it work.

butterfly
  • 391
  • 2
  • 2
29

Works in Ubuntu 20.04

Add this line inside <policymap>

<policy domain="module" rights="read|write" pattern="{PS,PDF,XPS}" />

Comment these lines:

  <!--
  <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="EPS" />
  <policy domain="coder" rights="none" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />
   -->
Ostap Brehin
  • 3,240
  • 3
  • 25
  • 28
24

As a highly active comment by @Richard Kiefer, a simple fix is like this

$ sudo sed -i '/disable ghostscript format types/,+6d' /etc/ImageMagick-6/policy.xml
Benjamin Loison
  • 3,782
  • 4
  • 16
  • 33
DevLoverUmar
  • 11,809
  • 11
  • 68
  • 98
22

Adding to Stefan Seidel's answer.

Well, at least in Ubuntu 20.04.2 LTS or maybe in other versions you can't really edit the policy.xml file directly in a GUI way. Here is a terminal way to edit it.

  1. Open the policy.xml file in terminal by entering this command -

    sudo nano /etc/ImageMagick-6/policy.xml

  2. Now, directly edit the file in terminal, find <policy domain="coder" rights="none" pattern="PDF" /> and replace none with read|write as shown in the picture. Then press Ctrl+X to exit.

Edit in terminal

16

On Ubuntu 19.10, I have done this in /etc/ImageMagick-6/policy.xml

uncomment this

<policy domain="module" rights="read | write" pattern="{PS,PDF,XPS}" />

and comment this

<!-- <policy domain="coder" rights="none" pattern="PDF" /> -->

After that, this command work without error

convert -thumbnail x300 -background white -alpha remove sample.pdf sample.png 
Benjamin Loison
  • 3,782
  • 4
  • 16
  • 33
slc66
  • 169
  • 1
  • 2
15

I was experiencing this issue with nextcloud which would fail to create thumbnails for pdf files.

However, none of the suggested steps would solve the issue for me.

Eventually I found the reason: The accepted answer did work but I had to also restart php-fpm after editing the policy.xml file:

 sudo systemctl restart php7.2-fpm.service
derwiwie
  • 875
  • 10
  • 16
8

In my case i'm useing ubuntu 20.10 and the Imagick-7.

in my /etc/ImageMagick-6/policy.xml I've removed below lines, restarted my machine and I'm done.

  <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="EPS" />
  <policy domain="coder" rights="none" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />
Benjamin Loison
  • 3,782
  • 4
  • 16
  • 33
sh6210
  • 4,190
  • 1
  • 37
  • 27
3

Manjaro April 2021

Just remove uncommented line inside <policymap> in /etc/ImageMagick-7/policy.xml

Benjamin Loison
  • 3,782
  • 4
  • 16
  • 33
aafirvida
  • 501
  • 5
  • 10
0

Thank you @tanius and others for the detailed answers !

I'd just add to it the following points.

  1. The path of the policy file policy.xml may change with the version of the ImageMagick like /etc/ImageMagick-6/policy.xml or /etc/ImageMagick-7/policy.xml etc. So update it accordingly.

  2. As the policy to prevent or allow the conversion for some filetypes is a security measure, you may like to reset the changes to the policy.xml after the task is done so that there is no possibilty of the corresponding attack, if the system is accessible to attackers !

Happy speedy file conversions meanwhile !

Vishal
  • 23
  • 4