一种面向远程计算的控制流隐藏方法与流程

文档序号:12669716阅读:345来源:国知局
一种面向远程计算的控制流隐藏方法与流程

本发明属于计算机技术技术领域,涉及一种程序控制流隐藏的方法。



背景技术:

目前,公有云服务得到了广泛应用,用户可将程序上传至公有云上,由公有云完成计算。然而,由于公有云的不透明性,程序运行的安全难以得到保障。外包程序的算法保密性是云安全中一个重要问题。当用户将程序上传至公有云上,攻击者可通过静态分析和动态分析逆向分析出程序的源代码,从而还原程序算法。如果用户程序具有创新性,这一攻击将侵犯用户的程序版权。即使用户程序不具有创新性,逆向分析程序将泄漏程序逻辑,黑客将通过泄漏的程序逻辑寻找程序弱点(vulnerability),为进一步攻击程序做好准备。因此需要一种程序运行时保护机制,以保证程序远程计算时的程序逻辑保密性。程序控制流是程序逻辑的重要部分,保护程序控制流保密性将大大提高程序逻辑机密性。本发明针对程序控制流,提出一种保密方法。

目前主流的程序的算法保护技术称为程序混淆技术。大多数程序混淆技术假设程序在一个完全不可信的环境下运行。在这种环境下对程序进行变换并隐藏程序是非常困难的。Barak[1]等人在论文中已证明不存在一种通用的混淆方法可以混淆所有的程序。因此目前研究者的方法主要集中于对程序的部分混淆,其中一部分人研究对程序的控制流进行混淆。很多方案都是将程序分枝语句的条件进行数学转换,包括将条件的左右两端进行加密(Sharif[2]等人),对密文进行匹配,该方法仅适用于相等条件;将条件语句转变成未知数学难题(Wang[3]等人),等。无论如何变换,此类方法均将分枝语句条件展现在攻击者面前,理论上攻击者仍可通过静态分析分析出程序逻辑。另一方面,攻击者也可通过动态分析跟踪条件与分支,进一步解析出程序逻辑。

与本发明类似的思路包括将程序分解成两个或多个程序,通过多个程序协同工作完成程序计算。例如,Ge[4]的文章将程序控制跳转分离到另一个进程中,程序指令的跳转地址通过查询另一进程的跳转表获取。该方法只能满足静态跳转,无法满足动态分支判定。同时,另一个进程的跳转表跟主程序在同一个主机上,事实上也暴露给了黑客。Wang[5]的文章将公有云上的程序分支判定部分分离到另一个私有云上,程序跳转通过跨云的远程程序调用实现。由于跨云函数调用的存在,该方法具有较高的开销。

[1]Barak Boaz,Goldreich Oded,Impagliazzo Russell,Rudich Steven,Sahai Amit,Vadhan Salil,et al.On the(im)possibility of obfuscating programs.J ACM May 2012;59(2).Article 6.

[2]Sharif Monirul,Lanzi Andrea,Giffin Jonathon,Lee Wenke.Impeding malware analysis using conditional code obfuscation.In:Proceedings of the 15th annual network and Distributed System Security Symposium.NDSS;2008.

[3]Wang Zhi,Ming Jiang,Jia Chunfu,Gao Debin.Linear obfuscation to combat symbolic execution.In:Proceedings of the 16th European Symposium on Research in Computer Security(ESORICS 2011).Berlin Heidelberg:Springer;2011.p.210e26.

[4]Ge Jun,Chaudhuri Soma,Tyagi Akhilesh.Control flow based obfuscation.In:Proceedings of the 5th ACM workshop on Digital Rights Management.ACM;2005.p.83e92.

[5]Yongzhi Wang,Jinpeng Wei,Toward protecting control flow confidentiality in cloud-based computation,Computers&Security,Volume 52,July 2015,Pages 106-127,ISSN 0167-4048



技术实现要素:

本发明的目的是提供一种程序分枝语句条件的机密性保护方法,解决了现有技术中存在的问题。

一种面向远程计算的控制流隐藏方法,包括以下步骤:

步骤1,获取用户程序,并将用户程序转换为三地址码程序;

