intel sgx 代码编程简介(二)

  1. 目的:Intel® Software Guard Extensions (Intel® SGX)保护选定的代码和数据不被泄露和修改

  2. 技术产生的背景

应用程序安全约束
开发者长期以来受到主要平台提供商暴露给应用开发的安全能力的限制。黑客也一样熟悉这些功能,他们能够利用弱点来加密敏感数据、凭据或者劫持代码来进行攻击。开发者必须依赖提供商的安全架构,在平台发布之后,他们没有能力设计一个符合他们需求的安全模型。

解决方案

需要一种新模型能够利用平台和OS的优势,但是又能给懂得应用程序机密需要额外保护的开发者提供独立能力。Silicon-assisted安全有一个唯一的机会增加OS提供新能力为应用程序根据开发者需要来保护自身。

实现技术

Intel着手设计一个可能具有最小攻击面的硬件辅助的可信执行环境:CPU边界。Intel SGX提供了17种新的Intel®架构指令,应用程序可以用来为代码和数据设置保留的私有区域,也能够阻止对执行中代码和内存中数据进行的直接攻击.

开发Intel SGX保护的应用程序

Intel SGX程序由两个部分组成:不可信代码和可信enclave(可以被安全调用)。开发者可以创建一对多的可信enclave一起工作来支持分布式体系结构。
intel sgx 代码编程简介(二)_第1张图片

运行时机制

在运行时(如下图),Intel SGX指令在一个特定的保护内存区域中创建和执行enclave,该区域有由开发者定义的受限入口和出口函数。能够防止数据泄露。在CPU范围中的enclave代码和数据运行在干净环境中,enclave数据写入到磁盘会被加密并且校验其完整性。
intel sgx 代码编程简介(二)_第2张图片
图片流程表示:

  1. App由可信和不可信部分构成
  2. App运行和创建enclave,enclave放入到可信内存中。
  3. 可信函数被调用,执行会转换到enclave中。
  4. enclave可以访问所有进程数据,外部要访问encalve数据被禁止
  5. 可信函数返回enclave数据
  6. App进行执行不同代码

如何设计一个Intel SGX 程序

  1. 将程序分为两个部分,安全区之内有那些代码,安全区之外有那些代码,在可信与不可信之间如何交互,
  2. 用于所有安全区的内存容量是固定的,安全区的 体积应该尽可能的小。
  3. 进出安全区要损失性能,进过一次调用完成大量工作,比多次进出安全区调用效率要高。

安全区定义语言EDL

安全区的机密数据能且仅能被安全区内的代码访问。而执行安全内的代码的唯一方式就是通过开发人员创建的接口函数,cpu默认这个限制生效。

ECall 和Ocall 组成了安全区的接口

每个安全区可以定义一个或者多个E-call,它们是非可信应用程序的进入安全区的入口点,另外,安全区可以定义O-call,可以使得安全区函数可以调用外部的非可信应用程序,然后返回到安全区中.这些e-call 和o-call组成了安全区的接口。但是这些函数并非直接由**非可信应用程序执行,**因为对安全区的入口点和出口点的访问由处理器严格控制,为了完成(进出安全区的)转换,需要依序执行特定的CPU指令。

Edger8r工具
作用

  1. 自动为E_call和O-call生成代理函数,这样,应用程序可以像调用其他C语言函数一样调用它。
  2. 为了创建代理函数,Edger8r从EDL文件中读取安全区接口定义。

EDL文件简介
intel sgx 代码编程简介(二)_第3张图片

  1. 所有能被非可信程序调用的E-call 都必须声明为public,每个安全区至少有一个Public 的E-call
  2. 不含有Public 的E-call 只能被另一个 o-call执行。
    当进行e-call 和o-call调用时,函数参数要从非可信内存和可信内存之间进行封送处理,如果函数参数是值传递,对应的封送处理是单行的,在E-call 或者o-call内部进行的更改不会反映到调用的函数上,如果函数参数是引用传递,必须完整地米哦按花素数据的封送处理过程。每个指针或者参数之前必须有方括号来描述封送处理的方向,以及封送处理的元素数量(有时可以省略)
  • ln :表示数据需要封送到Ecall 或者Ocall之内。
  • out:数据需要从e-call 或者 o-call 封送回调用的函数,使用out,需要在调用E-call 或者o-call 分配好数据的缓冲区。
    举例:10个32整数会被封送处理。
    在这里插入图片描述
    注:若使用ln关键字封送一个‘\0‘为终止符的字符串,可以使用string ,wstring来代替count,string\wstring不能和out一起使用。在这里插入图片描述

EDL(二)

  1. 关于void类型处理。
    解决方式:通过size关键子指定单个元素的大小。
    32个8字节的数据封装到ecall
    在这里插入图片描述
  2. 封装指针指向的地址传递给E-call或者o-call
    解决方式:user_check关键字在这里插入图片描述

注解:

  • 传递的指针不经过边界例程的安全检查和数据封装处理,E-call、ocall将直接作用于指针的地址。
  • 只有声明为Public 的E-call可以被不安全的函数调用,它们被称之为Root ecall ,有public关键字指定。
    不含public的e-call只能被另外一个Ocall调用。但是缺省的情况下,ocall不能调用任何的Ecall.Allow关键字声明的Ocall可以调用Ecall.

举例:Ocall get_msg_block()只能调用Ecall update_hash()函数。

在这里插入图片描述

问题:How to Seal Data in Intel® SGX?

问题背景:如何将安全区中的数据持久化安全存储。
问题解决方式:数据密封功能
过程:数据被密封时,数据在安全区内用秘钥加密,秘钥直接从Cpu获取,在加密后数据只能在创建它本台电脑上解密。
两种秘钥策略(影响秘钥生成)

  • 安全区标识

生成一个该安全区独有的秘钥

  • 密封标识

基于安全区密封授权方的秘钥生成一个秘钥。

注:密封数据的电脑的指纹是秘钥的一个输入,意味着只有本机可以解封数据.
模式(debug 和Release)是秘钥的指纹,意味着对的模式可以解封对应的数据。主要防止sgx调试器调试Debug 安全区时,泄露Release模式安全区数据。
参考文章:Intel SGX系列(一)了解Intel SGX

你可能感兴趣的:(intel,sgx)