Windows 安全功能测试

测试应用,验证它是否使用了 Windows 安全功能和强 ACL。

背景

更改默认的 Windows 安全保护可能增加客户的风险。

测试详细信息

运行 BinScope Binary Analyzer 和 Attack Surface Analyzer 来测试应用的安全性。

更正操作

排除并修复测试识别的问题。重新构建和重新测试应用。

BinScope Binary Analyzer 测试

BinScope Binary Analyzer 测试检查应用的二进制文件,以检查使应用不容易被攻击或被用作攻击平台的编码和构建实践。

BinScope Binary Analyzer 测试检查对这些安全相关功能的正确使用:

  • AllowPartiallyTrustedCallersAttribute
  • /SafeSEH 异常处理保护
  • 数据执行保护
  • 地址空间布局随机化
  • 读取/写入共享 PE 部分
  • AppContainerCheck
  • ExecutableImportsCheck
  • WXCheck

AllowPartiallyTrustedCallersAttribute

**Windows 应用认证工具包错误消息:**APTCACheck 测试失败

AllowPartiallyTrustedCallersAttribute (APTCA) 属性可以从签名程序集中的部分信任代码访问完全信任的代码。当你将 APTCA 属性应用到程序集时,部分信任的调用方便可以在该程序集的寿命内访问它,这样可能会危及安全性。

在应用未通过此测试时怎么办

不要使用强命名程序集上的 APTCA 属性,除非你的项目需要它且已充分了解风险。为防不时之需,确保所有 API 都受到了保护并具有合适的代码访问安全性要求。程序集包含在 Windows 应用商店应用中时,APTCA 不会生效。

备注

