ImageMagick安全策略阻止PDF转换

788

Imagemagick安全策略似乎不允许我将pdf转换为png。转换其他扩展名似乎可以正常工作,只是无法从pdf转换。自从我安装它以来,我没有更改过Imagemagick的任何设置... 我正在使用Arch Linux,如果操作系统有关系的话。

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.

5
可能是ImageMagick not authorized to convert PDF to an image的重复问题。 - Raedwald
那个链接是关于文件未找到错误的。 - Soren
14个回答

852

好的,我加上了。

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

/etc/ImageMagick-7/policy.xml</policymap>标签之前加上这行代码就可以使它再次正常工作,但不确定其安全隐患。


10
我认为PDF策略是由于Ghostscript中的一个错误而添加的,但我相信这个错误现在已经被修复了。因此,如果您正在使用当前版本的Ghostscript,则可以将此策略设置为读写权限,这应该没问题。 - fmw42
87
我发现了这一行代码 <policy domain="coder" rights="none" pattern="{PS,PS2,PS3,EPS,PDF,XPS}" />,只需将其取消注释就能使其正常工作。 - jakob-r
27
引起Linux发行版实施此策略的安全漏洞在此处提及:https://www.kb.cert.org/vuls/id/332928/ - Jason Siefken
60
我想你已经把它注释掉了...;-) - AstroFloyd
5
确保更新Ghostscript https://www.kb.cert.org/vuls/id/332928/ - ykay says Reinstate Monica
显示剩余19条评论

537

这个问题是一个安全漏洞的解决方法。在 Ghostscript 9.24 中 已经修复 这个漏洞,因此如果您使用该版本或更新版本,则不再需要这个解决方法。

对于 Ubuntu 19.0422.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" />
    

 

细节:仅删除pattern="PDF"的行就足以重新启用PDF转换。在我的电脑上,我也删除了其他基于PostScript的文件类型的行,因为我看不到阻止Image Magick与这些文件一起工作的理由。(仅谈论个人电脑。在Web服务器上,您可能认为它很危险,因为基于PostScript的文件可能包含脚本...实际上,PostScript是脚本。)

归属:@jakob-r's comment在另一个答案中。加上下面有用的评论↓


