基于SGX技术的Windows遗留信息系统安全增强方案

2022-06-29 03:43张亚晖
陆军工程大学学报 2022年3期
关键词:遗留源代码组件

张亚晖, 赵 敏, 李 剑, 韩 欢

(1.陆军工程大学 通信士官学校,重庆 400035;2.陆军工程大学 指挥控制工程学院,江苏 南京 210007)

信息系统(information system,IS)是以处理信息流为目的的人机一体化系统,在人类的社会生活、生产实践、政治生态、军事斗争和人文学术等领域扮演着越来越重要的角色。但随着计算机软硬件的飞速发展,越来越多的信息系统成为遗留系统。长期运行的遗留信息系统通常承载着某些关键复杂业务,并具有以下特征:(1)系统架构陈旧、维护困难;(2)开发维护人员流动大、代码和文档缺失;(3)业务功能独立,没有集成;(4)安全防护问题突出。

遗留信息系统虽然存在较多问题,但因为长期运行,通常包含大量的业务数据,是企业非常重要的资源。大部分企业在处理遗留信息系统时通常有两种方式:(1)完全抛弃遗留信息系统,进行重新开发;(2)对遗留信息系统进行性能和安全优化。重新开发的信息系统可以采用较新的软硬件和开发技术,但通常需要对原有的数据进行适配转换,在此过程中,还需要继续使用遗留系统。因此,可以先对遗留信息系统进行性能和安全优化,再根据需求进行信息系统的重新开发。目前虽然有关于遗留信息系统工程方面的文献[1-2],但关于安全方面的研究相对较少,特别是目前遗留信息系统主要运行于基于Intel处理器的商用Windows平台,操作系统和信息系统本身都可能存在漏洞,易受攻击。虽然一些遗留信息系统具有身份认证、杀毒、加密等传统安防手段,但仍面临较大的安全风险,如无法解决运行态内存中的数据安全问题。

针对上述不足,本文以A公司在Windows上运行的无源代码无文档的遗留人力资源管理信息系统为例,提出采用SGX可信计算技术为该遗留信息系统中的敏感信息提供机密性和完整性保护,最大程度减少敏感信息的泄露问题。

本文的贡献主要有:(1) 设计了Windows场景中基于SGX技术保护遗留信息系统的架构,解决了该场景中信息系统的敏感信息保护问题,推广了SGX的典型应用场景。(2) 提出了基于Hook技术调用SGX的方法,解决了Windows遗留信息系统无法直接使用SGX的问题,丰富了遗留信息系统安全防护的技术手段。

1 背景和相关工作

1.1 微软Detours库

微软Detours库[3]可以在程序运行过程中动态拦截函数调用。它的工作原理是将目标函数前几个指令替换为一个无条件的跳转,跳转到用户定义的Detour函数。而被拦截的函数保存在一个名为Trampoline的函数中。Trampoline函数保存了目标函数移除的指令和一个无条件跳转,可以使执行流重新跳转回目标函数的执行体部分(即未被移除的部分)。当执行到目标函数的时候,可以根据用户指令直接跳转到用户提供的Detours函数,Detours函数开始执行自己的函数代码,执行完毕后可以直接返回或调用Trampoline函数将执行流程跳转到原目标函数前。当目标函数执行完以后,再将控制权交给Detour函数,Detour函数执行适当的代码返回。

1.2 SGX技术

SGX是Intel公司提出的一种芯片级信息隔离安全防护新技术,是对Intel体系(intel architecture)新的扩展,用于增强软件的安全性[4],Intel公司在Skylake系列CPU中开始加入了对SGX技术的支持。SGX通过在硬件级别上为应用程序实现一个被隔离的内存空间来保证运行代码和数据的机密性与完整性,被隔离的空间称为飞地(enclave)。不同于以往的识别和隔离平台上的恶意软件,SGX是将用户代码和数据以明文形式封装在Enclave中,而Enclave外的代码和数据则需要加密存储,因此对于非Enclave访问,外部存储器读取的和总线监听的都是加密后的数据。

