Office 2010 文件验证

大家好,我叫 David B Heise,在 Office 安全团队工作,负责测试 Office 文件验证(代码名称:网关守卫)。人们对 Microsoft Office 2010 的新文件验证功能存在一些误解,在此我希望消除这些误解,同时说明原因及具体操作。

为什么要验证二进制文件?

一直以来,Office 二进制格式的标准不断演化,复杂性不断增加。对于这些格式复杂的原因,在其他地方已详细讨论过(请参阅此处的 Joel Spolsky 的文章),因此我们在此不作探讨,但此处完好记录了这些二进制格式。我们发现,恶意攻击者将二进制文件用作攻击手段来感染目标用户,因此我们希望找到一种阻止此问题发生的方法。我们团队采取的一项措施是:当 Microsoft 收到一个新的 Office 文件格式攻击的报告时,我们就会通过验证进行检查,以了解我们这项措施的效果。到目前为止,效果相当不错!

什么是网关守卫?

Office 文件验证是一种功能,该功能最初是在 Publisher 2007 中引入的,用来验证 Publisher 的 PUB 文件。它可验证特定二进制文件是否符合应用程序的要求。在 Office 2010 中,我们有效扩展了该功能,以包含 Word、Excel 和 PowerPoint 的二进制格式。请注意,该功能仅适用于二进制格式(即 PUB、DOC、XLS、PPT 等),而不能验证基于 XML 的文档(即 DOCX、XLSX、PPTX 等),也不能验证宏或其他自定义项目。它可验证的对象是文件结构。例如,如果有一个具有 FONTINDEX 结构的 XLS 文件,而 ifnt 值设置为 4(对此特定项目无效的值),则无法进行验证。

它的工作原理是什么?

当通过 Word、PowerPoint 或 Excel 加载不可信的二进制文件(即不在受信任位置且不是受信任文档)时,该功能将进行检查,查看加载的文件是否是有效文件。主要是检查应用程序即将解析的文件的具体位数,即相关 OLESS 流。如果确定是有效文件,则会按正常方式打开,无需移走。但如果发现文件无效,则会将其发送到(默认情况)受保护的视图

图像

如果单击该文本,您将转到 Backstage 视图,您可在其中以完整的应用程序体验形式打开此文件。请注意,此操作相当于作出信任决定,这会将此特定文件标记为受信任文件,在下次打开此文件时也不会对其进行验证。

在处理完文件并关闭应用程序后,您可能会看到如下提示:

图像

该提示最多每两周显示一次(每个应用程序),以便您通过 Windows 错误报告选择是否将无效文件发送给我们。当然,如果您不希望共享该信息,也可以删除一两个文件,但如果将文件发送给我们,我们便可以进一步分析它,从而改进 Office 文件验证功能。

如何控制此操作?

通过策略

我们发现许多管理员(或有安全意识的用户)可能不喜欢打开验证失败的文件,因此我们推出了一个组策略来控制文件验证失败时的默认操作。这些策略位于组策略模板中应用程序的“选项”\“安全性”\“信任中心”\“受保护的视图”下,它视应用程序设置而定。

图像

通过注册表

有以下几个用来控制 Office 文件验证的各个方面的注册表项。

常用注册表项

HKCU\Software\Microsoft\Office\14.0\Common\Security\FileValidation \ReportingInterval - 这是一个 DWORD,它可控制显示将文件发送到 Windows 错误报告的对话框的间隔天数。

HKCU\Software\Microsoft\Office\14.0\Common\Security\FileValidation\DisableReporting - 这是一个 DWORD,如果设置为 1,则禁止显示对话框(因此禁止向 Windows 错误报告发送文件)。

应用程序特定注册表项

适用于我将使用“Excel”的这些示例,但对“PowerPoint”和“Word”同样有效

HKCU\Software\Microsoft\Office\14.0\Excel\Security\FileValidation\EnableOnLoad – 这是一个 DWORD,如果设置为 0,则 Office 不会验证文件。

