论文链接:arxiv.org/abs/2608.25880 发表时间:2026年8月 机构:Tulane University + 武汉大学(Side Liu、Jiangpeng Liu、Jinwen Xin、Guojun Peng、Jiang Ming)——纯高校合作,Tulane 侧主导安全测量框架,武大侧参与数据与构造 领域标签:cs.SE / 文档安全 / LLM 供应链安全
一、论文背景
1.1 Office 文档正在成为 LLM 的「眼睛」
Word、Excel、PowerPoint 文件(.docx/.xlsx/.pptx)无处不在,且日益成为 LLM 应用的输入:RAG 系统把它们载入知识库,金融 Agent 用表格和报告支撑分析与决策。这些工作流依赖一个用户看不见的「摄取层」——后端解析器/转换器/加载器把 OOXML 文件变成模型可读的文本。
1.2 隐含假设:语义完整性
所有人都默认:模型收到的内容 = 用户在 Microsoft Office 编辑画布里审阅的内容。分析师在 Excel 里核对过数字、律师在 Word 里审过条款,然后放心地让 LLM 基于同一份文件做问答或摘要。当这个假设失效时,不透明的摄取层就变成文档供应链漏洞。
1.3 OOXML 的结构性特点:一个对象,多种语义角色表示
OOXML(Office Open XML)是 ZIP 包裹的类型化 XML 部件集合。关键在于:同一个对象可以携带多种语义角色的表示。最简单的例子:一个 Excel 单元格里,公式 <f> 与缓存结果 <v> 并存——Excel 打开时重算公式显示良性值 57,299;而一个没有公式引擎的抽取器直接读取攻击者植入的缓存 <v> = 92,874。两种读法都合法、都不算隐藏内容、文件都能正常打开无需修复——但两个消费者看到的是不同的任务证据。
论文把这种现象命名为 plural ground truth(复数真值):Office 视图与抽取视图各自被其消费者视为权威,而摄取契约几乎从不声明哪个视图、哪些语义角色成为模型证据,也不保留证据的派生方式。诱导这种分歧的规范内构造被称为 evidence fork(证据分叉)。
二、论文定位和关联工作
2.1 研究谱系一:文档攻击与 LLM
| 工作 | 载体与方法 | 与本文区别 |
|---|---|---|
| PDF 渲染/抽取分歧研究 [7] | 内容遮蔽让在线服务依据读者看不见的证据行动 | PDF 表面 vs OOXML 的结构性多角色表面 |
| PDF-to-LLM 攻击 [8-10] | 幻影 token、字形重映射、阅读顺序、布局操纵 | 本文对象是 OOXML 的规范内构造,无需任何畸形内容 |
| Castagnaro et al. [17] | 六种 DOCX 隐藏技术 vs 加载器/RAG | 预定义操纵集起点,仅 DOCX |
| Sîli et al. [18] | 四种 DOCX 注入技术在 LLM 评分中的效果 | 同上,单格式预定义 |
| Tomazini et al. [19] | 单一白字体 Word 载体改变 web-LLM 评审 | 单一载体 |
| 提示注入研究 [34-36] | 文档/结构化输入中的攻击者指令重定向模型行为 | 本文不是指令注入,是事实证据替换 |
方法论分水岭:前人从「预定义的文档操纵」出发测效果;本文从 OOXML 规范本身出发系统遍历,发现全部可能的视图构造分叉——从「我试试藏点东西」变成「规范允许哪些合法的双义构造」。
2.2 研究谱系二:Office 文档安全
Müller et al. [13] 系统化阅读 OOXML/ODF 规范编目「设计即危险」特性与内容遮蔽;签名/渲染缺口 [14]、ZIP 解析器差异 [15]、包结构与修订数据中的隐藏内容 [16]、宏语义 [33]。这些面向 Office 应用、宿主、签名或取证恢复;本文面向 LLM 收到的证据——测试件规范有效、打开无修复、无宏无畸形容器。
定位结论:首个规范驱动、跨 Word/Excel/PowerPoint 三格式的 OOXML→LLM 证据分歧系统测量,前序工作只覆盖 DOCX 的预定义隐藏技巧。
三、问题定义
3.1 从具体场景出发
具体场景:金融分析师在 Excel 里审阅一份财报摘录(显示营收 57,299),上传给 LLM 做分析。攻击者在文件里植入了缓存陷阱值 92,874——Excel 不显示它,抽取器却把它喂给模型。模型基于假数字输出分析,分析师以为模型看的是自己审过的那份文件。
3.2 核心洞察:攻击面藏在「视图构造决策」里
论文的抽象:同一存储包不变,但 Office 与摄取路径把不同内容「提升」为任务证据。分叉不发生在存储层(文件没被篡改到非法),而发生在视图构造层——哪个表示被选为值、哪些状态算活跃、哪些部件算正文。这不是漏洞利用,是规范合法设计(多表示并存)与摄取契约缺失(未声明选哪个)之间的系统性缝隙。
3.3 威胁模型(形式化边界)
- 攻击者:提供文档,控制其 OOXML 内容与包结构;不控制抽取器、模型或 prompt;
- 约束:文件必须规范有效、在 Word/Excel/PowerPoint 无修复正常打开、默认编辑画布显示良性内容且不显示陷阱;排除畸形容器、宏、可执行载荷;
- 成功条件:LLM 返回攻击者选择的、任务相关的内容——该内容在 Office 审阅视图中不存在(替换被查询的事实,或添加虚构披露)。
3.4 抽象的精妙之处
把「文档攻击」重新定义为「视图构造的策略分歧」:Office 是人面向的 oracle,抽取器是机器面向的视图构造器,两者的选择函数不同就是攻击面。这个定义天然导出六维分类法(见下节),并且把防御问题从「检测隐藏内容」改写为「声明与审计视图构造策略」。
四、问题解法
论文的工作流是「规范 → 知识库 → 挖掘 → 实例化 → 双行为门 → 目录」六步。
4.1 第一步:把规范变成可查询知识库
OOXML 规范有两种形态:散文参考(ECMA-376 + 微软扩展文档,描述每个元素与解析器规则)与 XSD schema(机器可读语法)。分别索引:解析 schema 得 15,884 条 schema 记录(每个元素/类型的 content model、xs:choice 兄弟、出现次数、默认值、关联散文条款);按条款头切割散文得 5,206 个 prose 段。两者以 source-qualified 的 prose_refs 链接。
4.2 第二步:LLM 遍历挖掘候选
用 Claude Opus 4.8 遍历知识库。库太大且长输入注意力退化,切分为不超过 500K 字符、永不切断条款的 23 个元素锚定块。每块一次 agent 调用,逐元素判断「该构造是否可能让 Office 渲染与文本抽取暴露不同的任务相关内容」,产出候选记录 (element, §section, format, quote, render, extract, strength)——quote 字段保留规范原文句子作审计线索;render/extract 描述两个视图的假设输出(后来的 BENIGN/TRAP 令牌)。合并去重得 639 个规范锚定候选记录。
4.3 第三步:实例化为最小测试件
类比:候选记录只是「地图上的可疑点」,要派侦察兵(builder 程序)实地验证。为保持可审计,LLM 不直接生成包字节而是生成短构建器程序(python-docx/openpyxl/python-pptx 能暴露就用库,不能暴露的就地编辑部件 XML——如 webHidden run、页外 framePr、mc:AlternateContent 分支)。每个构建器产出只行使单一构造的最小 Office 文件,在 Office 视图放 BENIGN 令牌、在替代表示里放 TRAP 令牌。三次构建预算内 542 个产出可运行测试件。
4.4 第四、五步:双行为门确认
| 门 | 判据 | 通过率 |
|---|---|---|
| Gate 1 Office oracle | 脚本打开文件截图,多模态 LLM 判定:BENIGN 可见且 TRAP 不可见 | 639→412 |
| Gate 2 抽取面板 | 13 个工具(openpyxl/python-docx/python-pptx/pandoc/Tika/LibreOffice/markitdown/Unstructured/Docling 等)至少 1 个吐出 TRAP(空白归一化后查令牌) | 412→163 |
4.5 第六步:去重与范围筛选
去掉 104 个重复包级构造;排除纯视觉伪装(白底白字、对象重叠、极小字号——Office 仍渲染内容)、演讲者备注(Office 有专门区域)、可逆编码(陷阱仍可见)。剩 21 个独立机制。
4.6 六维分类目录
| 维度 | 视图构造问题 | 机制数 | 例子 |
|---|---|---|---|
| Representation | 哪个编码表示供应对象的值 | 5 | 公式/陈旧缓存(M4)、数字格式覆写(M1)、条件格式覆写(M3)、数据绑定缓存 run(M5) |
| State | 编码内容在当前应用视图中是否活跃 | 6 | 隐藏 sheet(M6)、深度隐藏 sheet(M7)、筛选隐藏行(M8)、折叠大纲行(M9)、隐藏列(M10) |
| Visibility | 已实现对象是否出现在渲染视图 | 3 | 消失 run(M12)、隐藏形状(M13)、页外文本框(M14) |
| Compatibility | 标记兼容分支选择如何应用 | 2 | 未满足 MC Choice(M15)、未选 MC Fallback(M16) |
| Scope | 哪些非正文字段算文档证据 | 3 | 图形 alt text(M17)、表格描述(M18)、超链接显示/目标(M19) |
| Linearization | 结构化内容如何展平为文本 | 2 | 合并单元格覆盖值(M20)、注音指南(M21) |
按格式:Excel 12 个、Word 8 个、PowerPoint 1 个。Representation 类特别重要:M1/M3/M4/M5 把共存的值或角色放在同一对象上,不依赖任何隐藏或画布外内容——只搜「隐藏内容」的防御会完全漏掉这部分攻击面。
4.7 真实测试集
从 TAT-QA 金融报告语料(表格+文本混合摘录)渲染 210 个真实 Office 文档(每机制 10 个),Office 显示真值、抽取器吐出陷阱。两个任务族:问答族(替换单个被查询事实——显示真数字、存储假数字)与摘要族(植入虚构披露——文件从未声明的负债/拨备/关联交易)。全部 210 个文件通过作者人工核验(默认编辑视图正常渲染、植入内容不显示)与 OpenXmlValidator(无包/schema/语义/MC 错误)。
五、评估指标与实验证据
5.1 五个研究问题与指标体系
| RQ | 问题 | 核心指标 |
|---|---|---|
| RQ1 | 哪些抽取器暴露陷阱视图 | 机制×工具触达矩阵 |
| RQ2 | LLM 服务是否把该视图传播进输出 | 陷阱断言率(TRAP 占比) |
| RQ3 | 模型还是摄取路径决定暴露 | 同厂双入口/同路径多模型对照 |
| RQ4 | 受影响路径在开源项目中的普及度 | 默认摄取路径的叶子抽取器映射 |
| RQ5 | 普通文件中这些构造的基础率 | 签名命中率 |
标签协议:Claude Opus 4.8 与 GPT-5.5 独立标注全部 8,400 个 API 响应(二值:TRAP=断言植入内容为文档事实 / NON-TRAP),100% 原始一致;每机制-API 组合抽 5 个共 420 个人工审计,与两个自动判定全一致;1,470 个网页响应由两位作者手工标注(历时约两周)。
5.2 RQ1:抽取器触达率双峰分布
13 工具的触达矩阵呈现锐利双峰:7 个机制 11-33%、14 个机制 67-100%,中间没有任何机制。分界线是陷阱的载体位置:
- 陷阱在主体内容内(普通内容文本,任何文档遍历都会到达)→ 高带(如 M1-M4、M10 全部 8/8);
- 陷阱在属性/关系/分支/表头/注音(主体外)→ 低带(如 M18 表格描述仅 1/9、M15/M17/M19 各 2/9)。
格式不对称:电子表格几乎全部机制在单元格网格里(可见与隐藏单元同流),三个原生表格工具共同读 7 个机制;Word 的机制散布在属性、分支、嵌套故事中,四个原生 Word 抽取器只共享一个机制(消失 run M12)——换 Word 加载器会实质性改变暴露面,换表格加载器几乎不会。
类与触达联动:按类均触达排序(Representation 0.93 > Visibility 0.83 > State 0.75 > Linearization 0.50 > Compatibility 0.28 > Scope 0.19)与「陷阱在主体内容内的比例」排序完全一致——分类学预测抽取层行为。
覆盖越广暴露越大:markitdown 暴露 17/21、Tika 16/21——它们的扁平化输出捞出更多 OOXML 通道却不保留 Office 指派的角色。为覆盖升级加载器的管线会静默扩大攻击面。
5.3 RQ2:传播进 LLM 输出
4 个原生摄取 API(GPT-5.5 / Kimi K2.6 / Qwen-doc-turbo / GLM 5.2)× 210 文档 × 10 次 = 8,400 试验 + 7 个网页聊天机器人 × 210 = 1,470 试验:
- API 陷阱断言率 48-76%(GPT-5.5 0.53、Kimi 0.76、Qwen 0.63、GLM 0.48);网页端 0.52-0.76;
- 20/21 机制至少被一个接口返回(唯一例外 M11 工作表表头——离线工具读但无在线服务暴露);
- 对照实验封住两端:210 个匹配干净孪生文档 0/840 泄漏(陷阱不存在就不会被凭空产出);可见阳性对照 24/24 全返回(目标在可见内容中时四个 API 都能读到)——主实验条件被干净夹逼;
- 稳定性:840 个文档-API 对中 826 个(98.3%)十次试验判定一致;147 个网页机制-接口单元 100% 跨实例一致——持续性指向管线而非生成噪声。
5.4 RQ3:暴露由摄取路径而非模型决定
三组对照:
- 同厂双入口:GLM 网页与 API 都标 GLM 5.2,但网页多暴露 5 个机制(M5/M12/M13/M20/M21)——模型标签固定,差异定位于入口路径。Kimi 两端一致(16 机制,共享或行为等价的摄取路径);
- 同路径跨版本:固定 OpenAI 文件输入路径,gpt-5.4 与 gpt-5.5 各跑 2,100 次判定——零机制翻转;Claude 三个模型(Haiku 4.5/Sonnet 5/Opus 4.8)走同一文档 skill(openpyxl/pandoc/markitdown),暴露集合逐机制完全相同(16/21)——共享路径下模型选择不改变暴露集;
- 版本与调用参数改变工具行为:Claude 的 pandoc 读不到页外文本框 M14,而论文锁定的 pandoc 3.10 每次都读——3.8.3 版本在所有样本上缺失;超链接目标 M19 被
pandoc -t plain丢弃但-t markdown吐出;合并单元格值 M20 被 openpyxl 默认加载遮蔽但read_only流式模式暴露。
行为级指纹匹配:每个工具的机制级输出是确定性的,构成稳定行为签名。DOCX 八探针向量把 11 个接口中的 8 个匹配到至少一个已测候选配置(4 个 pandoc 类、Gemini 匹配 docx2txt/textutil、3 个匹配 Tika)——攻击者无需知道服务后端,用固定探针集即可收窄候选并优先攻击已知影响它们的机制。
5.5 RQ4:开源生态的依赖集中
16 个主流开源 agent/RAG 项目(LangChain 142.6K 星、Dify 150.3K、RAGFlow 86.1K 等)的默认 OOXML 摄取路径收敛到少数叶子抽取器家族:AutoGen/GraphRAG/PrivateGPT/Onyx → markitdown(触达 17/21);txtai → Tika(16/21);六家经 pandas 读表格的都落到 openpyxl。项目多样性掩盖了依赖集中。
5.6 RQ5:普通文件的基础率与筛查极限
对 2,000 个 Sheetpedia XLSX + 2,000 个 DocxCorp DOCX + 263 个公开 PPTX 跑静态签名规则:
- 双峰:16 个签名罕见(6 个零观测、10 个 <2%)——可作为选择性分诊信号;5 个常见(工作表表头 2.8%、隐藏列 3.8%、MC fallback 7.2%、带标签超链接 10.4%、图形 alt-text 16.5%)——存在性筛查对它们无效,良性恶意文档使用同样的结构特征;
- 4,263 份文档中 748 份(17.5%)带至少一个签名。
为什么实验设计能证明论点:干净孪生对照排除「模型幻觉」解释;可见阳性对照排除「读不到」解释;双入口/同路径/跨版本三组对照把暴露的决定因素从模型隔离到摄取配置;98.3% 与 100% 的稳定性排除随机性——每一步都封住一个替代解释。
六、效果优势的根源解释
本文的「效果」是测量与归因的说服力。根源解释要回答:为什么合法规范的文件能让机器看到人看不到的陷阱?
机制因果链:
- 规范允许多语义角色共存:OOXML 为同一对象定义多种表示(公式 vs 缓存值、显示值 vs 存储值、MC 分支、隐藏状态)——这是规范的设计自由度,不是漏洞;
- Office 与抽取器的「视图构造函数」不同:Office 通过重算/渲染/状态过滤/分支选择解析出人类视图;抽取器是优先速度/可移植性/文本覆盖的部分解析器,线性化原始存储。两者对「哪个表示成为证据」做出不同决策——分叉由此产生;
- 摄取契约缺失放大分叉:契约不声明用重算值/缓存值/存储值/显示值中的哪个,也不保留派生痕迹——分歧无法被下游发现;
- 暴露率由抽取器遍历行为决定:陷阱在主体内容内 → 几乎所有遍历都会触达(高带 67-100%);在属性/关系/分支 → 工具特异(低带 11-33%)。传播层忠实继承上游选择:抽取器读到的,模型 48-76% 当作事实断言;抽取器读不到的,模型无从知晓。
为什么「更强的模型」救不了:模型只对送进上下文的文本负责——三个 Claude 模型走同一 skill,暴露集逐机制相同;gpt-5.4→5.5 同路径零翻转。瓶颈在模型之前的文件处理,这是架构性结论而非经验观察。
为什么常见签名不可筛查:隐藏列、alt-text、超链接在良性文档中承担正常功能(查找表、无障碍、引用),存在性与恶意性在此解耦——区分需要内容与角色,而非结构存在。
反事实验证:去掉分叉构造的干净孪生 0/840 泄漏——陷阱内容本身不产生暴露,是「视图构造分歧」让它独占地到达模型。
如实说明:机制均衡的评价集不代表真实攻击流行率;工具/服务结果是锁定版本的快照;行为匹配是存在性证明而非指纹基准。
七、必要知识反推
7.1 领域知识层
- OOXML 包结构与部件语义(OPC 容器、关系、document.xml 主故事、样式/设置/兼容性部件):不知道「一个对象多种表示」的规范基础,就找不到攻击面的源头;
- Office 应用的视图构造行为(重算、数字格式、状态过滤、MC 分支选择):Office oracle 的判定依据;
- 抽取工具生态(13 个工具的解析范围与取舍):RQ1 矩阵与行为签名的前提。
7.2 方法论知识层
- 规范驱动挖掘方法论:schema 记录 + prose 段双索引、元素锚定分块遍历、候选记录 schema(含审计线索 quote)——从「试错式找漏洞」升级为「系统遍历规范」;
- 双行为门的确认设计:oracle 门定人视图、面板门定机器视图,两者都过才算分叉——单一视角无法定义「分歧」;
- 对照实验设计:干净孪生(排除幻觉)+ 可见阳性(排除读不到)+ 双入口/同路径/跨版本(隔离摄取配置)——归因的骨架;
- 供应链分析视角:把文档摄取视为供应链、把加载器选择视为安全策略——安全研究与软件工程的交叉思维。
7.3 工程知识层
- builder 程序而非包字节:让每次包编辑显式可复现,区分构建失败与机制失败;
- 令牌化测试:BENIGN/TRAP 唯一令牌 + 空白归一化匹配——把「语义分歧」降维成「字符串存在性判定」,多模态 LLM 判截图也只是查两个串;
- 双判定器 + 人审的标签管线:100% 一致 + 420 样本全对齐;
- 静态签名规则:每机制一条规则、全部在构造实例上命中后才用于基础率测量。
7.4 知识融合的关键节点
- 节点一:规范遍历 × 行为确认——LLM 挖掘产生「可疑构造假设」,双行为门提供「经验证实」;两者缺一——前者是纸上谈兵,后者是无的放矢。639→21 的漏斗正是假设-检验循环的工程化。
- 节点二:「plural ground truth」的概念构造——把安全失效重新表述为视图构造策略分歧,需要同时理解文档格式规范(表示共存是合法的)与 LLM 管线(摄取契约是缺失的)——单一领域的视角都造不出这个概念。
- 节点三:行为签名的逆向利用——意识到确定性输出构成可匹配的指纹,把测量工具翻转成攻击者的侦察工具(收窄闭源服务的候选配置)——测量与威胁的双面性洞察。
八、论文中可以提取的通用性灵感
灵感一:「同一输入、多个权威视图」是普遍的供应链攻击面
核心思想:只要系统存在两个消费者(人审视图 + 机器摄取视图)且各自视自己的视图为权威,输入格式的合法多义性就会变成攻击面——防御必须显式声明「哪个视图是证据」。 论文证据:21 个 evidence fork 全部来自规范合法构造;干净孪生 0/840 泄漏证明分叉构造是暴露的必要条件。 推广场景:(1) PDF/HTML 的渲染 vs 解析分歧;(2) 数据库视图 vs 底表的权限差异;(3) API 的文档注释 vs 实现行为;(4) 设计稿的可见图层 vs 导出数据——凡「人看 A、机器读 B」的管线都适用。
灵感二:覆盖与保真是对立目标——升级加载器是安全决策
核心思想:提高文本覆盖率的抽取器会把更多语义角色(非正文通道、属性、分支)扁平化进证据——覆盖升级应被视为安全策略变更而非无害的工程改进。 论文证据:markitdown/Tika 覆盖最广(17/16 个机制)但角色保真最差;窄加载器「看起来更安全」只是因为省略了文档语义。 推广场景:(1) RAG 系统的解析器选型评审;(2) 数据管道的字段全量摄取 vs 按需摄取;(3) 日志系统的 verbose 级别与信息泄漏;(4) API 响应的序列化白名单。
灵感三:确定性输出构成行为指纹,可正向审计也可逆向侦察
核心思想:系统对固定探针集的确定性响应构成稳定签名——既能做回归测试检测管线漂移,也能被攻击者用于收窄闭源系统的内部配置。 论文证据:8/11 接口匹配到已测候选配置;同一服务的暴露向量在 API 重复(98.3%)与跨实例(100%)下稳定。 推广场景:(1) CI 中的「语义行为回归测试」;(2) 爬虫检测中的网站指纹;(3) 模型服务的推理后端探测;(4) 供应链中第三方组件版本的盲识别。
灵感四:存在性筛查在「良性基础率高」的通道上失效,需要内容与角色
核心思想:结构特征的安全性取决于其良性使用频率——罕见构造可分诊、常见构造必须结合内容语义与来源角色才能判别;防御设计要先测基础率再定策略。 论文证据:16 个签名 <2% 可作分诊信号;5 个常见签名(alt-text 16.5%、超链接 10.4%)存在性完全不可行动。 推广场景:(1) 反病毒的特征码 vs 行为检测分层;(2) 代码审计的 suspicious API 列表策略;(3) 金融风控的规则分层(稀有模式报警、常见模式建模);(4) 内容审核的先验频率校准。
灵感五:从规范出发的系统性挖掘优于从直觉出发的枚举
核心思想:把标准文档本身变成可查询知识库并用 LLM 遍历,能发现预定义操纵清单永远覆盖不到的构造类别——规范是攻击面的完备地图。 论文证据:前人预定义研究只找到 DOCX 的零散技巧;规范驱动遍历产出 639 候选、确认 21 机制并给出预测行为的六维分类。 推广场景:(1) 其他文件格式(ODF、EPUB、SVG)的安全审计;(2) 协议规范(OAuth、MIME)的歧义性挖掘;(3) API 规范的未定义行为枚举;(4) 法律合同条款的漏洞系统排查。
一句话总结:你在 Excel 里看到的数字和 LLM 读到的数字可以合法地不一样——21 种规范内的「证据分叉」让 4 个 API 中招近半到七成,而决定中不中招的不是模型聪不聪明,是文件在你看见之前被谁、用哪个版本、什么参数拆开。