对 Texlive 的受限权限模型有哪些分析?

对 Texlive 的受限权限模型有哪些分析?

TH. 写道,如何在 BibTeX 中使用 \write18

背景
现在 TeX Live 2010 已经受到限制\write18,我认为更新我的简历是合理的,它使用该bibunits包对每个文件运行 BibTeX .aux

我知道过去曾讨论过使用有限优先级来沙盒化 Tex 执行,但我没有看到任何内容表明这样做的困难已经解决。是否有类似报告的内容,最好是类似安全审计的内容,提供威胁模型并讨论 Texlive 处理该威胁的能力?

后记

需要明确的是,这个问题是为了了解使用 Texlive 2010 会给用户带来什么风险。

我最担心的是——但问题不仅限于此——风险理解问题:很容易理解,使用 '\write18' 访问完全权限用户 shell,您将让您的 Tex 手稿对您的机器执行任何您可以执行的操作(希望是,没有管理员权限)。使用受限 shell,风险更加微妙:受限 shell 只能运行允许的可执行文件,这听起来很安全,但巧妙构造的 Tex 样式文件可能会利用“安全”可执行文件的错误,因此您的机器加入Storm 僵尸网络安全审查的价值在于它使风险清晰化,任何类似的事情都是好事。

答案1

我首先开始评论 Will 和 Joseph 的评论和答案,但我的回复可能太长了。因此,首先,关于 TL2009 中限制 \write18 的撤销,如果我没记错的话,主要有三个原因:

  1. Windows 上存在特定问题,主要与 Windows 首先从当前目录中选择二进制文件有关(即使.不在变量中PATH)。结合 TeX 在当前目录中写入任意文件的能力,这是一个巨大的威胁。现在采取的方法是 (a) 禁止写入具有“可执行扩展名”的文件:execom等(如果在运行时设置,则从标准环境变量中获取PATHEXT,否则从内置列表中获取);(b) 尽可能使用完整路径调用可执行文件。

  2. 正如您正确指出的那样,该系统的弱程度与最弱的允许可执行文件一样。我们希望允许的可执行文件具备两个条件:(a) 不允许执行任意命令;(b) 遵守 TeX Live 中实现的 TeX 文件 I/O 限制。初始默认列表中的许多可执行文件(最明显的是 bibtex 和 makeindex)都不满足 (b),现在它们满足了。更重要的是,脚本 epstopdf(这是 restricted write18 的主要动机)不满足 (b),并且在某些时候容易受到 shell 注入(因此可以执行任意命令)。现在我们相信 epstopdf 在这方面是强大的(更准确地说,其新创建的受限版本 repstopdf 是)。

  3. 最近在 Unix 上发现了一个实现错误(顺便说一句,更像是打字错误而不是设计问题),它允许直接从 TeX 进行 shell 注入。虽然我们可以立即修复它(因此进一步推迟发布以进行重建),但此时我们真的觉得该功能尚未准备好在黄金时段推出,需要更轻松的思考(而不是急于发布)和仔细的校对。

总而言之,目前的做法并不新颖,基本上与 2009 年的计划相同,只是修复了许多“细节”,但魔鬼就在细节中。除了“历史”意义之外,我希望这个解释能说明考虑了哪些问题。

现在,安全性不仅与执行命令有关,还与文件 I/O 有关。Joseph 引用的“texhack”论文仅涉及写入或读取文件,这并不是什么新鲜事(但与受限制的 \write18 也并非完全无关,请参阅上面的第 1 点和第 2b 点)。基本上,在某些情况下(tex 作为 Web 服务),文件读取可能会导致信息泄露,而文件写入可能会导致数据丢失或任意命令执行。正如论文中指出的那样,TeX Live 提供了一些保护。默认情况下,只有文件输出被限制在当前目录或 TEXMFOUTPUT(如果设置的话)(并且在 Unix 上写入点文件和在 Windows 上写入具有“可执行扩展名”的文件是被禁止的),但文件输入可以很容易地以同样的方式受到限制。值得注意的是,这种保护是有效的仅有的如果您在“安全”目录(每个文档的临时目录)中处理不受信任的文件,而不是在您的主目录中。

关于文档,在 TeX Live 指南中添加了一个部分(第1.4节)。它没有广泛讨论该主题,但至少总结了主要问题以及用户可以采取的预防措施。

答案2

简单回顾一下历史:受限 shell 逃逸自 TeX Live 2009 起就已经存在。出于安全考虑,它被决定默认处于非活动状态。

如果记忆不错的话,在 TeX Live 2009 中该功能被取消“默认开启”之前,人们开始讨论的问题是这样的:http://tug.org/mailman/htdig/tex-live/2009-July/021574.html

以下是一个(相当长的)讨论帖的结尾,最终宣布撤回该功能:http://tug.org/mailman/htdig/tex-live/2009-October/023430.html关于此前做出的具体决定,目前披露的细节还很少。

但我大多数时候并不关注 TeX Live 邮件列表,所以我不确定是否或者何时在那里讨论了 TeX Live 2010 的新改进实现(默认激活)。

答案3

我知道这不是问题的答案,但也许可以帮助您解决问题。PerlTeX允许您将 Perl 代码嵌入为 LaTeX 函数。如果在编译时使用,perltex --nosafe myfile.tex则 perl 进程可以自由调用系统函数。我不确定这是否能解决您的问题(因为操作顺序,但如果 \write18 在编译时可以工作,那么这应该可以),但这是一种完全访问系统的方法,以及在源代码中使用内联 Perl 代码的其他好处。

相关内容