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

Posted

技术标签:

【中文标题】转换:未授权`aaaa`@错误/构成.c/ReadImage/453【英文标题】:convert:not authorized `aaaa` @ error/constitute.c/ReadImage/453 【发布时间】:2017-08-13 05:11:49 【问题描述】:

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

我关注this,但是有一些问题。

在我的 linux shell 中输入:

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

错误是:

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

我的 ImageMagick:版本:6.7.2-7,我用yum install ImageMagick 安装它。

我一无所知。请问有什么建议吗?

【问题讨论】:

仔细检查policy.xml。安全选项可能会阻止label: 协议。 谢谢!我修改policy.xml,注释这一行“ ”。它确实有效!谢谢! policy.xml 在哪里? /etc/ImageMagick/policy.xml /etc/ImageMagick-6/policy.xml 【参考方案1】:

注意:此解决方案和任何其他“编辑 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" />

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

【讨论】:

不要这样做。由于可能执行远程代码(请参阅launchpad.net/ubuntu/+source/imagemagick/8:6.7.7.10-6ubuntu3.13),此限制已作为安全措施引入。所以正确的答案是:你应该使用另一个程序来完成这个任务。 @Marian 使用另一个程序没有帮助 - OP 专门询问了 ImageMagick。响应应该是“您应该知道自己在做什么,风险自负,确保您的系统是安全的,这就是您不应该这样做的原因,以及如何去做”。 到目前为止,OP(以及通过网络搜索到达这里的人,包括我)一直在使用 ImageMagick;所以当然,他们解决这个问题的第一次尝试是使用 ImageMagick 找到解决方案,因为这需要最少的更改。这并不意味着他们无条件地想要使用 ImageMagick。 我发现这种不屑一顾的安全方法非常不适合数千人看到的问答网站(此页面已被查看 10 万次,是该问题的热门搜索结果)——让我们在这里明确一点,那里是一个大规模的、直言不讳的尝试来强调这个漏洞的重要性,包括建立一个专门的网站来宣传它 (imagetragick.com)——Marian 的建议是应该寻求替代方案而不是绕过安全措施是有效的。我选择使用 GIMP。 poppler 是 GhostScript 的替代品(convert 依赖于将 PDF 页面光栅化为图像) 没有命令行选项可以暂时禁用安全策略吗?然后我们可以将它用于我们信任的特定 PDF 文件。【参考方案2】:

注意:此答案和其他答案中的解决方案涉及禁用用于修复任意代码执行漏洞的安全措施。参见例如this ghostscript-related 和this ubuntu-related 公告。只有当convert 的输入来自受信任的来源时,才能继续使用这些解决方案。

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

首先我遇到如下错误:

异常类型:ImagickException

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

/etc/ImageMagick-6/policy.xml 进行一些更改后,我开始出现以下错误:

异常类型:ImagickException

异常消息:无法创建临时文件..... Permission denied @error/pdf.c/ReadPDFImage/465

我的解决方法

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

    评论行

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

    换行

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

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

    添加行

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

然后重新启动您的网络服务器nginx、apache)。

【讨论】:

如果您自 2018 年 10 月 4 日以来在 Ubuntu 机器上遇到此问题,这应该是可以接受的答案。其他发行版还有其他问题吗? 我今天也在 Ubuntu 16.04 上遇到了这个问题。有什么改变吗?另外我不需要添加 LABEL 行,只需将 PDF 的权限从“无”更改为“读取”。 在我的 Ubuntu 18.04.1 LTS 机器中解决了一个非常相似的问题 这里是相关的变更日志:launchpad.net/ubuntu/+source/imagemagick/8:6.7.7.10-6ubuntu3.13 别忘了重启 php-fpm 以及 sudo systemctl restart php7.2-fpm 或任何你有的版本【参考方案3】:

在尝试使用图像魔法将 eps 转换为 gif 时,我也遇到了错误 error/constitute.c/ReadImage/453。我尝试了 sNICkerssss 提出的解决方案,但仍然有错误(虽然与第一个不同)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" />

【讨论】:

这并不能真正回答问题。如果您有其他问题,可以点击 提问。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review 感谢您的建议。与此同时,我编辑了我的答案。无论如何,我真的觉得它应该是对 sNICkerssss 答案的评论,但由于我无法添加它是我想出的最好方法 @Sirence 这是一个答案,被认为很差,因为它是从其他答案复制而来的。 @9ilsdx9rvj0lo 我的评论来自编辑之前。 ***.com/posts/52700739/revisions【参考方案4】:

最高票数的答案(我没有足够的声誉在那里添加评论)建议注释掉 MVG 行,但请记住这一点:

CVE-2016-3714

ImageMagick 支持“.svg/.mvg”文件,这意味着攻击者可以 用脚本语言编写代码,例如MSL(魔术脚本 语言)和 MVG(Magick 矢量图形),将其上传到服务器 伪装成图像文件并强制软件恶意运行 如上所述的服务器端的命令。例如添加 遵循文件中的命令并将其上传到使用 易受攻击的 ImageMagick 版本将导致运行该命令 服务器上的“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 版本。

Source

【讨论】:

