ImageMagick 安全策略 'PDF' 阻止转换

ImageMagick security policy 'PDF' blocking conversion

Imagemagick 安全策略似乎不允许我执行从 pdf 到 png 的转换。转换其他扩展名似乎有效,只是不适用于 pdf。自从我安装了 imagemagick 之后,我没有更改任何设置...我正在使用 Arch Linux,如果 OS 很重要的话。

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.

嗯,我加了

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

就在 /etc/ImageMagick-7/policy.xml 中的 </policymap> 之前,这使它再次工作,但不确定它的安全隐患。

对于我的 archlinux 系统,该行已经取消注释。我必须将 "none" 替换为 "read | write " 才能使其正常工作。

正如某些评论中指出的,您需要在 /etc/ImageMagick-7/policy.xml 中编辑 ImageMagick 的策略。更具体地说,在撰写本文时(05/01/2019)在 ArchLinux 中,以下行未被注释:

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

只需将它包裹在 <!----> 之间进行评论,pdf 转换应该会再次起作用。

对于我在 Arch Linux 上,我不得不评论这个:

  <policy domain="delegate" rights="none" pattern="gs" />

在 Ubuntu 19.10,我在 /etc/ImageMagick-6/policy 完成了此操作。xml

取消注释

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

并对此发表评论

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

之后,此命令正常运行

convert -thumbnail x300 -background white -alpha remove sample.pdf sample.png 

此问题是针对安全漏洞的解决方法。该漏洞已在 Ghostscript 9.24 (source) 中得到解决,因此如果您拥有该版本或更新版本,则不再需要解决方法。

Ubuntu 19.0421.04 以及可能随 ImageMagick 6 附带的任何更高版本中,以下是解决问题的方法通过删除解决方法:

  1. 确保你的 Ghostscript ≥9.24:

    gs --version
    
  2. 如果是,只需从 /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" />
    

我在使用 nextcloud 时遇到了这个问题,它无法为 pdf 文件创建缩略图。

但是,none 的建议步骤可以解决我的问题。

最终我找到了原因:接受的答案确实有效,但我还必须在编辑 policy.xml 文件后重新启动 php-fpm:

 sudo systemctl restart php7.2-fpm.service

在 Ubuntu 20.04

中工作

<policymap>

里面加上这一行
<policy domain="module" rights="read|write" pattern="{PS,PDF,XPS}" />

评论这些行:

  <!--
  <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" />
   -->

添加到 Stefan Seidel 的回答中。

好吧,至少在 Ubuntu 20.04.2 LTS 或其他版本中,您不能真正以 GUI 方式直接编辑 policy.xml 文件。这是编辑它的终端方式。

  1. 在终端中输入此命令打开 policy.xml 文件 -

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

  2. 现在,直接在终端编辑文件,找到 <policy domain="coder" rights="none" pattern="PDF" /> 并将 none 替换为 read|write,如图所示。然后按Ctrl+X退出。

在修复 Ghostscript 后,ImageMagick 的更改得以保留,因为应用程序(尤其是 Web 应用程序)经常将任意用户提供的文件提供给 ImageMagick,并不总是正确地执行格式限制,而且,由于 Postscript(PDF 使用的)是沙箱中的图灵完备编程语言运行,沙箱中总是存在另一个漏洞的可能性。

最好保留配置,这样 ImageMagick 会拒绝处理需要 运行 程序的文件,而是在您 有意 想要时直接调用 Ghostscript允许 Postscript 渲染。

这将通过 Ghostscript 命令完成,如下所示:

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

是的,这是 ImageMagic 调用的 GhostScript 命令的变体。 (参见 ImageMagick 的 delegates.xml。对于 -dBATCH -dNOPAUSE -sOutputFile=-o 是 shorthand)

重要的是 ImageMagick 保持锁定状态,您不会不必要地调用中间程序,并且您可以更好地控制渲染参数。 (例如,-r600 是渲染的 DPI,更改 -sDEVICE=pngalpha 允许您直接渲染成您想要的格式)

Manjaro 2021 年 4 月

只需删除 /etc/ImageMagick-7/policy 中 <policymap> 内未注释的行。xml

作为@Richard Kiefer 的高度活跃评论,一个简单的修复是这样的

$ sudo sed -i '/disable ghostscript format types/,+6d' /etc/ImageMagick-6/policy.xml

就我而言,我使用的是 ubuntu 20.10 和 Imagick-7。

在我的 /etc/ImageMagick-6/policy.xml 中,我删除了以下行, 重新启动我的机器,我就完成了。

  <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" />