另外,在x86架构中,Intel CPU的运行级别分为Ring 0、Ring 1、Ring 2和Ring 3四级。其中Ring 0权限级别最高,Ring 3最低,权限级别高的可以修改查看与它同级或较低级别的数据和代码,但反过来则经常被认为是非法操作而不被允许。在不支持SGX技术的硬件设备中,一些恶意攻击者可以通过获取Ring 0权限级别,对Ring 3权限级别的用户代码和数据实施窃取和破坏。但在SGX技术中,虽然SGX运行于Ring 3权限级别,但操作系统等均不被SGX信任,可以防止更高权限的攻击者对Enclave内代码和数据的攻击。

与当前流行的可信平台模块TPM[5]和ARM TrustZone[6]两种硬件安全隔离技术相比,SGX还具有较小的可信计算基TCB(trusted computing base),仅包括CPU和Enclave本身,避免了基于软件的TCB的漏洞与威胁。同时SGX可保障软件运行时的安全,恶意软件无法访问和篡改Enclave中运行时的内容;SGX基于指令集的扩展与独立的认证方式,使应用程序可以灵活调用SGX的安全功能并进行验证。

1.3 基于SGX的相关研究

自SGX技术提出以来,学术界和工业界对基于SGX的网络应用和针对SGX攻击与防御等[7-19]进行了大量研究与验证。其中,基于SGX技术构建可信的系统调用库LibOS可以提高安全应用的开发效率,为遗留系统提供安全增强保护,因而成为研究热点。

文献[7,8,11,12,17]基于SGX技术分别提出了Haven、SCONE、Panoply、Graphene-SGX和Occlum等LibOS方案。但遗憾的是,SCONE、Panoply、Graphene-SGX和Occlum只适用于Linux环境,且SCONE、Panoply和Occlum是利用交叉编译器实现的源代码级别兼容,即虽然可以不修改应用的源代码但必须要对源代码进行重新编译;而Graphene-SGX是二进制级别兼容,解决了大部分应用在无源代码情况下的隔离保护,已经成为非常受欢迎的LibOS,但其存在性能和数据同步一致性的问题。Haven是Windows环境中的LibOS方案,但它需要在Enclave中重新封装系统调用及其他的Shield模块等,使得其可信计算基过大,且因其闭源而导致Windows环境中基于SGX可用的遗留系统安全增强方案几乎空白。

2 威胁模型

A公司的遗留人力资源管理信息系统,主要用于存储公司的人力资源信息。因该系统开发时间较早,开发人员、文档和源代码等均已缺失,已成为无源代码无文档的遗留信息系统。经安装使用、逆向工程分析,其系统架构如图1所示。

图1 某遗留人力资源管理信息系统架构

该遗留信息系统是基于MFC开发的32位应用程序,并通过DLL动态链接库实现对SQL Server数据库的访问。系统中的敏感信息是人员数据,特别是用户口令、薪酬数据等。且用户口令和薪酬数据等敏感信息以明文的形式,分别存储在数据库表UsersLogin和WagesInfo中。

为该遗留人力资源管理信息系统的相关操作提供一个安全可信的执行环境,并有效保护系统中的数据是亟待解决的问题。基于此,本文假设系统的处理器是可信的,即Enclave安全容器及容器中的代码和数据都是可信的。而Enclave外部是不可信的,即BIOS、操作系统及遗留信息系统自身是不可信的。攻击者可以利用系统或软件漏洞攻击BIOS、操作系统或遗留信息系统等,获得Ring 0级别特权,进而可以修改系统配置,植入恶意代码、病毒,从而窃取、伪造或破坏遗留信息系统中的敏感信息。

3 基于SGX的无源代码无文档遗留信息系统安全增强方案

3.1 可行性分析

该遗留人力资源管理信息系统是32位的应用程序,运行于基于Intel处理器的商用Windows平台。而Intel SGX可信技术对硬件的要求是6代Skylake CPU及以上,对操作系统的要求是64位的Windows 7及以上,目前主流的64位操作系统是Windows 10、Windows Server 2012和Windows Server 2016等,可以兼容运行32位的应用程序,这为A公司的遗留信息系统使用SGX可信计算技术提供了硬件和软件支持。