6
在Ubuntu 19.04系统上,我唯一有效的解决方法是使用gs 9.26。 - ManuelTS
124
sed -i '/disable ghostscript format types/,+6d' /etc/ImageMagick-6/policy.xml 对我来说运行良好。 (注:该命令是在Linux系统中操作ImageMagick软件的一个命令,作用是删除指定文件中关于Ghostscript格式类型的限制) - Richard Kiefer
12
在Ubuntu 20.04工作过。 - Alex K.
4
这句话的意思是你要让ImageMagick拥有完全的权限来处理Ghostscript文件。这会将该文件恢复到之前临时解决安全问题(https://www.kb.cert.org/vuls/id/332928/)时的状态。请注意不要改变原文的含义,使翻译更通俗易懂。 - tanius
3
曾在Ubuntu 21.04上工作。 - Max N
显示剩余9条评论

178

正如一些评论所指出的那样,您需要编辑/etc/ImageMagick-7/policy.xml中的ImageMagick策略。 更特别地说,在撰写本文时(2019年5月1日),在ArchLinux中以下行未被注释:

<policy domain="coder" rights="none" pattern="{PS,PS2,PS3,EPS,PDF,XPS}" />
只需将其置于<!---->之间以进行注释,PDF转换应该能够正常工作。

2
请确保Ghostscript已经更新至最新版本 https://www.kb.cert.org/vuls/id/332928/ - ykay says Reinstate Monica
27
这个功能的目的是什么?是为了防止用户生成PDF文件吗? - lmat - Reinstate Monica
25
在一定程度上是这样的。由于ImageMagick通常被网站用来处理上传的文件,而PDF基本上可以包含任何可执行代码之一,因此拥有上传权限的任何人都可以执行您的网络用户可以访问的任何任务。如果有人诱骗你将恶意PDF文件转换为任何其他格式,也是一样的。 - TwoD
3
如果因为有人可能会利用我的软件作弊,而决定禁止我使用它,那我会感到非常愤怒。 - Gabriel
@Gabriel 这更多是为了防止人们将恶意PDF文件上传到未经充分净化的图像上传字段中。 (即“通过缩略图生成器入侵他们的网站,而他们从一开始就没有打算支持PDF和Postscript”这种情况。) - ssokolow
显示剩余3条评论

58

对于我在Arch Linux上,我需要注释掉这个:

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

1
在我的系统中,有两个policy.xml文件:/etc/ImageMagick-6/policy.xml/etc/ImageMagick-7/policy.xml。请注意编辑正确的文件! - SylvainB
谢谢,没错!!> yay -F /etc/ImageMagick-7/policy.xml etc/ImageMagick-7/policy.xml 是由 extra/imagemagick 7.0.10.30-1 拥有的 > yay -F /etc/ImageMagick-6/policy.xml etc/ImageMagick-6/policy.xml 是由 extra/libmagick6 6.9.11.30-1 拥有的 > yay -Rs libmagick6 检查依赖项... 错误: 无法准备事务 (无法满足依赖关系) :: 删除 libmagick6 会破坏 inkscape 所需的 'libmagick6' 依赖关系 - soloturn
奇怪。我本来以为像其他答案建议的那样将 rights="read|write" 这样设置就可以了,但是我发现我还需要完全注释掉它。对于熟悉 XML 的人来说,调整你的答案以显示 "comment this" 意味着将 <foo... /> 变成 <!-- <foo... /> --> 就会更好。这样可以避免新用户进行额外的搜索。 - Hendy
从Arch软件包“imagemagick”版本7.1.0.20-2开始,这不再需要。政策变更已从默认配置中删除。 - njam
这对我有效,2022年,ArchLinux,/etc/ImageMagick-7/policy.xml - micfan

42

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

最好将设置保持为ImageMagick拒绝处理需要运行程序的文件,而是在您有意要允许Postscript渲染时直接调用Ghostscript。

可以通过类似于以下Ghostscript命令来实现:

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

是的,这是对GhostScript命令的变化,ImageMagic调用它。(请参见ImageMagick的delegates.xml-o-dBATCH -dNOPAUSE -sOutputFile=的缩写)

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


哇,感谢您提供这个非常好的“解决方法”,而且还很安全;值得更多的赞! - eMPee584
2
试图绕过ImageMagick的PDF安全问题并直接使用Ghostscript也是危险的,因为当处理恶意PDF文件时,Ghostscript也容易受到攻击。 - Avatar
1
@Avatar 除非您采取足够的深度防御措施,否则任何东西都会容易受到恶意PDF文件的攻击,因为Postscript是一种图灵完备语言,而PDF使用了一种修改后的Postscript形式,因此您可以在不渲染整个流的情况下寻找单个页面。这就像说您的Web浏览器容易受到恶意构造的JavaScript的攻击一样。那篇文章只是说Ghostscript像Java Applets一样容易受到0-day攻击的攻击。从“安全”的角度来看,您不太可能将PDF渲染暴露给内部使用ImageMagick的随机Web应用程序。 - ssokolow
1
要输出 JPG 格式而不是 PNG,请使用 -sDEVICE=jpeg - Paul Tobias
1
Ghostscript现在(从9.50版本开始)默认启用SAFER。请参考https://ghostscript.com/docs/9.54.0/Use.htm#Safer。 - Cliff
1
@Cliff 很好知道,但是安全起见还是谨慎为妙。谁知道要多久才能将最后一批9.50版本之前的构建从LTS系统镜像中清除干净呢。 - ssokolow

39

对于我在我的ArchLinux系统上,这一行已经取消注释。我必须将“none”替换为“read | write”,才能使其工作。


请确保Ghostscript已经更新至最新版本 https://www.kb.cert.org/vuls/id/332928/ - ykay says Reinstate Monica
1
同样。我是时刻保持更新的。 - yukashima huksay
建议是将该行代码进行注释以禁用限制,或者如您所提到的,定义权限>无。 - eMPee584

31

适用于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" />
   -->

9
对我而言,不需要添加 <policy domain="module" rights="read|write" pattern="{PS,PDF,XPS}" /> - leezu

25

正如@Richard Kiefer所做的高度活跃的评论,简单修复方法如下

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

23

对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退出。

在终端中编辑


1
记得在退出前按Ctrl+O保存 - tngotran
1
这对我有用,Ubuntu 21.04。谢谢! - rob grune
也适用于Ubuntu 22.04。 - Fernando Kosh
...或者只需将该行注释掉,如下所示 <!-- <policy domain="coder" rights="none" pattern="PDF" /> --> - johnrbnz

16

在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 

2023年8月:Devuan Daedalus:这个好用! - vrgovinda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接