![\includegraphics 的安全性(输入不受信任)](https://linux22.com/image/351271/%5Cincludegraphics%20%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%EF%BC%88%E8%BE%93%E5%85%A5%E4%B8%8D%E5%8F%97%E4%BF%A1%E4%BB%BB%EF%BC%89.png)
使用包\includegraphics
中的命令时graphicx
,使用来自你不信任的人的图像是否存在安全隐患?潜在成为对手?
如果你现在想知道为什么有人会这样做,我认为这种情况根本不是那么牵强。我只是想确保,尽管我可能会拍摄一些通过电子邮件收到的图像并将其包含在我的 LaTeX 文档中,但我的计算机不会立即面临被黑客入侵的危险。
当然,我知道永远不会有 100% 的安全,但这个问题是关于可能发生或不发生的事情。
其他处理图像的软件,如 ImageMagick,也有一些严重的漏洞时不时地。所以我想知道使用 LaTeX (XeLaTeX) 是否也能实现这一点(或者说,很可能)。
如果只是将图像原封不动地一点一点地复制到生成的 PDF 中,风险可能较低。但如果以某种方式处理图像,例如使用width
、height
或选项,风险可能要高得多scale
。angle
编辑:通过 XeLaTeX 生成两个 PDF,一个包含 PNG 图像,另一个不包含,我可以看到 PNG 文件大小的 123.6% 被添加到 PDF 文件的大小中。因此,PNG 的字节绝对不会直接写入 PDF,尽管这可能有效。
了解 PDF 文档中的图像的实际工作方式[1] [2] [3]graphicx
并试图理解一点[4],似乎图像数据至少被解码,然后重新编码以用于 PDF。所以 LaTeX 可能就是这样做的。这意味着肯定存在一个可能出现漏洞的较小攻击面,因为 LaTeX 不仅转发来自图像的字节,还会接触和处理它们。
另一方面,改变尺寸或旋转图像似乎不涉及任何实际处理,而只是写入 PDF 的一些略有不同的控件,这些控件会改变查看器稍后显示图像的方式。在测试了 、width
和height
选项的不同组合后,我现在可以支持这一假设keepaspectratio
,所有组合都会生成文件大小相差 0 到 2 个字节的 PDF 文件,尽管插入的 PNG 文件大约为 13 KB。
答案1
latex\includegraphics
宏本身并不能完成任何没有它就无法完成的任务(它只是一个 tex 宏,没有使用任何不能直接使用的特殊指令)。
这意味着,不使用图形包的文档具有与使用图形包的文档完全相同的安全问题。
\includegraphics
它本身的作用非常小,只是提供了一个一致的接口来指定文件名和大小等,然后要求“后端”安排包含文件。这里的“后端”可能是 pdftex 或 luatex 等系统的同一程序的一部分,或者是 latex+dvips 或 xetex+xdvipdfmx 等的单独 dvi 驱动程序。
在早期更值得信赖的时代,文件图像转换调用基本上可以运行任何操作。例如,dvips 有一个约定,如果你在\special
指定图像包含的图像文件名前加上前缀,`
那么它会调用 shell 来执行转换命令,例如,它`zcat foo.eps.Z
会解压缩压缩的 eps 文件并将生成的 EPS 流式传输到 dvips 的图像处理程序中。最初,图形包将此作为默认设置.eps.Z
文件扩展名的默认设置,但可以使用类似的规则来调用任何事物通过向 dvips 发送一些反向字符串。
多年来(可能几十年),dvips 默认配置为不允许这样做,而是对压缩图像进行一些特殊的检测,不涉及指定任何外部命令,并且默认情况下关闭通过反引号的 shell 转义机制。
同样,pdflatex 本身不能包含 eps,因此使用 epstopdf(ghostscript 的薄包装器)将 EPS 转换为 PDF。同样,多年来,您不需要使用显式--shell-escape
pdflatex 来启用此功能(因此冒着启用其他 shell 命令的风险),而是将受限制的repstopdf
脚本列入白名单并允许在默认的“受限”模式下运行。这将以更安全的模式运行 ghostscript,并且几乎所有选项和非本地文件访问都被禁用,因此它不太可能用于除在当前目录中将 eps 转换为 pdf 之外的任何其他用途。
tex 允许调用的白名单命令集没有明确的--shell-escape
参数,而且非常小,但用户也可以设置texmf.cnf
默认列表
% The programs listed here are as safe as any we know: they either do
% not write any output files, respect openout_any, or have hard-coded
% restrictions similar to or higher than openout_any=p. They also have
% no features to invoke arbitrary other programs, and no known
% exploitable bugs. All to the best of our knowledge. They also have
% practical use for being called from TeX.
%
shell_escape_commands = \
bibtex,bibtex8,\
extractbb,\
gregorio,\
kpsewhich,\
makeindex,\
repstopdf,\
texosquery-jre8,\
% we'd like to allow:
% dvips - but external commands can be executed, need at least -R1.
% epspdf, ps2pdf, pstopdf - need to respect openout_any,
% and gs -dSAFER must be used and check for shell injection with filenames.
% pygmentize - but is the filter feature insecure?
% ps4pdf - but it calls an unrestricted latex.
% rpdfcrop - maybe ok, but let's get experience with repstopdf first.
% texindy,xindy - but is the module feature insecure?
% ulqda - but requires optional SHA1.pm, so why bother.
% tex, latex, etc. - need to forbid --shell-escape, and inherit openout_any.
所以基本上这不是一个完整的安全审查,但据我们所知,图形包含不会带来运行任何其他 tex 文档时不存在的风险。
如果您处于不安全的环境中,您可以并且可能应该使用 tex,--no-shell-escape
它甚至可以阻止白名单程序的运行,这会导致(例如)pdflatex 无法自动包含 eps 文件,但您必须提前安排以您认为安全的任何方式将 eps 转换为 pdf。