3.2 安全增强方案

安全增强方案的目的是保护该遗留人力资源管理信息系统中的敏感信息。方案的基本思路是:

(1) 通过逆向工程、静态分析等方法找到Windows无源代码遗留信息系统的注入点;

(2) 编写Hook逻辑改变遗留信息系统中的数据库操作函数执行流程,使新的执行流程调用SGX不可信组件的接口函数;

(3) 使用不可信组件的接口函数将遗留信息系统的明文敏感信息传入可信Enclave安全容器;

(4) 在可信Enclave中对明文敏感信息进行加密处理并将相关的密钥等隐私数据绑定至Enclave;

(5) 将加密后的敏感信息返回给原数据库操作函数,并将相关的密文存储到数据库中。

基于SGX和Enclave是安全可信的,即使操作系统或遗留信息系统内部被攻击或篡改,仍可以保证Enclave安全容器中代码和数据的安全可信,防止敏感信息被窃取,架构示意图如图2所示。

图2 基于SGX的遗留信息系统安全增强方案框架

基于上述思路,开发人员不需要对原遗留信息系统进行任何修改,只需要:

(1) 改变原数据库操作函数的执行流程。

(2) 开发Hook函数与SGX不可信组件交互的接口函数。

(3) 开发SGX组件,包括可信组件(方案命名为可信Enclave,TEnclave)和不可信组件(除去可信组件的其他部分,命名为UTBridge)。其中可信组件用于执行密钥生成、敏感信息加解密等安全相关的操作;不可信组件负责与Hook函数以及可信组件的交互。可信组件中的代码和数据在可信内存区域受到SGX可信计算技术保护,而不可信组件的代码和数据位于一般的内存中。

3.2.1 方案的形式描述

重点对安全增强方案中敏感信息的加解密进行描述。

定义安全增强方案SES={KSGX,NSGX,SSGX}。其中:KSGX={key1, key2,…, keyn}为飞地中密钥的有限集;NSGX={nonce1,nonce2,…,noncen}为飞地中随机数的有限集;SSGX={(KSGX,NSGX)}为飞地中密钥和随机数组合的有限复合集。

算法1对明文敏感信息的加密算法(SGX_encrypt)

输入:明文敏感信息Plaintext

输出:密文敏感信息Ciphertext

a) 输入Plaintext;

b)RSGX=Random(SSGX),从SSGX中随机选取一组密钥和随机数的组合;

c) rv=Encrypt(Plaintext,Ciphertext,RSGX),在飞地中加密敏感信息;

d )if rv!=SGX_SUCCESS,转f);

else转e);

e) 输出Ciphertext;

f) 结束。

算法2对密文敏感信息的解密算法(SGX_decrypt)

输入:密文敏感信息Ciphertext

输出:明文敏感信息Plaintext

a) 输入Ciphertext;

b) 循环:fori=1;i≤n;i++

rv=Decrypt(Ciphertext, Plaintext,SSGXi)

if rv!= SGX_SUCCESS continue;

else break;

c) if rv!=SGX_SUCCESS,转e);

else转d);

d ) 输出Plaintext;

e) 结束。

3.2.2 改变原数据库操作函数执行流程

改变函数执行流程的方法有很多,最简单的方式是修改函数的源码,但对于无源代码的遗留信息系统,则可以通过Hook技术更改函数的执行流程。方案使用逆向工程、静态分析等方式分析获取原遗留信息系统的注入点,使用微软Detours库实现Hook函数的注入。

通过对原遗留信息系统进行逆向工程分析,其数据访问层的DLL动态链接库中主要有两个与数据库操作相关的函数,分别是Dboperafunc和Dbselectfunc。经分析验证,其中Dboperafunc主要用于更改数据库,即将人员信息写入数据库;而Dbselectfunc主要用于查询数据库,即查询人员信息从而显示到MFC应用中。

