三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

PDF 脱敏技术【1】:PDF 脱敏不是盖黑框:为什么敏感信息仍能被复制,正确的保护方式是什么?

PDF 脱敏技术【1】:PDF 脱敏不是盖黑框:为什么敏感信息仍能被复制,正确的保护方式是什么?

先说结论:在 PDF 上画一个黑色矩形,只能证明肉眼暂时看不见,不能证明敏感信息已经从文件中删除。

更严格地说,PDF 脱敏的验收对象不是编辑软件里的黑框,也不是一张页面截图,而是最终准备交付的发布文件。接收者可能搜索、复制、另存、打印,也可能直接解析 PDF 的文本、图像、表单、附件和元数据。只要原值仍能从发布副本中取得,视觉效果再整齐也不能算真正完成了脱敏。

我先用一组合成文件复现最常见的黑框失败,再增加一组增量保存实验,随后回顾三起公开事件,最后讨论字形位置侧信道。三条风险线分别是:当前对象仍可直接读取旧修订仍保留原始字节,以及原文字已删除后仍可能存在的版面线索

一个 30 秒就能复现的实验

我准备了两份只含合成数据的 PDF。第一份是原始员工信息,第二份在姓名、手机号、身份证号和薪资上方画了黑框。

原始PDF文件:

在姓名、手机号、身份证号和薪资上方画了黑框的PDF文件

第二份看起来已经“脱敏”。但用独立 PDF 解析器提取文本,仍然得到:

Employee Name Zhang San Mobile 13812345678 National ID 350102199001011234 Monthly Salary CNY 35,000

原因并不复杂:黑框是后来添加的绘图指令,原文本对象没有被改动。PDF 阅读器先绘制文字,再绘制位于上方的矩形;人的眼睛只看到最上层,搜索、复制和文本提取工具却可以访问底层对象。

你甚至不需要专业取证软件。以下任一动作都可能暴露问题:

  1. 搜索已知的姓名、号码或关键词;
  2. 框选黑框区域,复制后粘贴到记事本;
  3. 用另一个阅读器打开、另存或导出;
  4. 使用pdftotext、PDF SDK 或其他解析器提取文本。

因此,“截图看起来没问题”只能作为第一层视觉检查,不能作为发布结论。

这不是理论风险:三起公开的假脱敏事件

类似错误并不只发生在测试文件里。法院文件、国会调查材料和商业诉讼资料都出现过“黑框仍在、原文也仍在”的情况。

2011:Apple vs. Samsung,黑框后面是商业信息

2011 年,Apple 与 Samsung 专利诉讼中的一份法院意见包含多处看似已经遮挡的内容。美国律师协会后来总结称,把被遮挡区域复制并粘贴到文本文件后,隐藏内容就会重新出现。

暴露的信息包括 Apple 关于消费者是否可能转向 Samsung Android 设备的研究,以及与 Nokia、IBM 等公司的部分许可交易细节。法院发现问题后封存了原版本,并在数小时内发布了新的版本。

这个案例说明,假脱敏不只会泄露姓名和证件号码,也可能泄露商业策略、授权安排等机密信息。来源:American Bar Association,Embarrassing Redaction Failures。

2016:Benghazi 调查文件,视觉标记可以被绕过

2016 年,美国众议院 Benghazi 委员会民主党成员发布了一份 Sidney Blumenthal 访谈记录,其中一些页面带有大面积黑色脱敏标记。

《Los Angeles Times》当时报道,使用普通的剪切、复制和粘贴操作即可绕过这些标记,看到原本试图隐藏的访谈内容,其中包括 Blumenthal 与相关组织的工作和报酬信息。

值得注意的是,这次事故不需要复杂攻击。接收者只需不按照发布者预想的方式“老老实实阅读”,视觉遮挡就失去了作用。来源:Los Angeles Times,2016-06-27。

2019:Manafort 文件,错误脱敏影响重大案件

2019 年,Paul Manafort 的律师向法院提交了一份带有黑色遮挡区域的 PDF。文件表面上隐藏了部分案情,但媒体和公众通过复制、粘贴等方式看到了底层文字。