仅在托管代码(C#、.NET 等)上执行此测试。

/SafeSEH 异常处理保护

**Windows 应用认证工具包错误消息:**SafeSEHCheck 测试失败

异常处理程序在应用遇到异常情况时运行,例如被零除错误。因为在调用函数时异常处理程序的地址存储在堆栈上,所以如果某个恶意软件要覆盖堆栈,可能会易于受到缓冲区溢出攻击者的攻击。

在应用未通过此测试时怎么办

生成应用时,在链接器命令中启用 /SAFESEH 选项。默认情况下,此选项处于打开状态(位于 Visual Studio 的“发布”配置中)。确认在生成指令中为应用中的所有可执行模块启用了此选项。

备注

不在 64 位二元文件或 ARM 芯片集二元文件上执行此测试,因为它们不将异常处理程序地址存储在堆栈上。

数据执行保护

**Windows 应用认证工具包错误消息:**NXCheck 测试失败

此测试验证应用是否未运行存储在数据段中的代码。

在应用未通过此测试时怎么办

生成应用时,在链接器命令中启用 /NXCOMPAT 选项。默认情况下,此选项在支持数据执行保护 (DEP) 的链接器版本中处于打开状态。

备注

我们建议,在支持 DEP 的 CPU 上测试你的应用,并修复你发现的由于 DEP 所导致的任何故障。

地址空间布局随机化

**Windows 应用认证工具包错误消息:**DBCheck 测试失败

地址空间布局随机化 (ASLR) 将可执行文件映像加载到内存中不可预测的位置,从而使预期某个程序在特定虚拟地址加载的恶意软件更难以按可预见的方式运行。你的应用及其使用的所有组件必须支持 ASLR。

在应用未通过此测试时怎么办

在生成应用时,在链接器命令中启用 /DYNAMICBASE 选项。验证你的应用使用的所有模块也使用此链接器选项。

备注

通常,ASLR 不影响性能。但在某些情况下,在 32 位系统上有少许的性能改进。原因可能是,在许多不同内存位置加载许多映像的高拥堵系统中,性能可能会降级。

此测试仅在使用托管代码编写的应用上执行,如使用 C# 或 .NET Framework 编写的应用。

读取/写入共享 PE 部分

**Windows 应用认证工具包错误消息:**SharedSectionsCheck 测试失败。

如果二进制文件包含标记为共享的可写入节,那么它就是一种安全威胁。除非必须,否则不要构建包含共享的可写入节的应用。使用 CreateFileMappingMapViewOfFile 创建受到适当保护的共享内存对象。

在应用未通过此测试时怎么办

从应用中删除任何共享节,使用合适的安全属性调用 CreateFileMappingMapViewOfFile 来创建共享内存对象,然后重新构建你的应用。

备注

此测试仅在使用非托管语言(如使用 C 或 C++)编写的应用上执行。

AppContainerCheck

**Windows 应用认证工具包错误消息:**AppContainerCheck 测试失败。

AppContainerCheck 验证一个可执行二进制文件的可移植可执行 (PE) 头文件中的 appcontainer 位是否已设置。 Windows 应用商店应用必须在所有 .exe 文件和所有非托管 DLL 上设置了 appcontainer 位才能正确执行。

在应用未通过此测试时怎么办

如果原生的可执行文件未通过测试,请确保你使用了最新的编译器和链接器来构建文件,并在链接器上使用了 /appcontainer 标记。

如果托管的可执行文件未通过测试,请确保你使用了最新的编译器和链接器(如 Microsoft Visual Studio)来生成 Windows 应用商店应用。

备注

此测试在所有 .exe 文件和非托管 DLL 上执行。

ExecutableImportsCheck

**Windows 应用认证工具包错误消息:**ExecutableImportsCheck 测试失败。

如果可移植可执行 (PE) 映像的导入表放在了一个可执行代码节中,该映像将无法通过此测试。 如果通过将 Visual C++ 链接器的 /merge 标记设置为 /merge:.rdata=.text,为 PE 映像启用了 .rdata 合并,则可能发生此情形。

在应用未通过此测试时怎么办

不要将导入表合并到可执行代码节中。确保 Visual C++ 链接器的 /merge 标记未设置为将“.rdata”节合并到代码节中。

备注

此测试在除纯粹的托管程序集以外的所有二进制代码上执行。

WXCheck

**Windows 应用认证工具包错误消息:**WXCheck 测试失败。

此项检查有助于确保二进制文件不包含任何映射为可写和可映射的页面。 如果二进制文件包含可写和可执行的部分,或者如果二进制文件的 SectionAlignment 小于 PAGE_SIZE,则可能会发生这种情况。

在应用未通过此测试时怎么办

确保二进制文件不包含可写或可执行部分,并且二进制文件的 SectionAlignment 值至少等于 PAGE_SIZE

备注

此测试在所有 .exe 文件和本机非托管 DLL 上执行。

如果已在启用“编辑”和“继续”(/ZI) 的情况下构建可执行文件,则其中可能包含可写和可执行部分。禁用“编辑”和“继续”将导致不提供无效部分。

PAGE_SIZE 是可执行文件的默认 SectionAlignment 值。

Windows 应用商店中禁止的文件

Windows 应用认证工具包错误消息:“对被禁止文件的检查”测试失败。

Windows 应用商店应用不应当包含某些文件。这些文件有一个较新的版本可用,该版本提供了重要的安全性、可靠性或其他改进。Microsoft 在 Windows 应用认证工具包中阻止了这些文件以确保所有开发人员都使用当前版本。

Windows 应用认证工具包中“对阻止的文件的检查”当前会对以下文件进行检查:

Attack Surface Analyzer

Attack Surface Analyzer 测试检查在安装和运行一个应用后,系统状态、运行时参数和安全对象中发生的更改,以寻找特定的安全漏洞。修复这些漏洞不会带来任何性能损失。如果你的应用拥有任何这些安全漏洞,我们将无法针对 Windows 应用商店认证你的应用。

Attack Surface Analyzer 测试适用于所有编程语言,在一个应用中寻找这些安全漏洞。

  • 具有弱 ACL 的安全可执行文件
  • 包含对象并拥有弱 ACL 的安全目录
  • 具有弱 ACL 的安全注册表项
  • 允许访问非管理员帐户且容易被篡改的服务
  • 具有快速重新启动功能或可能每 24 小时会重新启动两次以上的服务

具有弱 ACL 的安全可执行文件

此测试通过检查管理员拥有的每个新的或未更改的可执行文件上的访问控制列表 (ACL),寻找具有弱 ACL 的安全可执行文件。这些文件上的 ACL 必须阻止非管理员修改它们。Attack Surface Analyzer 测试可执行 (.exe) 文件和可能包含可执行内容的文件,如脚本和帮助文件。

在应用未通过此测试时怎么办

如果在你的应用中检测到此漏洞,请检查并删除任何非管理员帐户的以下权限:GENERIC_ALLGENERIC_WRITEWRITE_OWNERWRITE_DACFILE_WRITE_ATTRIBUTESFILE_WRITE_EAFILE_APPEND_DATAFILE_WRITE_DATA, DELETE

备注

弱 ACL 允许非管理员修改可执行文件。如果一个可执行文件被修改,它可能无法按预期运行。如果未正确配置访问权限,攻击者可以替换或修改文件的内容,导致它行为异常。

包含对象并拥有弱 ACL 的安全目录

此测试通过检查新的或已更改的文件层次结构上的 ACL,查找包含对象且具有弱 ACL 的安全目录。分层 ACL(或继承的 ACL)控制对一个文件夹内所有文件和文件夹的访问。这些文件夹上的 ACL 必须阻止非管理员修改这些文件夹或它们的内容。

此测试识别层次结构中具有弱 ACL 的最高层次的文件夹,而不是将未正确保护的每个可执行文件和子文件夹标记出来。

在应用未通过此测试时怎么办

如果在你的应用中检测到此漏洞,请检查并删除测试所标识的目录上所有非管理员帐户的以下权限,使它们无法被继承:GENERIC_ALLGENERIC_WRITEWRITE_OWNERWRITE_DACFILE_ADD_FILEFILE_ADD_SUBDIRECTORYFILE_WRITE_ATTRIBUTESFILE_WRITE_EAFILE_APPEND_DATAFILE_WRITE_DATAFILE_DELETE_CHILDDELETE。这可能要更改根目录的 ACL 上的 Inherited 标记。

更正根目录上的权限后,你可能还需要更正各个可执行文件的权限,如具有弱 ACL 的安全可执行文件中所述。

备注

此测试识别一个目录层次结构及其所有具有弱 ACL 的文件,弱 ACL 会向非管理员授予不合适的权限。此层次结构可能由不正确的继承权限导致,所以请首先查看继承的权限,然后再更改子目录和文件中的权限。

具有弱 ACL 的安全注册表项

此测试通过检查本地机器注册表配置单元 (HKLM) 中新项或已更改项的访问控制列表 (ACL),查找具有弱 ACL 的安全注册表项。只有管理员才应具有本地机器注册表配置单元的写访问权限。

在应用未通过此测试时怎么办

在测试所识别的对象上删除所有非管理员帐户的以下权限:GENERIC_ALLGENERIC_WRITEWRITE_OWNERWRITE_DACKEY_SET_VALUEKEY_CREATE_SUBKEYDELETE

备注

此节中的注册表值可确定在何处查找可执行文件,如 .exe 和 .dll。应用还使用本地机器注册表配置单元中的注册表项来存储或读取可执行文件的路径。如果攻击者修改此项,如通过将该值更改为一个不受信任的可执行文件路径,则应用可能执行错误的文件。

如果一个注册表项似乎引用了一个可执行文件,此测试将检测该项的 ACL,查看它是否向非管理员帐户授予了不恰当的权限。

允许访问非管理员帐户且容易被篡改的服务

此测试通过检查服务上的 ACL,查找允许非管理员帐户访问的新服务或已更改的服务。 新服务不得在二进制路径、主机 DLL、注册表项或服务本身上具有弱 ACL,因为它们可能允许非管理员更改服务运行方式。

在应用未通过此测试时怎么办

按照具有弱 ACL 的安全可执行文件所述的内容修复各个文件。

备注

同时具有一般和特定于服务的关联权限的服务此测试寻找授给非管理员帐户的不恰当权限。 如果这些权限未受到保护,攻击者可重定向服务,使它在启动时执行不受信任的文件。

例如,攻击者可调用 ChangeServiceConfig 来更改服务的可执行文件的路径。

具有快速重新启动功能或可能每 24 小时会重新启动两次以上的服务

此测试通过检查服务的配置,查找可能频繁重新启动的服务。服务不得在 24 小时内重新启动超过 2 次。

在应用未通过此测试时怎么办

更改服务的 Reset Period,防止它在 24 小时内重新启动超过 2 次。

备注

此测试查找与地址空间布局随机化 (ASLR) 相关的漏洞。ASLR 功能将可执行代码加载到内存中的随机位置,因此更难以创建对安全漏洞的可靠攻击。如果攻击者可让一个服务反复重新启动,他们可以使用暴力破解方式将可执行代码加载到所有可能的位置并欺骗 ASLR。

此测试检查 Service Failure Actions 结构的 lpsaActions 元素中的 SC_ACTION_REBOOTSC_ACTION_RESTART 值。调用 ChangeServiceConfig2 可控制这些值。

此测试确定是否存在两个以上的操作,它们的延迟值是否少于 24 小时,以及服务器重置期是否不足 24 小时。