根据Detours库的使用规则,安全增强方案需要定义4个函数实现Hook逻辑,包括2个Trampoline函数和2个Detour函数。定义的Trampoline函数为Real_dbopera和Real_dbselect,分别用于保存Dboperafunc和Dbselectfunc的移除指令和无条件跳转,以及分别用于还原恢复Dboperafunc和Dbselectfunc函数的执行流程。定义的Detour函数为Hook_dbopera和Hook_dbselect,分别用于改变Dboperafunc和Dbselectfunc的执行流程,以便在更改后的执行流程中使用SGX可信计算技术对敏感信息进行加密和解密操作。注意设计的Trampoline和Detour函数的参数列表、类型及函数返回值等均应与原函数相同,否则函数跳转将失败。更改前后的执行流程分别如图3、图4所示。

图3 函数正常的执行流程

图4 hook注入后的函数执行流程

所需函数定义完成后,可以使用DetourAttach拦截目标函数。DetourAttach需要2个参数:目标函数指针地址和Detour函数地址,但目标函数不能直接作为参数传入,而需要传入目标指针。DetourAttach为调用目标函数分配并准备好一个Trampoline函数。Detour运行以后,目标函数和Trampoline会被重写,目标指针被更新,指向Trampoline函数。一旦目标函数被拦截,目标函数的调用会被转到Detour函数。目标函数通过Trampoline被执行的时候,Detour函数将参数复制过来。要想移除拦截,可以调用DetourDetach。与DetourAttach类似,DetourDetach也需要2个参数:目标函数指针地址和Detour函数地址。DetourDetach执行后,目标函数被重写为其原来的状态。Trampoline函数被删除,目标函数指针恢复为原来的目标函数。

在安全增强方案中,因为要拦截的程序没有源代码,所以需要将Trampoline函数Real_dbXXfunc和Detour函数Hook_dbXXfunc封装在HookHrMis.dll中,并在遗留信息系统启动时,使用DetourCreateProcessWithDllEx将HookHrMis.dll注入遗留信息系统进程中。

3.2.3 安全操作与敏感信息的隔离保护

遗留信息系统的数据库操作函数执行流程被更改后,需使新的执行流程调用SGX不可信组件的接口函数,通过接口函数将系统中的明文敏感信息由不可信组件传入可信Enclave安全容器,并在Enclave中对明文敏感信息进行加密处理。

SGX组件由可信组件和不可信组件组成,其中本方案的可信组件命名为TEnclave,不可信组件为除TEnclave以外的部分,命名为UTBridge。可信组件TEnclave与不可信组件UTBridge会进行交互,其交互规则要按照SGX规范编写Enclave定义语言(enclave definition language, EDL)文件[20]。在安全增强方案中,编写TEnclave.edl文件对方案的可信组件与不可信组件进行明确的划分与定义,SGX可以使用该EDL文件自动完成可信组件和不可信组件相关文件的生成,并为可信容器TEnclave创建相关的OCALL和ECALL例程。自动生成的可信组件文件包括TEnclave_t.h、TEnclave_t.c,不可信组件文件包括TEnclave_u.h、TEnclave_u.c。ECALL和OCALL主要完成可信组件TEnclave与不可信组件UTBridge的交互,ECALL是不可信部分调用可信部分的方式,函数的执行将从不可信组件UTBridge转到可信组件TEnclave,而OCALL则是可信部分调用不可信部分的方式,函数执行将从可信组件TEnclave转到不可信组件UTBridge。

可信组件TEnclave和不可信组件UTBridge均被封装为单独的dll,从HookHrMis到TEnclave的函数调用将遵循图5所示流程。

图5 安全增强方案函数调用示意图

3.2.4 敏感信息增强保护示例

下面以对遗留人力资源管理信息系统中的人员薪酬数据进行增强保护为例,说明如何改变原数据库操作函数执行流程,以及如何对安全操作与敏感信息进行隔离保护,其流程如图6所示。

图6 敏感信息增强保护示例流程图

第1阶段为改变函数流程。通过逆向工程、静态分析等手段获取原数据库操作函数,主要包括Dboperafunc和Dbselectfunc,分别设计相应的Trampoline函数和Detour函数。

(1) Trampoline函数,用于保存原数据库操作函数的移除指令和无条件跳转,以便还原执行流和实现原始的函数调用,有Real_dbopera和Real_dbselect。

