我刚开始玩arara
我很好奇是否存在安全问题。例如,pdflatex
TeX Live 默认禁用了 shell 转义。如果 TeX Live 团队认为 shell 转义太危险(我不确定这是禁用它的原因)而不能默认启用,那么我不确定赋予arara
这么大的权力是否明智。有没有办法控制 的权力arara
?
我担心的是,可能会将恶意arara
指令注入到包或aux
文件中。
我不太关心 shell 逃逸,而是关心其他可以做的事情。例如,不受信任的包是否可以使用文件内容环境覆盖pdflatex
第一遍的规则,以便在第二遍运行自定义代码?
答案1
我认为我的回答会带有偏见,但我还是想说一下。:)
对我来说,确定它arara
是否安全是一个相当主观的问题。它只是一个具有特定用途的程序,就像大多数可用的工具一样。也许我能想到的最佳答案是:视情况而定。
arara
本质上只是通过指定扩展方式的规则将指令扩展为命令。然后,命令被委托给底层操作系统。
该程序需要有效的指令(映射到规则)才能运行,否则进程将停止。
Uh-oh, I could not find the 'foo' rule in the search path. Could
you take a look if the rule name is correct and if the rule is
accessible through the search path?
如果没有指示,arara
也会抱怨。
I didn't find any directives in 'test.tex', and so didn't do
anything. Is that what you really wanted?
如果我们在启用arara
该--log
选项的情况下运行,我们就可以获得文件中找到的指令列表.tex
。
21 Mar 2013 07:32:10.630 INFO Arara - Welcome to arara!
21 Mar 2013 07:32:10.634 INFO Arara - Processing file 'folheto.tex', please wait.
21 Mar 2013 07:32:10.635 INFO DirectiveExtractor - Reading directives from folheto.tex.
21 Mar 2013 07:32:10.649 TRACE DirectiveExtractor - Directive found in line 1 with pdflatex.
21 Mar 2013 07:32:10.650 TRACE DirectiveExtractor - Directive found in line 2 with clean: { files: [ folheto.aux, folheto.log, folheto.sxc, folheto.synctex.gz ] }.
...
Heiko 建议--dry-run
使用 选项arara
,该选项包括模拟执行而不实际运行命令。希望它将在即将推出的版本中可用。
得到指令后,arara
就会寻找规则。
...
21 Mar 2013 07:32:10.799 INFO TaskDeployer - Deploying tasks into commands.
21 Mar 2013 07:32:10.799 TRACE TaskDeployer - Task 'pdflatex' found in '/usr/local/texlive/2012/texmf-dist/scripts/arara/rules'.
21 Mar 2013 07:32:11.010 TRACE TaskDeployer - Task 'clean' found in '/usr/local/texlive/2012/texmf-dist/scripts/arara/rules'.
21 Mar 2013 07:32:11.083 TRACE TaskDeployer - Task 'clean' found in '/usr/local/texlive/2012/texmf-dist/scripts/arara/rules'.
21 Mar 2013 07:32:11.099 TRACE TaskDeployer - Task 'clean' found in '/usr/local/texlive/2012/texmf-dist/scripts/arara/rules'.
21 Mar 2013 07:32:11.104 TRACE TaskDeployer - Task 'clean' found in '/usr/local/texlive/2012/texmf-dist/scripts/arara/rules'.
...
arara
根据指令显示规则的完整路径。然后命令将被执行。
...
21 Mar 2013 07:32:11.108 INFO CommandTrigger - Ready to run commands.
21 Mar 2013 07:32:11.108 INFO CommandTrigger - Running 'PDFLaTeX'.
21 Mar 2013 07:32:11.108 TRACE CommandTrigger - Command: pdflatex "folheto.tex"
...
回到问题。是否有可能通过 运行恶意代码arara
?是的。这有问题吗?不。:)
毕竟,我们可以得到一个 Perl 程序,并故意将代码注入其执行中。或者编写一个包含恶意 Lua 代码的文件。或者在我们的系统中.tex
运行一个恶意的 Makefile 。rm -rf /
我认为安全问题是有效的。让我们看一个例子,规则clean
。
!config
# Clean rule for arara
# author: Paulo Cereda
# requires arara 3.0+
identifier: clean
name: CleaningTool
command: <arara> @{remove}
arguments:
- identifier: remove
default: <arara> @{isFalse(file == getOriginalFile(), isWindows("cmd /c del", "rm -f").concat(' "').concat(file).concat('"'))}
使用此指令
% arara: clean: { files: [ foo.aux, foo.log ] }
将arara
删除两个文件,foo.aux
和foo.log
。有一个重要的检查,如果没有提供指令参数,它将阻止arara
删除主文件。比如说,.tex
files
% arara: clean
什么也没做。
假设我们将该default
指令替换为
default: <arara> @{isWindows("cmd /c del", "rm -f").concat(' "').concat(file).concat('"')}
如果我们尝试
% arara: clean
主.tex
文件(可能foo.tex
)将会消失!很棒不是吗?:)
当然,我们谈论的是一个错误的规则。
arara
具有以下工作流程:
- 阅读所有指令。
- 找出它们对应的规律。
- 将指令扩展为命令。
- 运行所有命令。
这就是该计划背后的基本思想。
值得一提的是,该程序使用库来执行这些不允许子 shell 调用的外部命令。
无论如何,我真的不知道还能说什么。:)
我们都容易受到恶意软件的攻击,但这是我们必须承担的风险。幸运的是,源代码必须可用才能达到 CTAN(不完全正确,但对于软件包来说确实如此),因此我们始终可以检查条目中是否存在可疑元素。
正如我所说,LuaTeX 允许 Lua 的 I/O,这也可能是危险的。我们有时会面临某种程度的威胁,这取决于我们的使用情况。:)
arara
并且在没有沙箱的服务器中运行(或任何程序)......哎哟。:)
答案2
shell escape
将允许pdflatex
保存、写入、删除和调用系统中的另一个程序。有时这可能很危险,因为恶意代码可能会被调用和执行,从而危及系统。
另一方面,Arara 执行用户在文档中编写的指令。没有指令,则不会执行任何操作。这些指令由更多可爱的人(;-)
,更易于阅读。例如,如果指令说arara: pdflatex: {shell: yes}
,那么它是YES,shell escape
否则为NO。
简而言之,
如果您有要使用的指令
shell escape
,那么它才会被使用。这些指令位于源代码的顶部,易于阅读。如果您没有编写这些指令,则可以通过放置一个来轻松禁用该选项,
no
这样就安全了。使用 arara 的另一个好处是您可以有选择地启用
shell escape
特定文档。
因此,我觉得使用 arara 是安全的,因为作者是我的好朋友;-)
。
答案3
总的来说,我认为pdflatex
相当安全,因为它实际上只能读取和写入文件。我知道 TeX 是图灵完备的,你可以让它吐司,但我认为做些恶意的事情需要做很多工作。另一方面,arara
拥有对命令行的完全访问权限,我认为只需相对较少的工作就可以做坏事。我所考虑的安全漏洞类型可以从以下不完全工作的示例看出
% arara: pdflatex
% arara: pdflatex
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{pdflatex.yaml}
!config
identifier: pdflatex
name: pdflatex
command: touch temp.txt
arguments:
- identifier: target
flag: <arara> @{parameters.target}
\end{filecontents*}
\begin{document}
Hello World
\end{document}
这个想法是filecontents
利用环境来覆盖arara
pdflatex
规则以执行恶意操作。要执行恶意操作,您需要替换良性操作touch temp.txt
并混淆filecontents
,但这些都不太难。
攻击背后的想法只有在tex
可以写入arara
规则目录时才有效。我认为这是一个主要限制,因为我相信写入位置有相当严格的限制pdflatex
。也就是说,我打算arara
将当前目录添加到arara
规则路径中。
攻击无法完全奏效的原因是,第二arara
pdflatex
条指令没有调用环境pdflatex
编写的新规则filecontents
,而是使用原始规则。如果编写了重载规则,并且下次arara
运行时使用了恶意规则,攻击仍然会成功。这种行为对我来说有点令人惊讶,我不确定这是有意为之。尽管如此,它作为安全预防措施还是很有用的。