Windows 10 S中的Device Guard详解(上篇)
本文探讨Windows 10 S(下称Win10S)中的Device Guard(设备保护,下称DG)。我将提取策略,并弄清楚在默认Win10S系统上可以和不可以运行什么。我将在下一篇文章中介绍在不安装任何额外软件(如Office)或升级到Windows 10 Pro的情况下实现任意代码执行的一些方法。
Win10S是第一个向消费者发布的通过DG预先锁定的Windows操作系统。DG是基于WindowsVista中引入的内核模式代码完整性(KMCI)和Windows 8 RT中引入的用户模式代码完整性(UMCI)。DG包含诸多限制代码执行的特性,基于一组策略规则限制什么类型的可执行文件/脚本(包括DLL)可以加载。要找到在带DG的系统中运行任意代码的方法,我认为第一步是要提取DG策略并检查其缺陷。
提取DG系统完整性策略
DG的执行通过系统完整性(SI)策略配置。SI策略作为二进制文件存储在磁盘上。当操作系统启动时,WINLOAD或内核CI 驱动程序将策略加载到内存中,并根据配置的各种规则开始执行。
文件的位置取决于策略的部署方式。我使用的是预装了Win10S 的Surface笔记本电脑,策略位于C:\Windows\Boot\EFI文件夹中,名为winsipolicy.p7b。该文件无读取限制,我们可以提取其内容,因此可以确定执行的是什么策略。但是,据我所知,没有官方文档描述该二进制策略文件格式。有一个ConfigCI Powershell模块可将XML文件转换为二进制策略。但是没有相应的命令执行相反的操作。
MattGraeber编写了一个可将二进制格式转换回XML格式的Powershell脚本。但原始脚本有些问题,因此我做了一些修改,以完全支持Win10S中使用的策略格式,并修复了一些bug。Matt用我的修补程序在github上更新了其副本,可点击此处获取。将脚本加载到Powershell中,然后运行以下命令:
ConvertTo-CIPolicywinsipolicy.p7b output.xml
转换后得到我们可以阅读的XML文件。XML文件可从Matt的博文获取。接下来我们分成几个部分一一探讨。
系统完整性策略规则
第一个重要的部分是定义一组在系统完整性策略中启用的布尔选项的规则。

第一个选项启用UMCI。默认情况下,DG不执行UMCI,但执行KMCI。第二个选项启用“高级启动选项菜单”,这有点意思,因为默认情况下,菜单为禁用状态,该策略允许系统用户对启动过程有更多的控制。第三个选项是“执行应用商店应用程序”。这确保你不能为应用商店应用程序禁用UMCI。如果没有这种设置,就可以配置一个side-loading策略,如此你就可以部署自己的UWP应用程序。由于Win10S的宗旨是“安全性”,所以只允许应用商店签名的UWP应用程序,我将在“允许的签名者”部分解释这一点。最后一个是“条件性Windows锁定策略”,其似乎与Windows10S SKU和锁定策略最终可被禁用的可能性相关联。这与许可值和系统环境变量“Kernel_CI_SKU_UNLOCKED”有关。
文件规则
接下来是一组文件规则。这通常用于将已知可绕过DG及可让你轻易运行任意代码的具体可执行文件列入黑名单。这与微软在其DG部署指南中提供的列表接近。不过微软还阻止了注册表编辑工具和Windows脚本宿主等内容。

对于每个拒绝规则,策略指定一个文件名和最低文件版本。注意,在拒绝规则中,最低版本实则是最高版本。这就是说,规则仅适用于版本号低于指定版本的文件。由于每个规则的版本设置均为65535.65535.65535.65535,这是绝对最大值,这就确保了任何版本的可执行文件均无法执行。文件名和版本从可执行文件的版本资源中提取,这意味着仅仅将cmd.exe重命名为badger.exe并不能解决问题,策略会看到版本资源中的原始文件名并阻止执行。如果尝试修改版本资源,那么文件的签名不再匹配,你就无法通过签名策略。
对于微软为何要全力阻止CMD这样的东西,原因尚不十分清楚。我们确实可以用其运行命令,但签名策略一定程度上限制了可运行什么可执行文件。阻止PowerShell和WScript我还较为理解,但正如我们稍后会看到的,这些文件策略规则只能作为防止我们实现任意代码执行的减速带。
允许的签名者
现在我们来看看DG策略允许什么签名者(假设其未被文件规则阻止)。首先,DG策略定义允许的签名者列表,该列表稍后在策略配置中引用。允许的签名者列表如下:

大多数签名证书使用一种特殊的“知名”格式,仅用一个数字值来标识证书。找出这些数字值对应的证书可能比较麻烦。还好,Win10S中的Powershell ConfigCI模块有示例策略文件,比如Default_WindowsEnforced.xml,即使其未明确显示使用的证书,但至少给出了名称(毕竟其可能是多个Microsoft Product Root 2010证书)。比如,“MicrosoftProduct Root 2010”可能是以下root(是Win10S中几乎所有签名文件的root证书):

