通俗理解SGX attestation

英特尔CPU从第六代酷睿开始增加了SGX特性,含有Intel Xeon版服务器级的CPU也包含了,比如Intel Xeon E3 v6。它是Software Gaurd Extensions的缩写,目的是从硬件实现信息安全。简单来讲就是英特尔通过硬件来实现一个安全的沙盒。这里一个电脑可以分为安全的沙盒和不安全的沙盒外部环境。沙盒外面的环境被认为是有可能被黑客或者恶意者完全操控的,是不安全的。沙盒外面的代码无法窥探或者修改沙盒内部的代码和数据;沙盒内部的代码执行也不会影响外部环境,沙盒有专门的“口子”,用于将数据从不安全的环境传入沙盒或者从沙盒内传出到非安全的环境。这里我们把沙盒用TEE表示,它是Trusted Execution Environment的简称,沙盒内部的环境中的程序被称为enclave程序,中文翻译为飞地。

TEE中的enclave程序可以由开发人员自定义开发,然后放到TEE中执行。现在Bob将他的enclave程序放到他本地且支持Intel SGX硬件的电脑上运行,也可以放到远方的其它人的电脑上执行。enclave运行的时候,他可以通过客户端传给enclave数据或者接受enclave计算的结果,如果enclave运行在Bob本人的电脑上,安全性没有问题;但是,如果enclave运行在其它人的电脑上,就让他担心了!远方的电脑可能是云服务提供商,他并不百分之百相信提供商是善良的,他希望(1)他的enclave是在支持Intel SGX的硬件平台上面执行的。如果远方的enclave运行在非Intel SGX支持的环境下,比如模拟的环境,就不能带来安全行保证;并且(2)希望在他的enclave程序初始化的时候完整性没被破坏,也就是enclave没有被篡改;(3)在他跟enclave程序通信的过程中数据是加密的。为了打消他的安全顾虑,就需要用到SGX attestation技术了。SGX Attestation有local attestation的和remote attestation的两种。

如果两个enclave程序运行在同一个计算机上,那么这两个enclave怎么样才能相信对方是安全的呢?这时候便需要local attestation。

实现这种方式最直接的方法是英特尔公司为每一个SGX CPU生成一对公私**对,将私钥烧录在不可删改的硬件上面。我们假设英特尔的CPU能够实现复杂的密码原语,比如进行数字签名。英特尔公司还需要提供一个公钥证书认证中心(Certificate Authority)为每一个SGX CPU和它的公钥关联起来,这个跟互联网上面的公钥认证中心是一个道理,目的是提供公钥的认证,让其它人能够确认其所持有或使用的某一个公钥是属于切确的团体或者个人的。比如我希望使用A的公钥加密一个消息然后发给A,A使用他的私钥就能解密和查看这个消息,但是在加密前我希望能够确定这是A的公钥,怎么确定呢?就需要到公钥认证中心去查询了。如果我使用的是黑客调包后的公钥来加密我的消息,那么黑客在得到密文后就可以直接解密查看这消息了。这些条件具备之后,在enclave完成初始化之后,enclave程序根据初始化状态信息生成一个哈希摘要,然后让SGX CPU签名,即数字签名(跟现实中的签名是同一个意思,表示签名者认同了所签署的文件),然后将签名和哈希摘要一同发给Bob。Bob收到之后,利用英特尔提供的Attestation service来认证enclave发来的数据,确信远程的enclave确实是运行在可信的Intel SGX GPU上面。

一个攻击者是不能够伪造签名的,因为(1)攻击者不能够获得烧录在硬件上面的CPU私钥;(2)只有enclave程序才能够让CPU数字签名;(3)不同的enclave程序的哈希摘要是不一样的,一个攻击者不能够伪造enclave的哈希摘要。因为上面的原因,如果远方电脑发来的数据能够通过认证,那么Bob就信服他enclave程序在远方电脑上面安全运行。

如果Bob希望向他的enclave程序传输一些数据或者希望接收enclave的执行结果,但是他不想让其它人知道所传输的内容。这就需要在Bob和enclave之间建立一个安全的传输通道了。如何建立呢?原理跟现在浏览器的HTTPS的TLS差不多。先使用**交换算法(Diffie-Hellmann key exchange)协商一个对称加密算法的**,然后通信双方都使用这个**来加密消息进行通信。

前面我们有一个假设,“英特尔的CPU能够实现复杂的密码原语”,不幸的是,实际上现在的英特尔CPU不能在硬件层面实现如此复杂的用于数字签名的密码原语。于是,英特尔采用了软件的方式来实现。但是普通的软件有被黑的可能,于是就有了Quoting Enclave (QE),顾名思义它是一个特殊的enclave程序,它能够安全地执行“数字签名”的逻辑计算,目的是用于remote attestation的数字前面。现在我们假设这个QE是安全可靠的,那么剩下的问题是如何让Bob的enclave向QE证明自己“运行在与QE同一个平台上”。如果这两个enclave都运行在同一个电脑上面,证明过程就是的local attestation了。local attestation的一个方便的地方是两个enclave都能够使用相同的被烧录在SGX CPU上面的私钥:Bob的enclave可以让SGX CPU使用类似于“数字签名”的方式签名一个消息,让QE验证 (这里涉及到 message authentication code (MAC) tag)。这样不直接告诉Bob的enclave SGX CPU的**,就能够让QE确信Bob的enclave运行在同一个电脑上面。

最后需要提到的是,英特尔的公钥认证中心的服务跟传统的有一定区别。英特尔使用的是Enhance Privacy ID(EPID),表示的是群组签名。它将签名者划分群组。当由用户拿着一个公钥证书来验证签名者的时候,CA只返回签名者所在的群组,而不是特定的签名者。这样做的目的是为签名者提供匿名保护。

-----------------------------内容添加------------------------------

在这里插入图片描述
Remote Attestation的例子
结合上面的图片讲解remote attestation。图片中有五个实体,他们分为两大部分,左边三个属于运行在SGX CPU平台上面的远程计算机;右边的challenger便是前文中的Bob了。右下角的Attestation Verification是Intel提供的认证服务。

Application是运行在TEE之外的应用程序,非安全的,Application Enclave是前文Bob的enclave程序。(1)Challenger(这里是Bob)给远方的application发起一个challenge,伴随一个nonce随机数,用于远程电脑的活性检测。(2)Application向Application Enclave发送Quoting Enclave的ID和Bob的challange以及nonce随机数。(3)Application Enclave收到消息之后,根据自己的程序初始化日志和其他数据(这些用manifest表示),生成一个摘要,放到User Data中,再调用EREPORT指令生成一个报告,目的是将manifest绑定到这个Application Enclave。最后将报告发送给Application。(4)Application把它转发给Quoting Enclave,让Quoting Enclave对它签名。(5)Quoting Enclave先验证这个报告,通过之后使用EPID中的私钥进行签名,生成一个QUOTE,然后向Application返回QUOTE。(6)Application将QUOTE和其他相关的数据发送给Challenger(7)Challenger结合EPID公钥和Attestation Verification Service认证QUOTE。

谢谢

reference

Anati, Ittai, et al. "Innovative technology for CPU based attestation and sealing."Proceedings of the 2nd international workshop on hardware and architectural support for security and privacy. Vol. 13. ACM New York, NY, USA, 2013.

Johnson, Simon, et al. "Intel® software guard extensions: Epid provisioning and attestation services."White Paper1 (2016): 1-10.

Costan, Victor, and Srinivas Devadas. "Intel SGX Explained."IACR Cryptology ePrint Archive2016.086 (2016): 1-118.

http://chenju2k6.github.io/blog/2018/02/Attestation