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.04 到 21.04 以及可能随 ImageMagick 6 附带的任何更高版本中,以下是解决问题的方法通过删除解决方法:
确保你的 Ghostscript ≥9.24:
gs --version
如果是,只需从 /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 文件。这是编辑它的终端方式。
在终端中输入此命令打开 policy.xml 文件 -
sudo nano /etc/ImageMagick-6/policy.xml
现在,直接在终端编辑文件,找到
<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" />
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.04 到 21.04 以及可能随 ImageMagick 6 附带的任何更高版本中,以下是解决问题的方法通过删除解决方法:
确保你的 Ghostscript ≥9.24:
gs --version
如果是,只需从
/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 文件。这是编辑它的终端方式。
在终端中输入此命令打开 policy.xml 文件 -
sudo nano /etc/ImageMagick-6/policy.xml
现在,直接在终端编辑文件,找到
<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" />