转换:未授权 `aaaa` @ 错误/构成.c/ReadImage/453

351

我想使用ImageMagick中的convert命令创建一个验证码图片。

我遵循这个链接的方法,但是遇到了一些问题。

在我的Linux shell中输入:

convert -background white -fill black -font FreeSerif-Bold -pointsize 36 label:'adfgh' ./test.png

错误信息为:

convert:未授权的 adfgh @ error/constitute.c/ReadImage/453. convert:缺少图像文件名 ./test.png @ error/convert.c/ConvertImageCommand/3015

我的ImageMagick版本是:6.7.2-7,我是通过 yum install ImageMagick 安装的。

我一片茫然,请问有什么建议吗?


9
请再次检查 policy.xml 文件。安全选项可能会阻止 label: 协议。 - emcconville
2
谢谢!我修改了 policy.xml 文件,并将此行注释掉:"<policy domain="coder" rights="none" pattern="LAEBL">"。它有效了!谢谢! - jianwei
5
答:policy.xml 文件在哪里? - Arnold Roa
4
/etc/ImageMagick/policy.xml是一个文件路径。 - jianwei
8
/etc/ImageMagick-6/policy.xml 是一个文件路径,指的是 ImageMagick 图像处理软件的策略文件。 - xerostomus
显示剩余2条评论
11个回答

485
注意:本答案和其他答案中的解决方案涉及禁用安全措施,这些措施旨在修复任意代码执行漏洞。例如,请参见此ghostscript相关此ubuntu相关公告。仅当convert的输入来自可信源时,请继续使用这些解决方案。
我在php(v.7.1)中使用ImageMagick将PDF文件切片为图像。首先,我遇到了错误,例如:
异常类型:ImagickException 异常消息:not authorized ..... @ error/constitute.c/ReadImage/412
在对/etc/ImageMagick-6/policy.xml进行一些更改后,我开始遇到类似于以下错误:
异常类型:ImagickException 异常消息:unable to create temporary file ..... Permission denied @ error/pdf.c/ReadPDFImage/465
我的解决方法是:
在文件/etc/ImageMagick-6/policy.xml(或/etc/ImageMagick/policy.xml)中:
  1. comment line

    <!-- <policy domain="coder" rights="none" pattern="MVG" /> -->
    
  2. change line

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

    to

    <policy domain="coder" rights="read|write" pattern="PDF" />
    
  3. add line

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

然后重新启动你的Web服务器(nginx,apache)。


54
如果您在2018年10月4日或之后的Ubuntu系统上遇到了此问题,那么这应该是可接受的答案。其他发行版有类似的问题吗? - LucasBr
13
我今天在Ubuntu 16.04上也遇到了这个问题。有什么变化吗?此外,我不需要添加LABEL一行,只需将PDF的权限从“none”更改为“read”。 - Bryant Kou
5
在我的Ubuntu 18.04.1 LTS电脑上,解决了一个非常类似的问题。 - mhernandez
12
以下是相关的更新日志链接:https://launchpad.net/ubuntu/+source/imagemagick/8:6.7.7.10-6ubuntu3.13 - Donny Kurnia
4
别忘了重启 php-fpm,命令是 sudo systemctl restart php7.2-fpm,根据你所用的版本修改相应的版本号。 - dinbrca
显示剩余13条评论

179

我经常使用ImageMagic的convert命令将*.tif文件转换为*.pdf文件。

但今天我不知道为什么会收到以下错误:

convert: not authorized `a.pdf' @ error/constitute.c/WriteImage/1028.

发布命令后:

convert a.tif a.pdf

阅读上述答案后,我编辑了文件/etc/ImageMagick-6/policy.xml

并更改了以下行:

policy domain="coder" rights="none" pattern="PDF" 

policy domain="coder" rights="read|write" pattern="PDF"

现在一切都正常工作。

我在“Ubuntu 16.04.5 LTS”上使用“ImageMagick 6.8.9-9 Q16 x86_64 2018-09-28”。


1
我使用的是openSuse Leap 15.0,并使用“compare”比较PDF页面,但仍然出现相同的错误,即使在2018年10月10日openSuse进行了更新。按照这里描述的更改行后,它可以正常工作。 - Keks Dose
我正在使用Ubuntu Xenial 16.04 LTS,突然在Apache日志中看到了那个错误。我确认按照这里描述的更改策略后问题得到解决。 - user2641103
6
这是最精简的正确答案 - sNICkerssss 的回答在技术上是正确的,但是在使用 convert 命令行将其转换为 PDF 时只需要一步即可。 - davidA
1
这个“问题”是对Ghostscript功能的快速而简单的“修复”,从长远来看,我们应该找到Ghostscript(以及可能是ImageMagick)的替代品。 - 9ilsdx 9rvj 0lo
5
不要这样做。由于可能存在远程代码执行的情况(请参见https://launchpad.net/ubuntu/+source/imagemagick/8:6.7.7.10-6ubuntu3.13),此限制已作为安全措施引入。因此,正确的答案是:您应该使用另一个程序来完成此任务。 - Marian
请确保更新ghostscript https://www.kb.cert.org/vuls/id/332928/ - ykay says Reinstate Monica

71

注意:这种方法以及任何其他“编辑policy.xml”解决方案都会禁用ImageMagick中针对任意代码执行漏洞的安全措施。如果您需要处理您无法100%控制的输入,应使用其他程序(而不是ImageMagick)。

如果您仍然在此处,请注意,您正在尝试编辑您完全掌控、知道其安全性并且用户无法编辑的图像。

通过yum安装了一个名为/etc/ImageMagick/policy.xml的文件。它几乎禁止所有操作(出于安全和保护系统免受ImageMagick调用过载的考虑)。

如果您遇到ReadImage错误,则可以将该行更改为:

<policy domain="coder" rights="read" pattern="LABEL" />

这应该可以解决问题。

文件中有很多文档,所以您应该阅读一下。例如,如果您需要更多的权限,您可以像这样组合它们:

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

相比于移除所有权限检查(即删除或注释掉该行),这种方法更可取。


2
不要这样做。由于可能存在远程代码执行的风险(请参见https://launchpad.net/ubuntu/+source/imagemagick/8:6.7.7.10-6ubuntu3.13),此限制已作为安全措施引入。因此,正确的答案是:您应该使用另一个程序来完成此任务。 - Marian
请务必更新ghostscript https://www.kb.cert.org/vuls/id/332928/ - ykay says Reinstate Monica
7
@Marian 使用其他程序并没有帮助 - OP 特别询问了 ImageMagick。回复应该是 "你应该知道自己在做什么,自担风险,确保你的系统安全,这就是你不应该使用它的原因,以及如何去实现它"。 - KolonUK
4
OP(以及通过网络搜索到此处的人,包括我)一直在使用ImageMagick;因此,当遇到问题时,他们首先尝试使用ImageMagick解决问题,因为这需要进行最少的更改。但这并不意味着他们无条件地想要使用ImageMagick。 - Marian
4
我认为对于一个被数千人浏览(此页面已被查看了 10 万次,并且是此问题的首选搜索结果)的问答网站来说,这种对安全问题的轻视态度非常不合适。让我们明确一下,在这里有一个大而响亮的尝试,强调这个漏洞的重要性,包括建立一个专门的网站来宣传它 (https://imagetragick.com/)。Marian 的建议寻找替代方案而不是绕过安全措施是有道理的。我选择使用 GIMP 来代替。poppler 是 GhostScript 的替代品(convert 依赖于它将 PDF 页面转换为图像)。 - Louis Maddox
1
有没有命令行选项可以暂时禁用安全策略?这样我们就可以将其用于我们信任的特定PDF文件。 - HRJ

30

如果有人安装完成后需要一条命令完成操作,则运行此命令!

sed -i 's/<policy domain="coder" rights="none" pattern="PDF" \/>/<policy domain="coder" rights="read|write" pattern="PDF" \/>/g' /etc/ImageMagick-6/policy.xml

7
简化版:sed -i 's/\(<policy domain="coder" rights=\)"none" \(pattern="PDF" \/>\)/\1"read|write"\2/g' /etc/ImageMagick-6/policy.xml - leftaroundabout
7
需要更简明。在 /etc 目录中编辑文件需要使用 sudo 权限。sudo sed -i '/PDF/s/none/read|write/' /etc/ImageMagick-6/policy.xml - Naveed
请确保更新Ghostscript https://www.kb.cert.org/vuls/id/332928/。 - ykay says Reinstate Monica

26

只需删除 /etc/ImageMagick/policy.xml 文件即可。例如:

rm /etc/<ImageMagick_PATH>/policy.xml

对于 ImageMagick 6,它应该是:

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

1
简单而完美。我这样做是因为测试在 Travis 上失败了。 - Dan Rey Oquindo
2
这是从众多帖子中找到的唯一有效的解决方案。我将其重命名为 policy-disabled.xml。在确保安全问题得到解决之前,我认为我会恢复它。 - groovenectar
1
在jupyter笔记本的情况下,重新启动内核。 - Nicole Douglas

25
最高票答案(我没有足够的声望在那里添加评论)建议注释掉MVG行,但要记住这一点:
CVE-2016-3714 ImageMagick支持".svg/.mvg"文件,这意味着攻击者可以使用脚本语言(例如Magick脚本语言和Magick矢量图形)创建代码,并将其上传到伪装成图像文件的服务器上,并强制软件在服务器端运行恶意命令,如上所述。例如,在文件中添加以下命令并将其上传到使用易受攻击的ImageMagick版本的Web服务器将导致在服务器上运行“ls -la”命令。
exploit.jpg: push graphic-context viewbox 0 0 640 480 fill 'url(https://website.com/image.png"|ls "-la)' pop graphic-context
任何低于7.0.1-2或6.9.4-0版本的版本都有潜在漏洞,受影响方应尽快升级到最新的ImageMagick版本。 来源

3
我没有注释掉MVG和PDF -> JPG转换仍然有效。谢谢。 - Rimu Atkinson
1
6.7.7-10 看起来 是最新版本,发布于2018年9月28日。我错过了什么吗?$convert --version 版本:ImageMagick 6.7.7-10 2018-09-28 Q16 http://www.imagemagick.org - HaPsantran
1
很好,那么Ubuntu团队的正确解决方案应该是更新ImageMagick到新版本,而不是破坏现有版本。 - 9ilsdx 9rvj 0lo
2
不会。Ubuntu是一个特性冻结的发行版,不会发布更新的上游版本。 - Buo-ren Lin
请确保更新Ghostscript https://www.kb.cert.org/vuls/id/332928/。 - ykay says Reinstate Monica
显示剩余3条评论

19

最近我的Ubuntu 16.04系统更新后,我尝试将.ps文件转换为pdf时也出现了这个错误。

以下修复方法适用于我:

在终端中运行:

sudo gedit /etc/ImageMagick-6/policy.xml
这应该会在 gedit 文本编辑器中打开 policy.xml 文件。如果没有成功,那可能是你的 ImageMagick 安装在其它位置。

rights="none" 

rights="read | write" 

对于文件底部附近的PDF、EPS和PS行。保存并退出,然后ImageMagick应该可以正常工作。


1
请确保更新Ghostscript https://www.kb.cert.org/vuls/id/332928/。 - ykay says Reinstate Monica
这对于Ubuntu 18.04 ImageMagick 6.9.7-4有所帮助。谢谢。 - And

5

4
如果您不需要通过同一工具处理光栅文件和PDF / PS / EPS,请勿放松ImageMagick的安全性。相反,保持您网站应用程序的深度防御完整无缺,检查您的Ghostscript是否已修补所有已知的-dSAFER漏洞,然后直接调用它。
gs -dSAFER -r300 -sDEVICE=png16m -o document-%03d.png document.pdf
  • -dSAFER选项可以使程序退出传统兼容模式,从而防止Postscript以完全权限与外界交互,避免其变成图灵完备的编程语言。
  • -r300将所需DPI设置为300(默认值为72)。
  • -sDEVICE指定输出格式(请参阅手册中的设备部分了解其他选项)。
  • -o是一个缩写,等同于 -dBATCH -dNOPAUSE -sOutputFile=
  • Ghostscript手册的该部分提供了一些多文件文件名输出的示例格式,但对于实际的语法定义,它会指向C printf(3)函数的文档。

如果要渲染EPS文件,请添加-dEPSCrop,以避免填充您的输出到页面大小,并使用-sDEVICE=pngalpha来获取透明背景。


谢谢提供更安全的解决方案。不过我不确定我能记住GhostScript命令行选项! :) - Cris Luengo
@CrisLuengo 我也不会。这就是为什么我把它发布到尽可能多的谷歌搜索结果中,因为它是对所提出问题的一个好答案。 :P - ssokolow
1
我发现使用“-r600 -dDownScaleFactor=4”可以得到很好的结果,生成一个150 dpi但更好的反锯齿文件。 - John Cole

3

在阅读了这里的多个建议并结合了这些想法后,我发现需要在/etc/ImageMagick-6/policy.xml文件中进行以下更改:

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

使用“rights =”none“”并没有帮助。 “pattern =”LABEL“”并不是必需的。 虽然我不使用大型png文件(只有约1 MB),但还是需要进行一些内存限制方面的更改:

<policy domain="resource" name="memory" value="2GiB"/>

(而不是256Mib),以及

<policy domain="resource" name="area" value="2GB"/>

(而不是 128 MB)


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