转换:未经授权的``aaaa''@ error / constitute.c / ReadImage / 453


309

我想通过使用convertImageMagick 创建一个验证码图片。

我遵循了这一点,但是存在一些问题。

在我的Linux shell中输入:

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

错误是:

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

My ImageMagick:版本:6.7.2-7,我使用安装yum install ImageMagick

我什么都不知道 有什么建议吗?


7
仔细检查policy.xml。安全选项可能会阻止label:协议。
emcconville

2
谢谢!我修改了policy.xml,将这一行注释为“ <policy domain =“ coder” rights =“ none” pattern =“ LAEBL”>“。确实有效!谢谢 !
Jianwei

3
policy.xml在哪里?
阿诺德·罗阿

3
/etc/ImageMagick/policy.xml
健胃

6
/etc/ImageMagick-6/policy.xml
xerostomus

Answers:


445

注意:此答案和其他答案中的解决方案涉及禁用安全措施,以解决任意代码执行漏洞。例如,请参阅此ghostscript 相关公告和此ubuntu相关公告。仅当输入convert来自可靠来源时,才继续使用这些解决方案。

我在php(v.7.1)中使用ImageMagick将PDF文件切片为图像。

首先,我得到如下错误:

异常类型:ImagickException

异常消息:未经授权..... @ error / constitute.c / ReadImage / 412

经过一些更改后,/etc/ImageMagick-6/policy.xml我开始出现错误,例如:

异常类型:ImagickException

异常消息:无法创建临时文件.....权限被拒绝@ error / pdf.c / ReadPDFImage / 465

我的解决方法

在文件中/etc/ImageMagick-6/policy.xml(或/etc/ImageMagick/policy.xml

  1. 评论行

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

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

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

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

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


54
如果自2018年10月4日起在Ubuntu机器上遇到此问题,则此答案应该是可以接受的。其他发行版还有其他问题吗?
LucasBr '18 -10-5

12
就在今天,我也在Ubuntu 16.04上遇到了这个问题。有什么变化吗?另外,我不需要添加LABEL行,只需将PDF的权限从“无”更改为“读取”。
布莱恩特·寇

4
解决了我的Ubuntu 18.04.1 LTS盒中的一个非常类似的问题
mhernandez,

3
在我的服务器中,policy.xml文件最后一次更新是在9月29日,但是问题只是在今天才出现。我正在使用ubuntu服务器14.04.5,但是设置了自动更新。在apt日志中,我发现了有关此更新的信息:imagemagick-common:amd64 (6.7.7.10-6ubuntu3.12, 6.7.7.10-6ubuntu3.13),
Donny Kurnia,

12

161

我多次使用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,即使在openSuse于2018年10月10日进行了更新之后,使用“比较”来比较PDF页面,存在相同的错误。按此处所述更改此行后,它可以正常工作。
凯克斯·多西(Keks Dose)'18 -10-10

我在Ubuntu Xenial 16.04 LTS上,突然我开始在Apache日志中看到该错误。我确认,按照此处所述更改政策后,问题已解决。
user2641103

5
这是最小的正确答案-sNICkerssss的答案在技术上是正确的,但是,命令行使用convertPDF 仅需要一步。
davidA

1
这个“问题”是对Ghostscript功能的快速而肮脏的“修复”,从长远来看,我们应该找到Ghostscript(以及可能的ImageMagick)的替代品。
9ilsdx 9rvj 0lo 18-10-29

4
不要这样 由于可能执行远程代码,因此已将此限制作为安全措施引入(请参阅launchpad.net/ubuntu/+source/imagemagick/8:6.7.7.10-6ubuntu3.13)。因此正确的答案是:您应该使用另一个程序来执行此任务。
玛丽安

64

注意:此解决方案和任何其他“ edit the policy.xml”解决方案均禁用针对ImageMagick中任意代码执行漏洞的安全措施。如果您需要处理不控制100%的输入,则应使用其他程序(而不是ImageMagick)。

如果您仍在这里,则尝试编辑可以完全控制,知道是安全的并且不能由用户编辑的图像。

/etc/ImageMagick/policy.xmlyum安装了一个文件。它几乎禁止了所有操作(为了安全起见,以及防止ImageMagick调用使系统过载)。

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

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

应该可以解决这个问题。

该文件中包含大量文档,因此您应该阅读该文件。例如,如果您需要更多权限,可以将它们组合为:

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

...比删除所有权限检查(即删除或注释该行)更可取。


2
不要这样 由于可能执行远程代码,因此已将此限制作为安全措施引入(请参阅launchpad.net/ubuntu/+source/imagemagick/8:6.7.7.10-6ubuntu3.13)。因此正确的答案是:您应该使用另一个程序来执行此任务。
玛丽安

5
@Marian使用其他程序无济于事-OP专门询问了ImageMagick。响应应为“您应该知道自己在做什么,要自己承担风险,确保系统安全,这是为什么不应该这样做,以及如何做”。
KolonUK

2
直到现在,OP(以及包括我在内的所有人都通过网络搜索到达这里)一直在使用ImageMagick。因此,当然,他们解决这个问题的第一个尝试是使用ImageMagick找到解决方案,因为这需要最少的更改。这并不意味着他们无条件地想要使用ImageMagick。
玛丽安

3
我发现这种对安全性不屑一顾的方法非常不适合成千上万的问答站点(此页面已被浏览10万次,是该问题的最佳搜索结果)—在这里我们要明确指出,有大量的尝试来强调此漏洞的重要性,包括建立一个专门的站点对其进行宣传(imagetragick.com)—玛丽安(Marian)的建议是寻求替代方案而不是绕过安全措施是有效的。我选择改用GIMP。poppler是GhostScript(convert依赖于将PDF页面栅格化为图像)的替代方法
Louis Maddox

1
没有命令行选项可以临时禁用安全策略吗?然后,我们可以将其用于我们信任的特定PDF文件。
HRJ

27

如果有人需要在安装后用一个命令执行此操作,请运行此命令!

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

6
简短一点:sed -i 's/\(<policy domain="coder" rights=\)"none" \(pattern="PDF" \/>\)/\1"read|write"\2/g' /etc/ImageMagick-6/policy.xml
左右左转

5
更简洁。并且需要sudo来编辑/ etc中的文件 sudo sed -i '/PDF/s/none/read|write/' /etc/ImageMagick-6/policy.xml
Naveed


24

投票最高的答案(我没有足够的声誉在此处添加评论)建议对MVG行进行评论,但请记住以下几点:

CVE-2016-3714

ImageMagick支持“ .svg / .mvg”文件,这意味着攻击者可以使用脚本语言(例如MSL(Magick脚本语言)和MVG(Magick矢量图形))编写代码,将其上载为图像文件,并伪装成图像文件。如上所述的用于在服务器端运行恶意命令的软件。例如,在文件中添加以下命令并将其上传到使用易受攻击的ImageMagick版本的Web服务器,将导致在服务器上运行命令“ ls -la”。

exploit.jpg:

推送图形上下文视图框0 0 640 480填充'url(https://website.com/image.png “ | ls” -la)'弹出图形上下文

低于7.0.1-2或6.9.4-0的任何版本都可能受到攻击,受影响的各方应尽快升级到最新的ImageMagick版本。

资源


3
我没有注释掉MVG和PDF-> JPG转换仍然有效。谢谢。
Rimu Atkinson

1
6.7.7-10 看起来是最新版本,于9/28/2018 发布)。我想念什么?$convert --version Version: ImageMagick 6.7.7-10 2018-09-28 Q16 http://www.imagemagick.org
HaPsantran '18 -10-10