但是,由白名单签名者签名还不够,这未免太多简单。你还必须在证书链中具有特定的增强型密钥用法(EKU)。因此,比如,签名者ID_SIGNER_WINDOWS_PRODUCTION_USER必须具有OID值为1.3.6.1.4.1.311.10.3.6的EKUID_EKU_WINDOWS。Windows二进制文件设置了该EKU,但如果由相同root签名的二进制文件(比如WinDBG)也由微软签名,但未设置该EKU,这意味着其不加载。从这一信息我们可以理解由应用商店签名意味着什么。这是特定证书链和特定应用商店EKU的结合。这反映在ID_SIGNER_STORE签名规则中。

对于内核代码,允许以下签名者:

对于用户模式,允许以下签名者:

这里唯一突出的是ID_SIGNER_DRM的用户模式签名,因为其是DRM的预信任的root密钥。几乎肯定可以从多个图形驱动程序为链到该root的证书获取一个私钥。我尚未对此进行
Windows 10 S中的Device Guard详解(上篇)的更多相关文章
- Windows 10 显示中的仅更改文本大小和加粗选项
问题描述: 在Windows 10 1703 之前的版本,在控制面板-显示中,存在如下图中的图形界面设置: 系统升级到Windows 10 1703 或是Windows 10 1709 之后,不再存在 ...
- 各个版本 Windows 10 系统中自带的 .NET Framework 版本
原文各个版本 Windows 10 系统中自带的 .NET Framework 版本 Windows 名称 Windows 版本 自带的 .NET Framework 版本 Windows 10 Oc ...
- Windows 10操作系统中的邮件应用
早期的邮件收发软件Outlook express曾被广泛使用,然而现在却很难下载到,在Windows 10操作系统中也无法使用. 实际上,Windows 10中存在“邮件”应用,可以直接作为邮件的收发 ...
- java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET
java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了! 社区福利快来领取免费参加MDCC大会机会哦 Tag功能介绍—我们 ...
- 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解
[源码下载] 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Toa ...
- 重新想象 Windows 8 Store Apps (36) - 通知: Tile 详解
[源码下载] 重新想象 Windows 8 Store Apps (36) - 通知: Tile 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Tile ...
- C语言操作WINDOWS系统存储区数字证书相关函数详解及实例
C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...
- Asp.net中web.config配置文件详解(一)
本文摘自Asp.net中web.config配置文件详解 web.config是一个XML文件,用来储存Asp.NET Web应用程序的配置信息,包括数据库连接字符.身份安全验证等,可以出现在Asp. ...
- C#中web.config文件详解
C#中web.config文件详解 一.认识Web.config文件 Web.config 文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NE ...
随机推荐
- Tensorflow入门-上
前置准备 在阅读本文之前,请确定你已经了解神经网络的基本结构以及前向传播.后向传播的基本原理,如果尚未了解,可以查看下文. 深度学习之神经网络 什么是TensorFlow? TensorFlow是Go ...
- 「二叉搜索树 / set / 朝鲜树 / 替罪羊树」快速排序
要求 给定n个数,对这n个数进行排序 这题当然可以直接调用sort #include<cstdio> #include<vector> #define ll long long ...
- 安装gitlab并配置邮箱
安装要求:运行内存必须大于等于2G 一.安装docker wget -qO- https://get.docker.com/ | sh 镜像加速: echo '{"registry-mirr ...
- SQL函数解释(待补)
1.SQL— CONCAT(字符串连接函数) 有的时候,我们有需要将由不同栏位获得的资料串连在一起.每一种资料库都有提供方法来达到这个目的: MySQL: CONCAT() Oracle: CONCA ...
- Python入门之类(class)
面向对象三大特性 面向对象的三大特性是指:封装.继承和多态. 一.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容. 所以,在使用面向对象的封装特性时,需要: 将内容封装到 ...
- 级数求和(C++)
题目描述 已知:Sn=1+1/2+1/3+…+1/n.显然对于任意一个整数K,当n足够大的时候,Sn大于K. 现给出一个整数K(1≤K≤15),要求计算出一个最小的n:使得Sn>K. 输入 ...
- Git 教程 -- 第一天
什么是Git? Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 为什么使用Git? 众所周知,版本控制系统分为集中式版本控制系统(SVN.CVS等)与分布式版 ...
- 零基础入门学习Python(34)--丰富的else语句及简洁的with语句
知识点 else语句的用法: 1)配合if语句 if a>b: print(a) else: print(b) 2)配合while和for循环 只在循环完成后才执行,如果循环中执行使用到brea ...
- 源码学习-String类
最近在扫描CodeDex时报了一个不能使用String.intern()的字符串来做锁对象的告警,对这个问题有疑问查了些资料,顺便学习一下String类的源码. 1.类定义 String 被final ...
- 爬虫项目 之(一) --- urllib 和 正则re
from urllib import request,parse from time import sleep import re # 1.[数据的获取] # 封装一个函数,用于将url转化成一个请求 ...