英特尔® Software Guard Extensions 教程系列:第一部分,英特尔® SGX 基础
from:https://software.intel.com/zh-cn/articles/intel-software-guard-extensions-tutorial-part-1-foundation
教程系列的第一部分仅对该技术进行了简单概述。 更多详情,请参阅提供的相关资料。 在文章中查找本系列所有教程列表。
了解英特尔® Software Guard Extensions 技术
软件应用通常需涉及诸如密码、账号、财务信息、加密秘钥和健康档案等私人信息。 这些敏感数据只能由指定接收人访问。 按英特尔 SGX 术语来讲,这些隐私信息被称为应用机密。
操作系统的任务对计算机系统实施安全策略,以避免这些机密信息无意间暴露给其他用户和应用。 操作系统会阻止用户访问其他用户的文件(除非访问已获得明确许可),阻止应用访问其它应用的内存,阻止未授权用户访问操作系统资源(除非通过受到严格控制的界面进行访问)。 应用通常还会采用数据加密等其它安全保护措施,以确保发送给存储器或者通过网络连接而发送的数据不会被第三方访问到——即使是在操作系统和硬件发盗用的情况下。
尽管有这些措施提供保护,但大部分计算机系统仍然面临着一项重大安全隐患:虽然有很多安保措施可保护应用免受其它应用入侵,保护操作系统免受未授权用户访问,但是几乎没有一种措施可保护应用免受拥有更高权限的处理器的入侵,包括操作系统本身。 获取管理权限的恶意软件可不受限制地访问所有系统资源以及运行在系统上的所有应用。 复杂的恶意软件可以锁定应用的保护方案为目标进行攻击,提取加密秘钥,甚至直接从内存提取机密数据。
为对这些机密信息提供高级别的保护,同时抵御恶意软件的攻击,英特尔设计了英特尔 SGX。 英特尔 SGX 是一套 CPU 指令,可支持应用创建安全区: 应用地址空间中受保护的区域,它可确保数据的机密性和完整性——即便有获取权限的恶意软件存在。 安全区代码可通过专用指令启用,并被构建和加载成 Windows* 动态链接库 (DLL) 文件。
英特尔 SGX 可减少应用的攻击面。 图 1 显示了借助英特尔 SGX 安全区和不借助英特尔 SGX 安全区时,攻击面的显著差异。
图 1: 借助和不借助英特尔® Software Guard Extensions 安全区时的攻击面。
英特尔 Software Guard Extensions 技术如何确保数据安全
英特尔 SGX 可针对已知的硬件和软件攻击提供以下保护措施:
- 安全区内存不可从安全区外读写,无论当前的权限是何种级别,CPU 处于何种模式。
- 产品安全区不能通过软件或硬件调试器来调试。 (可创建具有以下调试属性的安全区:该调试属性支持专用调试器,即英特尔 SGX 调试器像标准调试器那样对其内容进行查看。 此措施旨在为软件开发周期提供辅助)。
- 安全区环境不能通过传统函数调用、转移、注册操作或堆栈操作进入。 调用安全区函数的唯一途径是完成可执行多道保护验证程序的新指令。
- 安全区内存采用具有回放保护功能的行业标准加密算法进行加密。 访问内存或将 DRAM 模块连接至另一系统只会产生加密数据(见图 2)。
- 内存加密秘钥会随着电源周期(例如,启动时或者从睡眠和休眠状态进行恢复时)随机更改。 该秘钥存储在 CPU 中且不可访问。
- 安全区中的隔离数据只能通过共享安全区的代码访问。
受保护的内存在大小上存在硬限值,该限值由系统 BIOS 设定,通常为 64 MB 和 128 MB。 有些系统提供商可能会将此限值制定成其 BIOS 设置内的可配置选项。 内存中可同时保留 5 到 20 个安全区,这取决于每个安全区的大小。
图 2: 英特尔® Software Guard Extensions 如何确保受保护应用中安全区数据的安全。
设计注意事项
包含英特尔 SGX 技术的应用设计要求将应用分成两个部分(见图 3):
- 可信部分。 它指的是安全区。 可信代码中的代码是访问应用机密的代码。 一款应用可以拥有一个以上可信部分/安全区。
- 不可信部分。 它包括应用的剩余部分及其所有模块。 需要指出的是,从安全区的角度来看,操作系统和虚拟机显示器都被看做不可信部分。
可信部分应尽量保持最小,仅限于需要最高等级保护的数据以及必须直接作用于其上的操作。 具有复杂界面的大型安全区不仅仅会消耗更多受保护内存:还会产生更大攻击面。
安全区还应使可信-不可信部分交互程度保持最低。 虽然安全区可离开受保护内存区域,在不可信部分(通过专用指令)调用函数,但对依赖性进行限制将会针对攻击对安全区进行加固。
图 3: 英特尔® Software Guard Extensions 应用执行流程。
认证
在英特尔 SGX 架构中,认证指的是以下流程,即证明在平台上建立了特定安全区。 有两种认证机制:
- 本地认证 适用于同一平台上两个安全区进行相互认证时。
- 远程认证 适用于某一安全区获取远程提供商的信任时。
本地认证
当应用拥有一个以上需要相互协作才能完成任务的安全区时,或者两款应用必须在安全区之间进行数据通信时,本地认证非常有用。 每个安全区都须对另一安全区进行验证,以确认双方都是可信安全区。 一旦完成认证,它们就会建立受保护会话,采用 ECDH Key Exchange 共享会话秘钥。 该会话秘钥可用于对必须在这两个安全区之间进行共享的数据进行加密。
因为一个安全区不能对另一个安全区的受保护内存空间进行访问——即使它们运行在同一应用中,所以必须将所有指针解除引用至其值和副本,且必须将完整的数据集从一个安全区封送至另一安全区。
远程认证
借助远程认证,英特尔 SGX 软件和平台硬件的组合可用于生成评价,评价会被发送至第三方服务器以建立信任。 该软件包括应用安全区,以及评价安全区 (QE) 和配置安全区 (PvE),后两者皆由英特尔提供。 该认证硬件是英特尔 SGX 所支持的 CPU。 将该软件信息摘要与来自该硬件的平台唯一非对称秘钥相组合以生成评价,再通过已认证渠道将评价发送至远程服务器。 如果远程服务器确认安全区得到了正确实例化且运行在真正支持英特尔 SGX 的处理器上,远程服务器就会立即信任该安全区并选择通过已认证渠道向其提供机密信息。
密封数据
密封数据是对数据进行加密,以便可在不泄露其内容的前提下将数据写至不可信内存或对其进行存储。 稍后,该安全区可将该数据读回并进行解封(解密)。 加密秘钥由内部按需推导,不会暴露给安全区。
有两种数据密封方法:
- 安全区标识。 本方法可生成一个所述安全区所独有的秘钥。
- 密封标识。 本方法可生成一个基于安全区密封授权方标识的秘钥。 相同签名授权方的多个安全区可推导出相同秘钥。
密封至安全区标识
密封至安全区标识时,秘钥对于密封数据的具体安全区是独一无二的,该安全区会影响其签名的任何更改都会产生新秘钥。 借助该方法,使用一版安全区密封的数据不可由其他版本的安全区访问,因此该方法的一个副作用是,密封的数据不可迁移至较新版本的应用及其安全区中。 它专为密封的旧数据不应被新版应用使用的应用而设计。
密封至密封标识
密封至密封标识时,来自同一授权方的多个安全区可透明地对彼此的数据进行密封和解封。 这样,来自一版安全区的数据可迁移至另一版,或在同一软件厂商的多个应用中进行共享。
如果需要防止旧版软件和安全区访问较新应用版本密封的数据,授权方可在对安全区进行签名时写下软件版本编号 (SVN)。 比指定 SVN 更旧的安全区版本将不可推导出密封密钥,因此不可对数据进行解封。
我们将如何在本教程中使用英特尔 Software Guard Extensions 技术
我们描述了英特尔 SGX 的三大要素:安全区、认证和密封。 对于本教程,我们将重点实施安全区,因为安全区是英特尔 SGX 的核心。 如果不先建立安全区,您不可进行认证或密封。 这还有助于确保教程保持可管理大小。
即将推出
本教程系列第二部分,,将聚焦我们将为英特尔 SGX 构建和支持的密码管理程序应用。 我们将谈及设计要求、限制和用户界面。 敬请关注!
在文章中查找本系列所有教程列表。