有较新的版本imagemagick.org/script/download.php可能您的Linux发行版使用的是较旧的版本。Ubuntu 16.04当前使用6.8.9-9
Nikolay Ivanov

1
很好,因此对Ubuntu团队来说,正确的解决方案是将imagemagick更新为较新版本,而不是破坏现有版本。
9ilsdx 9rvj 0lo

2
否。Ubuntu是一种功能冻结的发行版,不会在上游发布较新的版本。
林布仁

19

在Ubuntu 16.04系统上进行了最新更新后,尝试在.ps文件上运行convert并将其转换为pdf时,我也开始收到此错误。

此修复程序对我有用:

在终端运行中:

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

这应该在gedit文本编辑器中打开policy.xml文件。如果没有,则图像魔术可能会安装在其他位置。然后改变

rights="none" 

rights="read | write" 

文件底部附近的PDF,EPS和PS行。保存并退出,然后图像魔术将再次起作用。



这对Ubuntu 18.04 ImageMagick 6.9.7-4有所帮助。谢谢。

11

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


1
简单而完美。我这样做是因为travis测试失败
Dan Rey Oquindo

1
这是使用大量帖子的唯一解决方案。我将其重命名为policy-disabled.xml。我认为我将还原它,直到确定安全问题得到解决
为止

在使用jupyter笔记本电脑重启内核之后
妮可·道格拉斯

2

在阅读了一些建议并结合了思想之后,对我来说,需要在/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)



2

如果您不需要通过同一工具处理光栅文件和PDF / PS / EPS,请不要松开ImageMagick的安全性。

相反,请保持完整的Web应用程序防御措施,检查是否已为所有已知-dSAFER漏洞修补了Ghostscript ,然后直接调用它。

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命令行选项!:)
克里斯·伦戈

@CrisLuengo我也不会。这就是为什么我将它发布到尽可能多的Google搜索结果中的原因,在那里我找到了一个很好的答案。:P
ssokolow

1
使用-r600 -dDownScaleFactor=4150 dpi的文件创建抗锯齿效果更好的结果,发现效果很好。
约翰·科尔

0

error/constitute.c/ReadImage/453 当尝试使用图像magick将eps转换为gif时,我也遇到了错误。我尝试了sNICkersss提出的解决方案,但仍然有错误(尽管与第一个有所不同)e error/constitute.c/ReadImage/412 解决问题的方法是放入read其他条目

 <policy domain="coder" rights="read" pattern="PS" />
 <policy domain="coder" rights="read" pattern="EPS" />
 <policy domain="coder" rights="read" pattern="PDF" />
 <policy domain="coder" rights="read" pattern="XPS" />
 <policy domain="coder" rights="read|write" pattern="LABEL" />

1
这并不能真正回答问题。如果您有其他问题,可以点击提问进行提问。一旦您有足够的声誉,您还可以悬赏以吸引更多对此问题的关注。- 评论
-Sirence

谢谢你的建议。同时,我编辑了答案。无论如何,我真的觉得这应该是对sNICkerssss答案的评论,但是由于我无法添加,这是我想出的最好方法
lambertmular

@Sirence这是一个答案,被认为很差,因为它是从其他答案中复制而来的。
9ilsdx 9rvj 0lo

@ 9ilsdx9rvj0lo我的评论来自编辑之前。stackoverflow.com/posts/52700739/revisions
Sirence,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.