所述三地址码程序包括I个语句,其中任意一个语句为si,i=1,2,…I,I为大于等于1的自然数,语句si由J个分支语句xj和M个非分支语句ym组成,j=1,2,…J,m=1,2,…M,J<I,M<I;其中,分支语句xj为:if(a OP b)goto L;a、b为分支语句xj的变量,OP为比较操作;L为如果(a OP b)结果为真则跳转到的语句,L∈{si|i=1,2,...I};

分支语句xj的编号为lj;非分支语句ym的编号为lm

步骤2,获取三地址码程序中语句si可访问的变量和语句si使用到的变量,将语句si可访问的变量组成变量集合Vi,将语句si使用到的变量组成变量集合Ui

所述语句si可访问的变量为,在语句si之前的语句及语句si中使用并属于语句si作用域的变量;

所述语句si使用到的变量为,在语句si中出现的变量;

步骤3,构建公开程序,包括:每个语句si均经过步骤31和步骤32的处理;

步骤31,将分支语句xj替换为:if(QuerySGX(Lj,lj))goto L,构造分支语句条件列表组Tj={ja,jb,OP};

Lj为将分支语句xj的参数集合Pj中的元素随机排列形成的参数列表;

参数集合Pj为:Pj=Uj∪SUBSET(Vj-Uj);

其中,Vj为语句分支语句xj可访问的变量组成的变量集合;Uj为分支语句xj使用到的变量组成的变量集合;SUBSET(Vj-Uj)为Vj-Uj的任意子集;

ja为a在Lj中的位置,jb为b在Lj中的位置;ja为大于等于0的整数,jb为大于等于0的整数;

步骤32,在非分支语句ym前插入if(QuerySGX(Lm,lm))goto构造非分支语句条件列表组Tm={false};

其中,Lm为将非分支语句ym的参数集合Pm中的元素随机排列形成的参数列表;为非ym的语句;

参数集合Pm为:Pm=Um∪SUBSET(Vm-Um);

其中,Vm为语句非分支语句ym可访问的变量组成的变量集合;Um为分支语句xm使用到的变量组成的变量集合;SUBSET(Vm-Um)为Vm-Um的任意子集;

步骤4,构建条件列表组集合文件,包括:

将所有分支语句的条件列表组和非分支语句的条件列表组组成条件列表组集合文件,所述条件列表组集合文件中包括Tj和lj的映射列表,以及Tm和lm的映射列表,即lj与Tj、lm与Tm相互唯一映射;

将该条件列表组集合文件用对称加密方法进行加密,加密密钥由用户管理;

步骤5,构建可信程序,包括:

读入所述的条件列表组集合文件,接着对条件列表组集合文件解密后,获得映射列表;

构建QuerySGX函数,所述QuerySGX函数的功能包括:调用QuerySGX(Lk,lk),k∈j∪m;

通过lk在获得的映射列表中查找对应的Tk,当Tk={False}时,则返回false;

通过lk在获得的映射列表中查找对应的Tk,当Tk={ja,jb,OP}时,则以ja,jb为索引找到Lk中对应的变量a和b,结合OP,得到三地址码程序中分支语句条件(a OP b),并返回(a OP b)的布尔值;

步骤6,拷贝可信程序、条件列表组集合文件及公开程序至公有云,再将可信程序加载至SGX的enclave中;

步骤7,在公有云中运行程序,包括:

执行公开程序,当遇到QuerySGX函数则调用可信程序中的QuerySGX函数。

进一步地,步骤5中所述的对条件列表组集合文件解密是指:

通过SGX远程验证协议检查可信程序是否完整,若可信程序完整则将用户管理的密钥发送至可信程序;使用密钥对条件列表组集合文件进行解密。

与现有技术相比,本发明具有以下技术效果:

(1)本发明通过利用Intel第六代处理器的安全执行环境的SGX功能,将程序分枝语句的条件判定放在具有硬件保护功能的可信区域进行,从而实现了程序分枝语句条件的真正隐藏,同时引起较小的程序运行开销;