我没有注释掉 MVG 和 PDF -> JPG 转换仍然有效。谢谢。 6.7.7-10 看起来是最新版本,于 2018 年 9 月 28 日发布)。我错过了什么? $convert --version Version: ImageMagick 6.7.7-10 2018-09-28 Q16 http://www.imagemagick.org 有更新版本imagemagick.org/script/download.php 可能您的Linux 发行版使用的是旧版本。 Ubuntu 16.04 目前使用 6.8.9-9 很好,因此 Ubuntu 团队的正确解决方案是将 imagemagick 更新到较新版本,而不是破坏现有版本。 没有。 Ubuntu 是一个功能冻结发行版,不会发布上游更新版本。【参考方案5】:

我多次使用 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"

现在一切正常。

我有“ImageMagick 6.8.9-9 Q16 x86_64 2018-09-28” 关于“Ubuntu 16.04.5 LTS”。

【讨论】:

我在 openSuse Leap 15.0 上并使用“比较”来比较 PDF 页面,同样的错误,甚至在 openSuse 于 2018 年 10 月 10 日更新后。更改线路后如此处所述,它起作用了。 我在 Ubuntu Xenial 16.04 LTS 上,突然我开始在 Apache 日志中看到该错误。我确认,按照此处所述更改政策后,问题已解决。 这是最低限度的正确答案 - sNICkerssss 的答案在技术上是正确的,但是将convert 命令行使用到 PDF 只需要一步。 这个“问题”是对 Ghostscript 功能的快速而肮脏的“修复”,从长远来看,我们应该找到 Ghostscript(可能还有 ImageMagick)的替代品。 不要这样做。由于可能执行远程代码(请参阅launchpad.net/ubuntu/+source/imagemagick/8:6.7.7.10-6ubuntu3.13),此限制已作为安全措施引入。所以正确的答案是:你应该使用另一个程序来完成这个任务。【参考方案6】:

最近对我的 Ubuntu 16.04 系统进行更新后,我在尝试对 .ps 文件运行转换以将它们转换为 pdf 时也开始出现此错误。

这个修复对我有用:

在终端运行中:

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

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

rights="none" 

rights="read | write" 

适用于文件底部附近的 PDF、EPS 和 PS 行。保存并退出,然后图像魔法应该再次工作。

【讨论】:

确保更新 ghostscript kb.cert.org/vuls/id/332928 这有助于 Ubuntu 18.04 ImageMagick 6.9.7-4。谢谢。【参考方案7】:

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

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

【讨论】:

短:sed -i 's/\(&lt;policy domain="coder" rights=\)"none" \(pattern="PDF" \/&gt;\)/\1"read|write"\2/g' /etc/ImageMagick-6/policy.xml 更简洁。并且需要 sudo 来编辑 /etc sudo sed -i '/PDF/s/none/read|write/' /etc/ImageMagick-6/policy.xml中的文件 确保更新 ghostscript kb.cert.org/vuls/id/332928【参考方案8】:

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

rm /etc/<ImageMagick_PATH>/policy.xml

对于 ImageMagick 6,它是:

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

【讨论】:

简单而完美。我这样做是因为 travis 的测试失败了 这是唯一适用于大量帖子的解决方案。我将其重命名为policy-disabled.xml。我想我会恢复它,直到我确定安全问题得到解决 在 jupyter notebook 的情况下重启内核后【参考方案9】:

在阅读了这里的几个建议并结合这些想法后,对我来说,/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)

【讨论】:

【参考方案10】:

我在尝试将 pdf 转换为 jpg 并使用以下方法解决时遇到此错误: 须藤 vi /etc/ImageMagick*/policy.xml

改变:

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

到:

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

来源:http://realtechtalk.com/ImageMagick_Convert_PDF_Not_Authorized-2217-articles

【讨论】:

【参考方案11】:

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

相反,请保持对 Web 应用程序的深度防御完好无损,检查您的 Ghostscript 是否已针对所有已知的-dSAFER 漏洞进行修补,然后直接调用它。

gs -dSAFER -r300 -sDEVICE=png16m -o document-%03d.png document.pdf
-dSAFER 选择退出旧版兼容性“运行 Postscript 将获得与外部世界交互的完全权限,作为图灵完备的编程语言”模式。 -r300 将所需的 DPI 设置为 300(默认为 72) -sDEVICE 指定输出格式(其他选择请参见手册的Devices section。) -o-dBATCH -dNOPAUSE -sOutputFile= 的简写 Ghostscript 手册的This section 提供了一些用于多文件文件名输出的示例格式,但对于实际的语法定义,它为您指出了 C printf(3) 函数的文档。

如果您正在渲染 EPS 文件,请添加 -dEPSCrop 这样它就不会将您的输出填充到页面大小并使用 -sDEVICE=pngalpha 来获得透明背景。

【讨论】:

感谢您提供更安全的解决方案。不过,我不确定我是否能记住 GhostScript 命令行选项! :) @CrisLuengo 我也不会。这就是为什么我将它发布到尽可能多的谷歌搜索结果中,因为它可以很好地回答所提出的问题。 :P 我发现使用 -r600 -dDownScaleFactor=4 创建一个 150 dpi 但抗锯齿效果更好的文件效果很好。

以上是关于转换:未授权`aaaa`@错误/构成.c/ReadImage/453的主要内容,如果未能解决你的问题,请参考以下文章

项目发布后遇到的错误提示归类

命令失败,错误 13(未授权):'未授权

ImageMagick 未授权将 PDF 转换为图像

kibana-RCE <6.6.0 未授权远程代码命令执行 (Need Timelion And Canvas)

Google API 授权(服务帐户)错误:HttpAccessTokenRefreshError:未授权客户端:请求中的未授权客户端或范围

Redis未授权访问docker复现