(2) Detour函数,用于拦截原数据库的操作函数,以实现对人员薪酬数据的加解密,有Hook_dbopera和Hook_dbselect。Hook_dbopera函数用于更改原数据库操作函数Dboperafunc的执行流程,通过分析得知原函数的参数为要执行的SQL语句。通过使用SQL Server数据库管理员账号查看该人力资源管理信息系统数据库的表结构,人员薪酬数据表为WagesInfo,其中的薪酬列名为Wage。分析函数Dboperafunc的参数SQL语句中是否存在表名“WagesInfo”以及是否存在“Insert”或“Update”等词句,若存在这些词句,则需要对该语句进行解析重写,否则应直接调用Real_dbopera还原执行流。

第2阶段为隔离保护安全操作与敏感信息。提取SQL语句中的薪酬Wage字段,调用UTBridge.dll中的封装函数Ew_X,再由Ew_X函数进行ECALL调用进入可信组件TEnclave。

(1) 启动Enclave安全区,使用Enclave前必须启动Enclave并将生成的Enclave ID提供给ECALL例程。这对于其他函数应该是透明的,安全增强方案通过使用一个全局变量保存该ID信息,但这会导致在安全区内一次只能存在一个线程。对于安全应用来说这是一个合理的解决方案,因为较少的线程意味着较小的可信计算基和攻击面。为了解决透明性问题,UTBridge.dll中的函数应首先检查安全区是否已启动,如果Enclave已启动,则直接使用,否则先进行Enclave安全区的创建和启动。通过检查ECALL例程的返回值,除SGX_SUCCESS以外的任何结果都表明函数未成功进入Enclave安全区,并且所请求的功能未成功执行。

(2) 定义可信组件与不可信组件的交互接口。安全增强方案的交互接口通过EDL文件进行定义,以实现对人员薪酬数据的加解密。因为薪酬数据的明文和密文处于Enclave内外不同的地址空间,因此要将其从不可信部分封送到受Enclave保护的内存空间中。SGX可信部分与不可信部分之间的参数传递与传统函数不同,需要明确:① 数据复制方向,对于加密过程,薪酬数据的明文先封送到可信Enclave中,加密完成后将密文返回给不可信部分。对于解密过程,薪酬数据的密文先封送到可信Enclave中,解密完成后将明文返回给不可信部分。SGX为了指明指针数据复制的方向,需要在函数的指针参数前指定方向,方向类型有[in]、[out]、[in, out],含义如表1所列;② 指针引用的数据缓冲区大小,SGX要求对于数组、Char和Wchar_t字符串等类型,如果要复制的数据缓冲区的长度超过一个元素,就必须指定缓冲区中的元素数,否则将仅复制一个元素。安全增强方案需要在传递指针数据前,正确获取要传递的元素个数或数组的长度,并将其作为函数的一个参数。

表1 ECALL和OCALL中的指针方向参数及其含义

(3) 选择加解密函数。SGX的可信内存空间不能依赖第三方库,因此Enclave中的加解密函数只能自己编写或者选择SGX所提供的加解密算法。SGX的密码库中自带了一些常用的加解密方法和HASH函数,方案分别选择了SGX可信加密库函数SGX_aes_ctr_encrypt和SGX_aes_ctr_decrypt进行薪酬数据的加解密操作,二者执行的是CTR(计数器)模式下的AES加解密操作,可支持128位的密钥。

至此,对薪酬数据明文加密完成后,将该密文字段传回Hook_dbopera函数,并重写原SQL语句,利用DetourDetach还原数据库操作函数执行流程,使其执行重写后的SQL语句,将加密后的薪酬数据保存至数据库。

4 验证与分析

4.1 实验环境

实验所选主机为Thinkpad E490笔记本电脑,CPU为支持SGX功能的i7-8565U,内存16 GB。SGX开发环境搭建步骤为:在BIOS中启用主机的SGX功能;安装Windows 10操作系统,版本为1809;安装Intel管理引擎驱动程序,版本为1909.12.0.1236;安装Visual Studio 2017;安装Intel Windows SGX SDK 2.7,SGX PSW 2.7。