(2)本发明可有效抵御在公有云上的基于静态分析和动态分析的逆向工程攻击。对于每个分支语句,攻击者通过动态分析可观测出传入参数和返回结果,然而,传入参数众多,攻击者很难判定具体哪个参数参与了分枝条件的判定,从而很难还原出原始判定逻辑。对于伪分支语句,虽然该分支语句只返回相同的值,然而由于传入的参数众多,黑客很难区分该情况属于条件未触发还是属于伪分支语句。因此,本发明可以有效实现程序控制流的隐藏。

(3)从效率角度来说,本发明使得控制流隐藏在公有云内部,从而避免了频繁的跨云或跨主机函数调用,从而降低了运行开销。

附图说明

图1为本发明的总体部署图;

图2(a)为实施例中未实施本方法前的程序;图2(b)为实施例中实施本方法后的程序。

具体实施方式

下面通过附图和实施例对本发明作进一步的说明。

步骤1,获取用户程序,并将用户程序转换为三地址码程序;

所述三地址码程序包括I个语句,其中任意一个语句为si,i=1,2,…I,I为大于等于1的自然数,语句si由J个分支语句xj和M个非分支语句ym组成,j=1,2,…J,m=1,2,…M,J<I,M<I;其中,分支语句xj为:if(a OP b)goto L;a、b为分支语句xj的变量,OP为比较操作,为六种操作(>,<,>=,<=,==,!=)中的一种;L为如果(a OP b)结果为真则跳转到的语句,L∈{si|i=1,2,...I};

分支语句xj的唯一编号为lj;非分支语句ym的编号为lj

本实施例中的语句si是指:程序中的任意一条语句,例如图2(a)中的int size;int low=0。

本实施例中的分支语句xj是指:程序中的选择语句,例如图2中用户程序的if(data[middle]==key){return true;};其中,分支语句xj的变量a和b分别为:data[middle]和key;OP为==操作;L为return true语句;该分支语句的编号lj为11。

步骤2,对三地址码程序进行静态分析,获取三地址码程序中语句si可访问的变量和语句si使用到的变量,将语句si可访问的变量组成变量集合Vi,将语句si使用到的变量组成变量集合Ui;显然语句si可访问但未使用的变量集合为Vi-Ui

所述语句si可访问的变量为,在语句si之前的语句及语句si中使用并属于语句si作用域的变量;

所述语句si使用到的变量为,在语句si中出现的变量;

如图2(a)所示,例如语句si为:int low=0;则该语句可访问的变量为data、size和low;该语句使用到的变量为:low。

若语句si为分支语句if(data[middle]==key){return true;};则该语句可访问的变量为data、size、low、high、middle、data[middle]、data[low]、data[high]、key;该语句使用到的变量为data[middle]、key;

步骤3,构建公共程序,包括:每个语句si均经过步骤31和步骤32的处理;

1)对于分支语句xj,即if(a OP b)goto L,根据步骤2的定义,可知Uj={a,b}。将分支语句xj替换为:if(QuerySGX(Lj,lj))goto L,构造分支语句条件列表组Tj={ja,jb,OP};Lj为将分支语句xj的参数集合Pj中的元素随机排列形成的参数列表;

参数集合Pj为:Pj=Uj∪SUBSET(Vj-Uj);

其中,Vj为语句分支语句xj可访问的变量组成的变量集合;Uj为分支语句xj使用到的变量组成的变量集合;SUBSET(Vj-Uj)为Vj-Uj的任意子集;

ja为a在Lj中的位置,jb为b在Lj中的位置;ja为大于等于1的自然数,jb为大于等于1的自然数;

QuerySGX函数将在SGX的enclave中执行。

图2(b)显示了对二分查找代码的转换结果。如图2(b)所示,转换后的程序中,原有分支语句都被替换成QuerySGX函数调用(见行9,11,14,17),同行注释中显示了对应的Tj分支语句条件列表组的内容。

