【问题标题】:Accessing files from Ghostscript commands with -dSAFER使用 -dSAFER 从 Ghostscript 命令访问文件
【发布时间】:2019-01-12 12:10:37
【问题描述】:

我正在尝试编写一些gs 命令供服务器端使用。不能假定我必须使用的用户提供的 PDF/JPEG 文件是安全的(可能会提供损坏的甚至恶意文件)。因此,我尝试使用-dSAFER 编写我所有的 Ghostscript 命令,以保证至少基本级别的安全性。

很遗憾,-dSAFER 似乎与某些gs 命令不兼容。以下面的命令为例:

# count number of pages in PDF
gs -dQUIET -dBATCH -dNOPAUSE -dNOSAFER -dNODISPLAY \
   -c "(input.pdf) (r) file runpdfbegin pdfpagecount = quit"

你会如何用-dSAFER 重写这个命令?如果我只添加-dSAFER,命令将失败,因为gs 无法读取文件input.pdf(这是我所期望的)。我如何告诉gs 允许阅读input.pdf,但没有别的?也许有办法只允许从某些目录读取文件?


这是第二个示例命令:

# convert JPEG to single-page PDF
gs -dQUIET -dBATCH -dNOPAUSE -dNOSAFER \
   -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSettings=/printer \
   -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray \
   -sOutputFile=output.pdf \
   viewjpeg.ps \
   -c "(input.jpg) << /PageSize 2 index viewJPEGgetsize 2 array astore >> setpagedevice viewJPEG"

此命令与第一个命令的问题完全相同。我如何用-dSAFER 重写这个?


如果您认为我的命令确实不需要-dSAFER,请在您的回答中包含指向相关文档的链接。

【问题讨论】:

    标签: ghostscript


    【解决方案1】:

    您可以使用-I 将目录添加到搜索列表,IIRC 允许读取任何此类目录。对于当前目录,您还可以使用-P--P

    查看 ghostpdl/doc 目录中的 Use.htm。

    但是,即使添加当前目录允许您读取文件,这也将很快停止使用 -dSAFER。当 -dSAFER 通过隐藏/删除任何非标准运算符特别是设置时,有一个正在进行的程序来“强化”解释器,如果它们有可能被滥用的话。

    简单地说,您建议的用法与-dSAFER 不兼容。您使用的命令几乎肯定会被明确禁止,因为它们本质上是不安全的。从本质上讲,像这样搞乱内部 PDF 文件,您的 PostScript 程序是不安全的。

    当然,知道您的 PostScript 程序是安全的,而且由于您没有执行 PDF 的任何部分,因此 PDF 也是安全的。只有当您尝试实际执行内容时,PDF 才会是不安全的,而您的程序不会这样做。它只是打开文件读取 Pages 树,并告诉您与 Count 键关联的值。

    因此,无论如何您都不需要在此特定示例中设置-dSAFER。然而,任何执行 PDF 内容的此类程序(例如,通过渲染它的任何部分,或将其发送到 pdfwrite 设备)都是不安全的。

    您的第二个示例也不需要 SAFER,因为 JPEG 不能包含访问磁盘的代码。

    【讨论】:

    • 感谢您提供信息丰富的回复!不幸的是,我还必须编辑并因此“执行”PDF,并使用pdfwrite 设备将它们写回文件系统。我想制作和保持这些命令的安全是非常困难的。然而,我的一位同事提出了在 Docker 容器中单独运行我们的每个 gs 命令的想法。这会增加一些启动/停止容器的开销,但会完全解决我们对 Ghostscript 安全性的所有担忧。
    • 是的,沙盒确实是目前唯一的解决方案,因为 PDF 解释器是在 PostScript 中实现的,这意味着恶意 PDF 文件可以执行 PostScript 语言结构。没有 -dSAFER 允许访问文件系统(并执行进程)。使用 -dSAFER,我们选择尽可能紧密地锁定系统,这意味着我们将不允许访问 PDF 解释器的内部。恐怕该代码基本上不可能确保安全。
    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2010-12-15
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多