被意外公开的信息涉及 Manafort 与 Konstantin Kilimnik 的接触、2016 年竞选民调数据以及乌克兰和平计划等内容。相关文件随后被撤下,并替换为正确处理的版本。

这个事件受到高度关注,不只是因为技术错误本身,还因为一次看似简单的文档处理失误改变了重大案件信息的公开范围。来源同样可参见美国律师协会的案例总结。


这三起事件的共同机制是:发布者改变了页面外观,却没有可靠地删除接收者不应获得的信息。

第二个实验:当前文本已经删除,旧修订仍然在

黑框实验很直观,但它还不是最隐蔽的失败。PDF 支持增量更新:保存程序可以不重写文件前半部分,只把本次修改的新对象、交叉引用信息和 trailer 追加到文件末尾。阅读器默认显示最新修订,因此当前页面和普通文本提取可能都已经看不到原值;但旧修订的对象字节仍留在同一文件中。

我用同一组合成值制作了两份对照文件。第一份把当前页面替换为四条黑色占位条,然后以增量方式保存;第二份从当前有效对象图重新生成一个非增量的全量重写副本。这个实验只用于说明 PDF 文件结构和发布准入检查,不是对 Foxit PDF SDK 的产品测试。

对增量样本做普通验收时,当前页面看不到原值,独立解析器提取当前修订文本也是 0 命中;但结构扫描发现 2 个%%EOF、2 个startxref和 1 个/Prev指针。沿第一处%%EOF提取前一修订后,四类合成敏感值均可恢复。全量重写样本则只有 1 个%%EOF、1 个startxref、没有/Prev,当前解析与已知历史对象扫描均未发现这些值。


这里要把三个条件分开:

  1. Apply()成功,说明当前有效对象已经按 redaction 规则处理;
  2. 输出路径与输入路径不同,说明没有覆盖原件;
  3. 非增量全量重写,才用于移除发布副本中的旧修订和未引用对象。

前两个条件不能推导出第三个。“Save As”只是接口或菜单名称,不能单独证明旧修订已清除;具体保存标志和最终文件结构才是证据。

三类失败:当前对象、历史修订与版面侧信道

讨论 PDF 假脱敏时,需要把三类不同机制分开,否则容易用一种检查覆盖所有风险。

第一类是non-excising redaction(非删除式脱敏):原文字仍是当前有效内容,只是被黑框、白框或其他图形覆盖。这类问题可以通过搜索、复制或文本提取直接发现,前三个公开事件和本文第一个合成实验都属于这一类。

第二类是历史修订残留:当前修订已经不再引用原对象,但增量保存没有重写旧字节。普通阅读器使用最新版,看起来没有异常;修订恢复或未引用对象扫描却可能直接找回旧内容。

第三类是excising redaction 之后的版面侧信道:原文字和旧修订都已清理,但其他排版数据仍可能保留与原值有关的线索。攻击者不是直接读回原文,而是利用候选集合、上下文和版面特征缩小可能答案。

三者的利用条件和验证方法不同:第一类查当前内容,第二类查修订链和旧对象,第三类做特定工作流下的对抗性分析。

为什么“删除对象”后,原文还可能留在 PDF 里?

传统 PDF 文件可粗略看成body → xref → trailer → startxref → %%EOF。增量保存不会改写前面的 body,而是在文件尾部再追加一组 body、xref、trailer 和新的%%EOF。新 trailer 的/Prev指向上一份交叉引用信息,阅读器据此合并各修订并展示最新状态。

因此,在新 xref 中把某个对象标记为删除或改为引用新对象,只会改变“当前版本应该使用什么”;它不会擦除旧对象已经占用的字节。Adobe PDF Reference 对此明确说明:增量更新保持原始内容不变,被删除对象也只是由新交叉引用项标记为 free。NDSS 2021 的研究进一步展示了第三方如何利用 PDF 修订结构恢复先前内容。这也是为什么发布准入检查要覆盖/Prev、多组startxref/%%EOF和疑似未引用对象,而不能只运行一次当前文本提取。