例如,图2(a)中的行11的分支语句为:if(data[middle]==key){return true;};该分支语句的Vj为(data、size、low、high、middle、data[middle]、data[low]、data[high]、key),Uj为(data[middle]、key),则Vj-Uj为(data、size、low、high、middle),Pj为(key,high,low,middle,data[low],data[high],data[middle]),Lj为(key,high,low,middle,data[low],data[high],data[middle]);如图2(b)替换该分支语句为:if(QuerySGX(key,high,low,middle,data[low],data[high],data[middle]));由于分支语句变量data[middle]和key的编号分别为6和0,OP为==,所以Tj为{6,0,==}。

2)在非分支语句ym前插入if(QuerySGX(Lm,lm))goto构造条件列表组Tm={false};

其中,Lm为将非分支语句ym的参数集合Pm中的元素随机排列形成的参数列表;为非ym的语句;

参数集合Pm为:Pm=Um∪SUBSET(Vm-Um);

其中,Vm为语句非分支语句ym可访问的变量组成的变量集合;Um为分支语句xm使用到的变量组成的变量集合;SUBSET(Vm-Um)为Vm-Um的任意子集;

如图2(b)所示,行9.1为插入在行10前面的非分支语句;行14.1和14.2为插入在行15前面的非分支语句。每行后面的注释显示了Tm的内容。需要说明的是,对于一条非分支语句,可随机插入若干伪分支语句,(如行14.1,14.2所示)。

例如,对于图2(a)中的行10的非分支语句:int middle=(low+high)/2;该非分支语句的Vm为(low,size,high,middle,key),Um为(middle,low,high),则Pm为(key,high,low,size),Lm为(key,high,low,size);如图2(b)在行10的非分支语句前插入的语句为:if(QuerySGX(key,high,low,size))goto line 14;Tm={false}。

步骤4,构建条件列表组集合文件,包括:

将所有分支语句的条件列表组和非分支语句的条件列表组组成条件列表组集合文件SETTs,所述条件列表组集合文件中包括Tj和lj的映射列表,以及Tm和lm的映射列表,即lj与Tj、lm与Tm相互唯一映射;

将该条件列表组集合文件用对称密钥sk进行对称加密,生成文件Esk(SETTs),加密密钥sk由用户管理;

步骤5,构建可信程序,包括:

读入所述的条件列表组集合文件,接着对条件列表组集合文件解密后,获得映射列表;

所述的对条件列表组集合文件解密是指:

通过SGX远程验证协议检查可信程序是否完整,若可信程序完整则将用户管理的密钥发送至可信程序;使用密钥对条件列表组集合文件进行解密。

检查可信程序是否完整的过程为SGX标准过程,详情参见SGX开发手册。

构建QuerySGX函数,所述QuerySGX函数的功能包括:对于函数调用QuerySGX(Lk,lk),k∈j∪m;

通过lk在获得的映射列表中查找对应的Tk,当Tk={False}时,则返回false;即执行当前语句;

通过lk在获得的映射列表中查找对应的Tk,当Tk={ja,jb,OP}时,则以ja,jb为索引找到Lk中对应的变量a和b,结合OP,得到三地址码程序中分支语句条件(a OP b),并返回(a OP b)的布尔值;布尔值为true或false,当布尔值为true时,跳转到语句L;当布尔值为false时,执行当前语句;

步骤6,拷贝可信程序、条件列表组集合文件及公开程序至公有云,创建SGX的enclave,再将可信程序加载至该enclave中;

步骤7,在公有云中运行程序,包括:

执行公开程序时,当遇到QuerySGX函数则调用可信程序中的QuerySGX函数。

本实施例选用的是Intel第六代处理器的安全执行环境的SGX功能,将程序分枝语句的条件判定放在具有硬件保护功能的可信区域进行,从而实现了程序分枝语句条件的真正隐藏。

Intel第六代处理器的安全执行环境的SGX功能详细技术细节参见:

[6]Intel software guard extensions developer guide.https://download.01.org/intel-sgx/linux-1.6/docs/Intel_SGX_Devel oper_Guide.pdf

[7]Intel software guard extensions SDK for Linux OS Developer reference.https://01.org/intel-software-guard-extensions/documentation/int el-sgx-sdk-developer-reference

[8]Costan,Victor,and Srinivas Devadas.Intel sgx explained.Cryptology ePrint Archive,Report 2016/086,2016.https://eprint.iacr.org/2016/086.

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1