4.2 加解密功能验证

在该遗留人力资源管理信息系统中注入HookHrMis.dll,对人员的口令、薪酬数据等敏感信息重新录入后,查看数据库中人员口令表UsersLogin中的口令字段和薪酬表WagesInfo中的薪酬字段已全部为密文,但在应用中可以查看到正确的明文信息。

结果表明,基于SGX的无源码遗留信息系统安全增强方案正确实现了对人员口令和薪酬数据等敏感信息的加解密。恶意的数据库攻击者在没有正确使用遗留人力资源管理信息系统的前提下,即使获取到该数据库,也无法获取其中的敏感信息,实现了对敏感信息的增强保护。

4.3 性能分析

安全增强方案使用SGX可信计算技术,对原遗留信息系统的性能会带来一定的损耗。通过运行不同次数的安全增强方案测试程序,分别测试了在遗留信息系统中注入HookHrMis.dll前后插入人员信息和更新人员信息所耗费的时间,测试结果分别如图7、图8所示。

图7 注入HookHrMis.dll前后插入人员信息所需时间

图8 注入HookHrMis.dll前后更新人员信息所需时间

从测试结果可以看出,在原遗留信息系统中注入HookHrMis.dll后插入人员信息和更新人员信息相比注入前分别带来了3.3%和4.37%的额外性能损耗。

分析性能损耗的原因主要在于Enclave安全容器的创建与销毁、ECALL/OCALL调用过程中的数据传递以及敏感信息在Enclave安全容器中的加密和解密。但在应用的实际运行过程中,可以通过调整Enclave的创建与销毁策略,如在应用的运行期间只创建一次Enclave,并只在应用退出时才销毁该Enclave,这样可以将Enclave创建与销毁所带来的开销降至最低。因此,安全增强方案所带来的额外性能开销在可接受的范围内。

4.4 Enclave内存分析

因为所有Enclave可信内存都在EPC(enclave page cache)内存区域中实例化,但EPC是内存中的共享资源,即系统中所有正在运行的Enclave都必须位于其中。在系统中, EPC的大小可以在BIOS中设定,通常为64 MB或128 MB。由于此限制,应将Enclave的大小调整为适合其实际内存的使用量,并且分配给Enclave的内存不应超过其使用量,同时还应注意在使用完Enclave后及时释放以避免可能的内存泄露。分配给Enclave的内存量是在Enclave配置文件中设置的,默认为每个线程分配256 kB栈空间和1 MB全局堆空间。

可以使用SGX提供的EMMT工具来测量运行安全增强方案的Enclave大小,运行安全增强方案测试程序1、100和1 000次的Enclave大小测量结果如图9所示。

图9 Enclave内存占用

测量结果表明,该安全增强方案在执行期间Enclave安全区共使用了2 kB的栈空间和4 kB的堆空间,没有发生内存泄露问题。

5 结论

首先对相关背景知识进行研究,Intel的硬件可信计算技术SGX在越来越多的安全工程领域得到应用,然后针对当前Windows遗留信息系统中的敏感信息保护问题,提出了基于SGX技术的安全增强方案,方案不需要对原遗留信息系统进行任何修改,与数据库系统弱相关。并以某无源代码无文档的遗留人力资源管理信息系统为例设计实现了该安全增强方案,对其中的隐私信息实现了安全保护。实测结果表明基于SGX技术的安全增强方案所带来的额外性能开销在可接受的范围,并验证了方案的正确性。本文主要针对Windows的无源代码无文档遗留信息系统进行增强保护,下一步将考虑Linux的无源代码无文档的遗留信息系统安全增强及Web信息系统安全增强等。

猜你喜欢
遗留源代码组件
遗留群柱中关键柱判别方法与软件
Kistler全新的Kitimer2.0系统组件:使安全气囊和安全带测试更加可靠和高效
创建Vue组件npm包实战分析
基于TXL的源代码插桩技术研究
智能机械臂
舰载雷达TR组件冲击计算方法分析
许林涛作品
保护好自己的“源代码”
解密别克安全“源代码”
静寂的故宫博物馆