需要说明的是,简单计数属于保守的结构指示器,不等于完整取证;对象流、交叉引用流和异常 PDF 还需要更完整的解析。但在安全发布场景中,一旦发现历史修订指示器,默认阻止发布比宣称“当前工具没有恢复到内容,所以通过”更稳妥。技术依据可参见 NDSS 2021 论文。

删除底层文字后,是否就一定安全?

2022 年,伊利诺伊大学研究人员发布了论文预印本;论文随后发表于Proceedings on Privacy Enhancing Technologies 2023(3),题目是Story Beyond the Eye: Glyph Positions Break PDF Text Redaction

研究关注的是字形位置泄露。PDF 不只记录字符本身,还可能记录字符的宽度、位置和微小水平偏移。某些文档生成流程会把与被删除文字有关的排版误差“传递”到相邻的未删除字符。攻击者可以把候选姓名逐个代入模型,比较哪个候选产生的字形位置指纹与发布文件最接近。

论文评估了 11 种常见 PDF 脱敏工具:其中两种没有真正删除文字,容易受到复制粘贴攻击;其余被测试流程虽然移除了目标文字,但仍保留了可用于字形位移攻击的定位信息。研究者还在 OIG 报告、FOIA 响应和法院文档等公开语料中验证了这类风险。

但这里必须把边界说清楚:

  • 这不是“所有被删除文字都能恢复”的万能攻击;
  • 攻击效果与 PDF 的生成软件、工作流、字体和排版方式有关;
  • 一到两个词的短脱敏区域,尤其是姓名,更值得关注;
  • 攻击者通常需要一个合理的候选词典和上下文;
  • 论文中的结论是公开研究结果,不是本文对 Foxit PDF SDK 的本地测试结论。

论文正文与 DOI 可分别在 PoPETs 论文页面和 DOI: 10.56553/popets-2023-0069核对。其 2022 年预印本见 arXiv:2206.02285。

这一研究带来的工程启示不是“永久删除没有意义”。恰恰相反,永久删除仍是最基本的门槛;只是生产系统不能在Apply()返回成功后立即宣布工作结束,还需要继续清理和验证发布副本。

PDF 脱敏可以划分为四个可靠性层级

层级做了什么应如何评价
L1 视觉覆盖在文字上方添加黑框、白框或模糊效果底层内容可能仍在,不能视为脱敏
L2 当前对象删除当前修订不再引用目标文字、图像或路径对象必要但不充分,旧修订可能仍在
L3 全量重写与清理非增量重写,并清理旧修订、未引用对象和隐藏数据可靠性更高,但仍需验证范围
L4 独立与对抗性验证交叉解析、修订链检查、重开并检查已知侧信道形成可审计的发布证据

这里故意没有使用“100% 安全”。更准确的表述是:在指定版本、规则、样本和检查范围内,没有发现列明的敏感信息。

脱敏、遮罩、匿名化、加密和水印不是一回事

NIST 对 redaction 的定义强调的是:出于法律或安全目的,从文档或数据集中移除信息。关键词是“移除”,不是“覆盖”。

方法主要目标能否替代 PDF redaction
黑框/白框遮罩改变页面显示不能,底层对象可能仍在
Redaction永久删除指定内容并保留其余版面是本文讨论的基础处理能力
匿名化降低或消除对自然人的可识别性是更广的数据治理目标,不等于画黑框
加密控制谁可以打开文档不能替代对获授权接收者隐藏部分字段
水印提示权属、状态或追踪来源用于提示和追责,不负责删除内容

《个人信息保护法》第二十八条列举了生物识别、医疗健康、金融账户、行踪轨迹等敏感个人信息,并要求处理此类信息时采取严格保护措施。PDF 脱敏可以成为保护流程中的一项技术控制,但单一工具或一次操作本身不能自动等同于合规。法规原文可在中央网信办网站核对。

真正的 PDF 脱敏至少要做四件事

1. 找到目标内容