HKCU\Software\Microsoft\Office\14.0\Excel\Security\FileValidation\DisableEditFromPV – 这是一个 DWORD,如果设置为 1,则禁止编辑验证失败的文件。

Excel 特定注册表项

HKCU\Software\Microsoft\Office\14.0\Excel\Security\FileValidation\PivotOptions – 这是一个 DWORD,可控制验证文件的透视表缓存(由于性能原因)的特定选项。

0 = 从不验证任何透视表缓存
1 = 在以下情况下验证透视表缓存:(1) 文件是从 Internet 打开的,并且该平台在本地将文件标记为来自 Internet。(2) 文件是 Microsoft Outlook 电子邮件附件。(3) 用户专门在受保护的视图中打开文件。(4) 从缓存 Internet 内容的本地已知“非安全位置”以及任何特殊用户定义的不受信任位置打开文件,除非通过(其他)注册表项禁用受保护的视图的非安全位置。(5) 在加载时打开文件并解析透视表缓存。
2 = 始终验证所有透视表缓存

通过脚本

对于基于 Office 构建的自定义解决方案,向应用程序对象添加了一些有趣的属性,它们能够对该会话禁用文件验证。还有一个额外的 Excel 选项可控制透视表缓存(即数据透视表和数据透视图的文件缓存数据)的验证。下面是一个 Powershell 脚本示例,演示如何设置这两个 Excel 选项(但 FileValidation 属性也适用于 Word 和 PPT):

$excel = New-Object -comobject Excel.Application
# valid values are:
# msoFileValidationDefault = 0
# msoFileValidationSkip = 1
$excel.FileValidation = msoFileValidationSkip
# valid values are:
# xlFileValidationPivotDefault = 0 (do whatever you’d normally do, i.e. follow registry & default settings),
# xlFileValidationPivotRun = 1 (validate all pivot caches),
# xlFileValidationPivotSkip = 2 (don’t validate any pivot caches)
$excel.FileValidationPivot = xlFileValidationPivotSkip

太棒了,但效果如何?

我们做了大量工作来确保文件验证的速度。是的,现在打开一个文件需要更长的时间,但我们通常只需多花几毫秒便可完成验证。实际上,您很难找到一个其验证时间超过一秒的标准大小的文件,大多数文件的验证时间都在 1 到 100 毫秒之间。当然,如果文件很大非常复杂且需要一小时才能打开,那么确实需要超过一秒的时间才能完成验证,但您可能根本注意不到。对于文件验证时间超过 5 秒(因此我们将在此探讨很复杂的文件)这一情况,我们为您提供了选项,允许您取消验证并直接转到受保护的视图。毕竟,我们通常不能让您直接打开它,因为那样黑客可能会编写很复杂的文件来接管您的计算机,这正是该功能尝试阻止的情况。

图像

另外,对于验证时间很长的任何文件(如果文件通过验证、未通过验证或跳过验证),系统会显示与有问题的文件相同的 Windows 错误报告提示;向您提供选项,以便您将文件发送给我们进行进一步分析。

概要

一天,在与开发人员聊天时,我们记下了这样一段对话:

“你们在开发什么?”

“Office 文件验证”

“那是什么东西?”

“检查 Office 文件,确保文件有效”

“那么,你们这两年来一直在编写布尔函数?”

“噢…嗯…是的,这是一个重要的函数!”

到最后,Office 文件验证实际上只是一个告知应用程序文件是否有效的 Yes/No 函数,但它确实是一个重要的函数!实际上,它还是一个复杂的函数,了解文件格式规范的人都能证明这一点。那么,在此您可以一言以蔽之:Office 文件验证功能可检查二进制文件,以确保文件的重要位有效。如果您认为我们错了,您可以信任文件,也可以告诉我们!

最初发表时间: 2009 年 12 月 16 日(星期三),下午 2:52,作者:Office 团队

这是一篇本地化的博客文章。请访问 https://blogs.technet.com/office2010/archive/2009/12/16/office-2010-file-validation.aspx 以查看原文。