我如何安全地编译其他人的 LaTeX 文档?

我如何安全地编译其他人的 LaTeX 文档?

我是一名程序员,作为网站的一部分,我需要能够获取 LaTeX 源文件并对其进行编译,然后将 pdf 返回给用户。这似乎很危险,因为恶意用户可以通过这种方式在服务器上读取和写入文件。是否可以“清理”LaTeX 文件,以便安全地进行编译,还是太复杂了?

答案1

其中texmf.cnf有一些选项可以限制 TeX 文档的功能。从安全角度来看,最重要的是(使用我本地 texmf.cnf 中的值,这些值可能是也可能不是您系统上的默认值):

% Enable system commands via \write18{...}.  When enabled fully (set to
% 1), obviously insecure.  When enabled partially (set to p), only the
% commands listed in shell_escape_commands are allowed.  Although this
% is not fully secure either, it is much better, and so useful that we
% enable it for everything but bare tex.
shell_escape = p

% Special: convert is the standard command name for ImageMagick, but it
% is also the name of a dangerous filesystem-changing command on
% Windows.  So enable imgconvert (used in w32tex), but not convert.

% No spaces in this command list.
shell_escape_commands = \
bibtex,bibtex8,dvips,epstopdf,epspdf,etex,fc-match,\
imgconvert,\
kpsewhich,makeindex,mkgrkindex,\
pdfluatex,ps2pdf,ps4pdf,pstopdf,pygmentize,\
rpdfcrop,texindy,xindy,ulqda\

% plain TeX should remain unenhanced.
shell_escape.tex = f

我认为您可能希望将其简单地设置为shell_escape = f

% Allow TeX \openin, \openout, or \input on filenames starting with `.'
% (e.g., .rhosts) or outside the current tree (e.g., /etc/passwd)?
% a (any)        : any file can be opened.
% r (restricted) : disallow opening "dotfiles".
% p (paranoid)   : as 'r' and disallow going to parent directories, and
%                  restrict absolute paths to be under $TEXMFOUTPUT.
openout_any = p
openin_any = a

这允许任何人读取您系统上的任何文件(如果用户拥有必要的权限),因此您可能也想改变这一点。

% Allow TeX and MF to parse the first line of an input file for
% the %&format construct.
parse_first_line = t

这可能会导致使用非预期的另一个宏包读取 tex 文件 - 我不知道这是否至关重要,但您应该考虑一下。

% Enable the mktex... scripts by default?  These must be set to 0 or 1.
% Particular programs can and do override these settings, for example
% dvips's -M option.  Your first chance to specify whether the scripts
% are invoked by default is at configure time.
% 
% These values are ignored if the script names are changed; e.g., if you
% set DVIPSMAKEPK to `foo', what counts is the value of the environment
% variable/config value `FOO', not the `MKTEXPK' value.
% 
% MKTEXTEX = 0
% MKTEXPK = 0
% MKTEXMF = 0
% MKTEXTFM = 0
% MKTEXFMT = 0
% MKOCP = 0
% MKOFM = 0

这些设置(或非设置)决定是否在需要时自动生成所需文件(如字体/字体指标)。我不知道这是否会造成安全风险,但它肯定会延长编译时间。

稍后会设置一些内存限制,这也可能会有用。

您可以在 texmf.cnf 中全局更改这些设置,或者将它们作为环境变量提供给调用的程序(环境优先)。

命令行上也可以给出一些选项。

答案2

在配置texmf.cnf文件中,您可以禁止执行外部程序。运行kpsewhich texmf.cnf以找到文件的位置。

答案3

您可以过滤某些特定的宏,但肯定有办法解决这个问题。如果您不使用 TeX 本身,TeX 是一种非常复杂的语言,很难解析。

您需要确保该-shell-escape选项已禁用,这已是默认设置。全局设置已启用,texmf.cnf但无论如何都可以覆盖-no-shell-escape

您可能希望使用该-output-directory选项或在安全目录中运行latex编译器。但是这并不妨碍文档读取和写入其他目录中的文件。

对于类 Unix 操作系统,我建议在chroot环境中的系统文件最少,且用户只具有最低限度的读写权限。再加上禁用 shell 逃逸,应该会非常安全。

相关内容