文本型 PDF 可以使用精确词典、正则表达式、语义规则或字段坐标;扫描件通常还需要 OCR 和图像检测。自动识别结果必须允许人工复核,因为漏报和误报都可能造成高昂成本。

识别阶段还要考虑拆分文本、跨行字段、旋转页面、表单外观、图片中的文字以及同一敏感值的格式变体。搜索一次返回零结果,并不等于页面中没有敏感信息。

2. 永久删除目标对象

正确的 redaction 工作流通常先标记区域,再执行应用操作,永久删除当前修订中区域下方的文本、图像或路径对象。只保存红色边框、批注或黑色外观仍然不够;但即使当前对象删除成功,也不能立刻把文件送入发布目录。

3. 清理页面之外和处理之后的残留

以非增量方式全量重写新的发布副本,移除旧修订和未引用对象;再检查文档属性、XMP、附件、表单字段、批注、书签、标签树、替代文本、可选内容组以及 JavaScript/文档动作。新输出路径只是原件保护措施,不等于全量重写。

数字签名在这里会带来真实的约束:为了保持原签名覆盖字节不变,后续修改通常采用增量更新;而全量重写会改变原签名覆盖的字节,使原签名不再有效。高风险流程应生成一个全量重写的脱敏派生件,再按组织批准的身份重新签名,或者明确拒绝处理。不能同时承诺“保留原签名有效”和“彻底移除原签名覆盖的敏感字节”。

对字形位置等侧信道,则要结合文档来源和生成工作流决定是否增加专项检测或采用更严格的发布策略。

“把整份 PDF 栅格化”也不是通用答案。它可能损害搜索、可访问性和文档真实性;字形位置论文同样提醒,栅格化可以提高某些场景的攻击难度,但不能被描述为自动消除所有信息泄漏。

4. 使用独立方法验收

生成工具报告成功只是一个信号。发布前至少应重新渲染、搜索已知值、复制处理区域、使用不同解析器提取文本、检查隐藏对象和修订结构,并关闭后重新打开文件。本文验证器在--fail-on-incremental-updates开启时,只要检测到历史修订指示器就阻止发布;当前版本不声称完成旧版本内容取证。

如果当前验证器没有实现字形位置侧信道测试,报告应写成not_tested,而不是默认pass。安全结论的可信度来自明确记录“测过什么、没测什么”,而不是把未知范围隐藏起来。

Foxit SDK 在这条流程中的位置

在程序化流程中,Foxit PDF SDK 可以作为 PDF 解析、区域标记和永久删除的处理引擎。下一篇会以 C++/Windows 为主线,完成一个最小闭环:加载文档、解析页面、搜索目标文本、获取矩形、标记 redaction、执行Apply()、使用明确的非增量标志全量保存新文件,再交给独立解析器验证修订结构和内容。

需要特别说明:本文引用的字形位置研究评估的是论文中列出的工具和工作流。除非针对具体 Foxit SDK 版本完成独立实验,否则不能据此宣称它受影响,也不能宣称它已经专门消除了该侧信道。SDK 负责完成关键处理能力,发布系统仍需承担规则、清理、验证和审计责任。

最后记住一个判断标准

不要只问“黑框有没有盖住”,而要问:

如果接收者完全不遵守我的预期操作,他还能不能从当前对象、历史修订或版面线索中读取、提取或推断出不应获得的信息?

这个问题会自然地把检查从页面截图扩展到底层对象、隐藏数据、文档工作流和独立验证。也只有到这一步,PDF 脱敏才从一个视觉效果,变成一条可以进入生产系统的安全流程。


本文基于公开资料和个人技术验证,不代表福昕官方观点;法规内容仅作技术背景,不构成法律意见。公开资料最后核对日期为 2026-08-11。

评论或私信“PDF脱敏清单”,获取五层验收清单。如果你正在评估程序化 PDF 脱敏,可以从 Foxit PDF SDK for Windows 试用页开始,用合成测试文件验证自己的流程。

专栏导航:系列目录|下一篇:[PDF 脱敏技术【2】:从识别到永久删除

← 返回列表