我遇到了这个问题:SQL 中最危险的命令是什么?我也想到了一个类似的,
LaTeX 中是否存在任何危险的命令?
经过危险的我们可能指的是以下任何一种或所有的情况:
- 当某人在文件中无意中使用某个特定命令时,该命令可能会损害某人的系统或文件。
- 可能有人会恶意地将命令放入文件中,然后将该文件交给某人,当该文件在远程系统中被编译时,就会发生危害。
- 文件中的命令会导致文件的编译过程消耗极高的资源。
- 一个命令将导致 LaTeX 或 TeX 发生故障并产生意外结果。
回答时请附上相关的例子,并解释它究竟会造成怎样的伤害。
答案1
第 1 类
\newwrite\out
\immediate\openout\out=\jobname
\immediate\write\out{Fool!}
\bye
这将覆盖 TeX 文件。
TeX 会遵从你的指令,即使这些指令很愚蠢。但是,它会拒绝在当前工作目录之上写入文件(在最常见发行版的标准设置下)。
显然,如果当前目录是,/
并且您以超级用户权限运行 TeX,那么您可以覆盖系统上的任何内容;但这对于每个能够写出文件的脚本语言解释器都是正确的,所以不是 TeX 的特定事物。
第 2 类
如果你在启用并具有足够权限的情况下运行 TeX -shell-escape
,则可以执行任何程序,包括rm -f /
。因此在启用时要小心-shell-escape
。一些软件包,尤其是minted
要求 -shell-escape
. 在处理从其他人收到的输入文件之前,请先检查它。
第 3 类
与LuaTeX不同的是,TeX引擎仅分配最大数量的内存。
很容易让 TeX 无限循环而不浪费资源
\def\fool{\fool}\fool
另一方面,使用具有动态内存分配的LuaTeX 的复杂图形会导致消耗大量资源。
第 4 类
如果以错误的方式重新定义一个原语,你将会收到令人费解的错误消息,例如
! A <box> was supposed to be here.
<to be read again>
-
l.9 \end{document}
由
\documentclass{article}
\renewcommand{\box}[1]{-#1-}
\begin{document}
\box{abc}
\end{document}
最危险的命令是\renewcommand
(或\def
)。另一个例子是以下
\documentclass{article}
\renewcommand{\fi}{whatever}
\begin{document}
\end{document}
这使得 LaTeX 停止非常令人费解的错误信息
! LaTeX Error: Missing \begin{document}.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.3 \begin{document}
答案2
如果您对 LaTeX 过敏,那么所有 LaTeX 都是危险的。;-)
更严肃一点:
您可能对这些文档感兴趣:
由 Keith Allen McMillan 开发的一款独立于平台的计算机病毒
URL:http://vxheaven.0l.wtf/lib/vkm00.html
网址:ftp://ftp.cerias.purdue.edu/pub/doc/viruses/KeithMcMillan-PlatformIndependantVirus.ps
概括:
在这篇硕士论文中,作者详细阐述了关于是否可以在 LaTeX 中实现平台无关病毒的问题的研究。
作者对病毒的定义如下:计算机病毒是一种计算机程序片段程序用户对此一无所知。当程序执行时,病毒片段会接管控制权并执行其被编程要执行的操作。病毒的目的:
- 通过复制自身或导致其他程序复制它们在受感染的计算机系统上进行传播。
- 保护自己不被发现。
- 可选的“有效载荷”。“有效载荷”可以是恶意行为。
作者将病毒与兔子(兔子不是碎片,而是整个程序)和蠕虫区分开来。蠕虫是自包含的自我复制计算机程序,其传播重点不是受感染计算机系统的文件,而是网络环境,即在尽可能多的机器上复制自身。
在硕士论文的结尾,作者概述了如何用 LaTeX 编写病毒,该病毒无需修改即可在各种计算机平台上运行和传播,只要这些平台支持 LaTeX 和 GNU emacs。为了防止释放这种病毒,作者未提供研究中使用的实际代码。概述的 LaTeX/GNU emacs 病毒没有有效载荷,并且只会感染当前目录中文件扩展名为 .tex 的 LaTeX 文件,其中 -directive\documentstyle
包含注释%DoNotInfectMe
,方法是将自身置于该指令后面。
作者解释说
- GNU emacs 用于向病毒提供一个文件,其中包含当前目录中可感染的目标文件/.tex 文件的列表。
- LaTeX 用于处理那些执行感染工作的宏。
- 作者概述了如何构造病毒执行的 LaTeX 代码以及构成病毒例程的 LaTeX 宏。
不要从陌生人那里拿走 LaTeX 文件,
作者:Steven Checkoway、Hovav Shacham 和 Eric Rescorla
URL:https://www.usenix.org/system/files/login/articles/73506-checkoway.pdf
网址:https://hovav.net/ucsd/dist/tex-login.pdf
摘要引述:
TeX、LaTeX 和 BibTeX 文件是计算机科学专业人士常用的协作方法。用户普遍认为 LaTeX 文件是安全的;也就是说,在任意计算机上运行 LaTeX 不会造成重大危害。不幸的是,事实并非如此:在本文中,我们将介绍如何利用 LaTeX 构建病毒,该病毒在 Windows XP 上的 MiKTeX 发行版的文档之间传播,以及如何使用恶意文档从基于 Web 的 LaTeX 预览器服务中窃取数据。
纯文本数据格式安全吗?或者,使用这个 LaTeX 类文件来攻破你的计算机
(作者 Steven Checkoway、Hovav Shacham 和 Eric Rescorla)
URL:https://hovav.net/ucsd/dist/texhack.pdf
摘要引述:
我们表明,恶意的 TeX、BIBTeX 和 METAPOST 文件可以通过 TeX 的图灵完备宏语言所公开的文件 I/O 功能导致任意代码执行、病毒感染、拒绝服务和数据泄露。这令人怀疑传统观点,即不访问网络的纯文本数据格式很可能是安全的。我们构建了一个在 Windows XP 上的 MiKTeX 发行版上的文档之间传播的 TeX 病毒;我们演示了对基于 Web 的 LaTeX 预览器服务的数据泄露攻击。
Sebastian Neef 撰写的《Hacking with LaTeX》
网址:https://0day.work/hacking-with-latex/
作者详细阐述了 (La)TeX 通过\input
/ \read
/\write
以及 来创建/写入和读取文本文件的能力\write18
。 \input
/ \read
/\write
可用于读取/复制/覆盖敏感文件。\write18
可通过执行程序来造成危害。
管理员生成的 LaTeX 恶意 PDF
URL:http://blog.9bplus.com/latex-malicious-pdf-generation/
作者概述了 LaTeX 用于创建 pdf 文件,并且存在类似软件包的 LaTeX 软件包movie15
,可用于将.swf
-files(Shockwave Flash 文件)集成到 .pdf 文件中。.swf
-files 反过来可能是恶意的。
(我 Ulrich Diez 的评论:“危险”在于,与许多其他 pdf 创建工具一样,LaTeX 可用于将对象/项目集成到 .pdf 文件中。集成的对象/项目反过来不一定需要通过 LaTeX 创建,并且可能是恶意的。)
概要:
在这些详细说明的许多事情中,危险既不是来自使用 LaTeX 本身,也与生成具有内在恶性的 LaTeX 代码无关,而是来自将 LaTeX / LaTeX 代码应用于不可信/已被破坏的资源(.swf 文件、由 pdf 查看器执行的脚本等)。
有人可能会滥用 (La)TeX 的写入外部文件功能,从而一遍又一遍地生成大量垃圾文件,直到 SD 卡/SSD 因多次写入而损坏。
除此之外,您还可以使用 (La)TeX 以神秘的方式书写内容。
在书写时我的答案针对这个问题“用于大规模超引用的宏?”我借此机会展示了其中的一些。
我留下来判断这对其他人是否危险。
无论如何,你可以用神秘的方式(人们不会立即看到代码的作用)编写指令来创建垃圾文件或执行 -calls \write18
。
\outer
是产生意外结果的良好候选者。
在将命令添加到钩子之后再执行该命令\outer
,可能会在附加到该钩子时造成麻烦:
最小示例
\documentclass{article}
\AtEndDocument{\one}
\outer
\def\one{one}
\AtEndDocument{\two}
\def\two{two}
\begin{document}
\end{document}
交付
Runaway text?
! Forbidden control sequence found while scanning text of \toks@.
<inserted text>
}
l.6 \AtEndDocument{\two}
\outer
-tokens 里面\if..\else..\fi
也会触发错误消息:
最小示例
\documentclass{article}
\outer\def\macro{}
\begin{document}
\iffalse\macro\fi
\end{document}
交付
! Incomplete \iffalse; all text was ignored after line 6.
<inserted text>
\fi
l.6 \iffalse\macro
\fi
?
顺便一提:
所有这些都不能回答是否存在(单一)命令在 LaTeX 中这是很危险的。
所以我不明白为什么我的这个答案得到这么多的“赞”,尽管它并没有真正回答这个问题。;->
(但是使用 LaTeX 的宏功能,您可以创建可用作单个命令的宏,从而触发大量代码/大量指令/说明的执行,这些代码/指令/说明的效果可能被视为危险。)
答案3
我认为最危险的命令是\globaldefs1
。不要尝试!;-)
\documentclass{article}
%\globaldefs1
\begin{document}
\section{Test}
\end{document}
它从根本上改变了 LaTeX 中定义的工作方式。默认情况下,定义是全局的。也就是说,它破坏了 LaTeX 的工作方式:组不再有效。结果,一切都变得疯狂。当然,如果你真的知道无论你正在做什么,你都可以使用它。讽刺的是,你可能只能在本地使用它。
当然,每只猫都知道,\catcode
它也可以用来造成最大的伤害。它可以以偷偷摸摸的方式使用,必须这就是为什么它被称为猫代码
答案4
filecontents
使用选项overwrite
。我在 tex 文件中看到以下内容:
\begin{filecontents*}[overwrite]{filename.tex}
...
\end{filecontents*}
同一目录中有一个同名文件filename.tex
。如果我没有在环境中更改文件的名称,我就会丢失原始文件filecontents
。