CN102681838B - 由虚拟机执行的中间编程代码的安全化的方法、计算机程序和装置 - Google Patents
由虚拟机执行的中间编程代码的安全化的方法、计算机程序和装置 Download PDFInfo
- Publication number
- CN102681838B CN102681838B CN201110463290.XA CN201110463290A CN102681838B CN 102681838 B CN102681838 B CN 102681838B CN 201110463290 A CN201110463290 A CN 201110463290A CN 102681838 B CN102681838 B CN 102681838B
- Authority
- CN
- China
- Prior art keywords
- dummy order
- value
- dummy
- order
- virtual machine
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/53—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/70—Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer
- G06F21/71—Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure computing or processing of information
- G06F21/77—Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure computing or processing of information in smart cards
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/70—Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer
- G06F21/71—Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure computing or processing of information
- G06F21/75—Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure computing or processing of information by inhibiting the analysis of circuitry or operation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Abstract
本发明尤其旨在由虚拟机执行的中间编程代码的安全化。从所述中间编程代码接收(200)多个伪指令后,对所述多个伪指令进行转换(230,235),所述转换包括插入至少一个伪指令的步骤,所述至少一个伪指令与所述多个伪指令中的至少一个伪指令的执行的控制函数相关。下一步骤旨在生成伪代码,所生成的伪代码包括被转换的所述多个伪指令。
Description
技术领域
本发明涉及以中间编程语言编码的软件应用的执行,更特别地,本发明涉及用于由虚拟机执行的中间编程代码的安全化的方法、计算机程序和装置。
背景技术
由于可用来执行软件应用的不同的硬件配置,因而经常使用一种称为中间编程语言的特别的编程语言。它允许开发者独立于应在其上执行应用的硬件体系结构,借助高级编程语言来编写这些应用。对由开发者生成的符合这些高级语言的文件进行编译(独立于特定的硬件平台),以产生基于中间编程语言的应用文件。因而,以虚拟机的名称已知的专用于特定硬件平台的特定软件层,允许基于使用中间编程语言的应用文件执行这些应用。
举例来说,一个用Java(Java是商标)编程语言编写的应用可被编译成Java伪代码(英文术语称为bytecode(字节码)),也就是以一种由Java虚拟机在具有不同硬件特征的平台上可执行的中间编程语言编译。Java虚拟机对于每个硬件平台是特定的,而使用中间编程语言的应用的代码对于这些不同的平台是共同的。
但存在适于执行应用的硬件平台类型的多种类型的虚拟机,而虚拟机应该符合给定的规格以允许执行用中间编程语言编码的应用程序。一般地,这些虚拟机以其较完全或较不完全的指令集区分。
因此,例如,存在一些以Java Card的名称已知的用于诸如微电路卡的硬件平台的特殊的Java虚拟机。
图1示意地说明用于生成可在微电路卡用的虚拟机上执行的文件的方法100的步骤。这里针指的应用是一种Java类型应用。
如图所示,用Java语言编写的、也就是以高级语言编写的源文件105在编译器110中编译,以便产生以名称Class类型文件已知的中间编程语言文件115。这些文件符合虚拟机标准。因而这些文件115在转换器120中进行转换,以使这些文件符合特定的虚拟机、这里是Java Card。标号125的转换文件在这里是Cap类型。由转换器120进行的转换旨在简化中间编程语言的指令,以便文件115可以由简化的虚拟机执行。这样的转换尤其旨在消除某些类型的变量,特别是booléen(布尔)类型的变量。
换句话说,Java格式的源代码指令文件这里借助Java编译器被编译为Class格式的伪指令文件。这些Class文件是可由许多Java虚拟机执行的,但不能由没有包含整套Java指令集的Java Card虚拟机执行。因此,这些Class文件利用Java Card转换器进行转换,以便获得可由Java Card虚拟机执行的Cap格式文件。
为执行转换或未转换的中间编程语言编写的应用,虚拟机配备专门的指令集和执行堆栈。但是,尽管虚拟机对应用的执行具有一定安全级别,但由虚拟机、特别是Java Card执行的Java应用易受攻击,特别是错误注入攻击。这种类型的攻击在于:当执行应用时注入错误以改变计算所涉及的值或迫使执行该应用的某些例行程序或分支指令。
为防备这种类型的攻击,某些应用的代码是冗余的以在其执行过程中进行检查。尽管这样的解决方案可以提高应用执行的安全性,但是它要求大量的资源。为弥补这个缺点,专利申请US 2009/0165149提出一种在设有用于解释中间代码的执行虚拟机的便携式数字设备上执行以中间编程代码编译的应用的方法,其包括安全执行模式的应用步骤,在该模式中通过虚拟机对中间代码的解释包括下列步骤:
-对于被操作以执行代码定义的逻辑和/或算术运算的每个代码数据,通过预定函数生成与所述代码数据相关的检查数据;和
-与所述运算的执行相并行地执行检查操作,所述检查操作通过所述预定函数与代码定义的所述运算相关并且作用于所述检查数据。
但是,这样的解决方案需要对所用的虚拟机作出重大改变。
发明内容
本发明允许解决至少一个前述问题。
因此,本发明旨在提出一种用于计算机的由虚拟机执行的中间编程代码的安全化的方法,该方法包括下列步骤:
-从所述中间编程代码接收多个伪指令;
-转换所述多个伪指令,所述转换包括插入至少一个伪指令的插入步骤,所述至少一个伪指令与所述多个伪指令中的至少一个伪指令的执行的控制函数相关;和
-生成伪代码,所生成的所述伪代码包括被转换的所述多个伪指令。
因此,按照本发明的方法允许使伪代码的执行安全,而不需要改变相应的源代码。另外,该方法可以在中间编程代码的转换步骤中实施,以便其实现对于用户是透明的。
按照一个特别的实施方式,所述插入步骤包括插入代表用于所述虚拟机的命令的、例如Java定制组件形式的伪指令的步骤。因此,生成的伪代码能以安全的方式由适合的虚拟机执行,但也是在标准的虚拟机中可执行的。例如,用于所述虚拟机的所述命令旨在检验所述虚拟机的执行堆栈,以便验证所述虚拟机的所述执行堆栈是空的。通过检验该执行堆栈的状态,可以验证一个或多个功能已被良好执行。
仍按照一个特定的实施方式,所述转换步骤对于每个所接收的伪指令包括下列步骤:
-若所述伪指令针对至少一第一预定值的预定处理,则删除所述伪指令并插入针对用于至少一第二预定值的所述预定处理的伪指令,所述至少一第二预定值不同于所述至少一第一预定值;和
-若所述伪指令针对所述至少一第一预定值与另一值的比较,则删除所述伪指令并插入针对所述至少一第二预定值与所述另一值比较的伪指令。
于是,按照本发明的方法允许用一些较难理解的任意值改变预定值、特别是可容易被识别的布尔值。
仍按照一个特定的实施方式,针对至少一第一预定值的预定处理的所述伪指令旨在对局部变量进行初始化或赋值,所述局部变量的值在初始化或赋值步骤执行之后等于所述第一预定值。
该方法优选还包括定义或计算所述至少一第二预定值的步骤。
该方法有利地还包括分析所述多个伪指令的至少一组的分析步骤,作为对所述分析步骤的响应而进行删除针对至少一第一预定值的预定处理的所述伪指令的步骤和插入针对用于至少一第二预定值的所述预定处理的所述伪指令的步骤。因此,可识别变量类型和可只根据其类型改变这些变量的处理指令。特别是,可只改变处理布尔类型变量的函数。
按照一个特定的实施方式,所述方法还包括代码编译的预先步骤,所述代码编译的预先步骤的结果包括所述多个伪指令。
本发明还旨在提出:一种计算机程序,其包括当所述计算机程序在计算机上执行时适于实施前述方法的每个步骤的指令;一种装置,其包括适于实施前述方法的每个步骤的部件;以及一种微电路卡,它包括通过上述方法获得的伪指令。
该计算机程序、该装置和该微电路卡带来的优点与上述优点相类似。
附图说明
将从下文参照附图、以非限制性例子进行的详细描述中显示出本发明的其他的优点、目标和特征,附图中:
-图1示意性说明用于生成能由微电路卡用的虚拟机执行的文件的方法的步骤;
-图2示意性说明按照本发明转换出自源代码编译的伪指令的算法实例的步骤;
-图3说明按照本发明对出自源代码编译的伪指令进行分析以确定要进行的转换的步骤的实例;和
-图4说明适于实现本发明的某些步骤的硬件结构实例。
具体实施方式
本发明一般旨在当转换时改变以中间编程语言编写的应用的代码的至少一部分,以插入允许提高该应用的执行安全性的至少一个伪指令。
这样的插入可以在转换本身期间或者在该转换之前或之后的一步骤期间实现。因此,按照本发明,允许提高应用的执行安全性的至少一个伪指令,可被插入到该应用的中间代码文件(其使用中间编程语言)、例如Class类型文件中。可选地或以补充的方式,允许提高应用的执行安全性的至少一个伪指令可被插入到该应用的转换的中间代码文件例如Cap类型文件中。
首先观察到,可赋予给数据或变量的布尔(booléen)类型在Java源文件中是特别的,因为关于这种类型的信息在编译阶段期间“遗失”。事实上,布尔类型的信息在Java文件中等于真或假。但在编译阶段之后,这些值被为零或壹的整数值代替。
因此,例如,Java源程序表达式“boolean myBoolean=faux(假)”在它的编译过程中被表达式“iconst_0”和下一表达式“istore_1”代替,按照表达式“iconst_0”,零值被放置在虚拟机的执行堆栈上,而下一表达式“istore_1”用于把虚拟机执行堆栈的上一值存入第一局部变量中。局部变量这里对应于非易失存储器的寄存器的一域(champ)。同样,Java源程序表达式“boolean myResult=vrai(真)”在它的编译过程中被表达式“iconst_1”和下一个表达式“istore_2”代替,根据表达式“iconst_1”,数值壹被放置在虚拟机的执行堆栈上,而下一个表达式“istore_2”用于把虚拟机执行堆栈的上一值存入另一局部变量中。因此,变量myBoolean和myResult的布尔特性消失,而替以整数值零和壹。
Java源文件中的布尔类型典型地用于进行条件测试,条件测试一般借助if函数实现。在编译过程中,这些函数被特定的伪指令或字节码代替,特定的伪指令或字节码将执行堆栈上存在的值与零值进行比较。因此,例如,伪指令ifeq将执行堆栈上存在的元素与零值进行比较和向源自该比较的代码进行跳变(saut)。
附录中给出的表1表示其源代码是用Java语言编写的函数的编译的简化实例。第一列表示该函数的Java指令,这些指令能编写在Java源文件中,而第二列表示相应的伪指令,也就是对应Class类型的文件的内容,第三列代表关于伪指令的索引(index)。
如所说明的,第一Java指令旨在把变量myBoolean初始化为假值。该指令的编译结果包括伪指令“icone_0”和用以在数值零被放到执行堆栈上之后将其储存在第一局部变量中的“istore_1”。该第一指令后接着用来把变量myResult初始化为真值的第二指令。又一次,该指令的编译结果包括伪指令“iconst_1”和用于在数值壹已被放在执行堆栈上后将其存入第二局部变量中的“istore_2”。
这里,这些叙述Java指令后跟随着一个在于测试变量myBoolean的Java测试指令。该Java测试指令的编译结果引出伪指令“iload_1”和“ifeq9”,它们旨在把第一局部变量的值放在执行堆栈上,和若该执行堆栈的值等于壹则进行到具有索引9的伪指令的跳变,也就是说,若测试结果为假,则跳变至待执行的第一伪指令上。
如果没有跳变,下一Java指令就在于把真值赋予变量myResult。该表达式的编译结果引出伪指令“iconst_1”和用于在数值壹已被放在执行堆栈上之后将其存入第二局部变量中的“istore_2”。
由于当前面测试结果为真时没有要执行的其他指令,因而下一步骤在于跳变至具有索引11的伪指令上,也就是说跳变至当前面测试结果为假时要执行的伪指令后的第一指令。
当前面测试结果为假时,如果没有跳变,下一Java指令在于把假值赋予变量myResult。该表达式的编译结果引出伪指令“iconst_0”和用于在零值已放在执行堆栈上之后将其存入第二局部变量中的“istore_2”。
因此,如该例中所说明的,对带真值的布尔类型变量的测试被编译成对带零的变量的值的测试。在Java指令的编译时,与真值或假值的比较测试消失。
因而,可改变Java虚拟机执行堆栈上的值的通过错误注入的攻击技术,可被用于改变测试结果并因此引起全套Java代码的执行或引起本来不应被执行的某些部分的执行。
在这里观察到,如果在上述实例中对布尔值进行测试,则当测试针对具有数值零和壹的整数时,错误式攻击的危险是等同的。
为了使需要对中间编程语言代码(伪代码)进行转换的虚拟机所执行的Java应用中的测试安全化,本发明按照第一实施方式包括改变用来进行测试的值以便它们不能再被找到和因而不能容易被改变的步骤。换句话说,这里,本发明旨在通过把特殊内部值、尤其是不同于零和壹的值赋予给真值和假值、零和壹或者Java源文件的可容易识别的所有其他值,来使布尔类型变量安全化。
这个改变有利地实施在伪指令的转换步骤过程中,以便充实虚拟机例如机载Java Card虚拟机的指令集,本发明的实施不需要改变Java源代码。用来执行它们的虚拟机被改变,以提供如下文所描述的新功能。
附录中给出的表2表示在表1中示出的编译伪代码的转换的简化实例。第一列表示可出现在Java Class类型文件中的Java伪指令,而第二列表示改变之后的对应伪指令,第三列表示关于这些伪指令的索引。
一般地,在此明白的是,该转换旨在把有关整数类型数据的伪指令转换为有关short(短整数)类型数据的伪指令。因此,例如,旨在把放在执行堆栈上的值以整数形式存储到第一局部变量中的伪指令istore_1被伪指令sstore_1代替,伪指令sstore_1旨在把执行堆栈上的值以short形式存储到第一局部变量中。同样,旨在把以整数形式存储在第一局部变量中的值放在执行堆栈上的伪指令iload_1被伪指令sload_1代替,伪指令sload_1旨在把以short形式存储在第一局部变量中的值放在执行堆栈上。
自然地,也可以使用其它转换。
如表2上说明的,伪指令iconst_0被删除并插入伪指令sconst_false以代替它。伪指令sconst_false旨在把第一预定值放在执行堆栈上。该值表示状态假,这里这涉及一个short类型的数。该值可以是常量和适于所述应用,或者该值可以是随机值,随机值例如在所述应用起动时确定。可选择地,该值可以是适于虚拟机的常量,或者是随机值,随机值例如在虚拟机起动时确定。同样,伪指令iconst_1被删除而为代替它插入伪指令sconst_true。伪指令sconst_true旨在把第二预定值放在执行堆栈上。该值表示状态真。又一次,在这里这涉及一个short类型的数,它可以是适合该应用的常量、在例如该应用起动时确定的随机值、或是与虚拟机相关的值。
另外,伪指令ifeq被删除并插入伪指令ifBeq以代替它。伪指令ifBeq旨在把在执行堆栈上存在的值与表示状态真的第二预定值进行比较。在表2表示的实例中,如果在执行堆栈上的值不等于第二预定值(代表状态真的预定值),则该测试没有得到证实并且要执行的下一伪指令是具有索引9的伪指令。在相反的情况下,跟在比较伪指令后的伪指令被执行。
可选择地,位于执行堆栈上的值可以与布尔状态的两个值进行比较。因此,伪指令ifBeq把存在于执行堆栈上的值与代表状态真的第二预定值加以比较。若测试被证实,则要执行的下一伪指令是其索引跟随在伪指令ifBeq的索引(这里是6)后的伪指令。若测试未被证实,则伪指令ifBeq把执行堆栈上存在的值与代表状态假的第一预定值比较。若该测试得到证实,则要执行的下一伪指令是其索引被指定(在这里是9)的伪指令。若测试未被证实,则执行异常例行程序。这尤其可以涉及一种对抗手段,其例如在于使微控制器不起作用(例如以已知的方式,通过在非易失存储器中写入一个在以后执行时由控制器验证的值)。
伪指令sconst_false和sconst_true对应于不同于零和壹的内部值。因此,难以为正确地执行比较而改变这些值。换句话说,对于通过注入错误的攻击,难以改变执行堆栈上的变量的值,因为这些值不再是零或壹,而是内部值。
附录中示出的表3表示按照参照表2给出的实例转换伪代码用的改变表的一个实例。第一列在这里表示由编译步骤所获得的伪指令,而第二列包括在改变之后相应的伪指令。
图2示意性说明按照本发明转换出自源代码编译的伪指令用的算法实例的步骤。
第一步骤(步骤200)在此在于接收要转换的伪指令。要转换的伪指令例如来自由Java源文件105的编译所获得的文件115。
在下一步骤中,伪指令索引i初始化为零(步骤205)。因此进行测试,以确定是否存在与索引i对应的伪指令(步骤210)。
若存在对应于该索引i的伪指令,则进行第二测试,以确定是否对应该索引i的伪指令是易于使布尔值介入的预定指令(步骤215)。这样的伪指令尤其是如下的指令,
-iconst_0和sconst_0,它们旨在把(分别以整数和short形式编码的)数值零放置在执行堆栈上;
-iconst_1和sconst_1,它们旨在把(分别以整数和short形式编码的)数值壹放置在执行堆栈上;和
-ifeq,其旨在验证是否执行堆栈上存在的值对应状态真或假,也就是说,是否该值等于壹或不等于壹。
在肯定的情况下,测试进行,以确定这些布尔状态是否已被定义(步骤220)。
若这些布尔状态未被定义,则将它们定义(步骤225)。这样的定义可以尤其在于常量的定义,也就是把一个预定值赋予给一个具有预定名称的常量(例如,false=35和true=65)。这样的定义还可以在于借助标准函数(例如,false=random(127)和true=random(127),其中random(n)是返回介于0到n之间的随机数的函数)计算值,尤其是计算随机值。
如前面指出的,布尔状态可以由所述虚拟机定义。在这种情况下,步骤220和225不是必需的。
在布尔状态被定义之后、当布尔状态已被预先定义时或者当布尔状态由所述虚拟机确定时,对应索引i的伪指令被删除并插入新的伪指令以代替它(步骤230)。这个步骤在于:例如在转换表中,识别一伪指令,该伪指令针对的处理类似于对应索引i的伪指令所执行的处理,其是关于预定的布尔状态、也就是关于不同于零和壹的值进行的。
作为说明,伪指令iconst_0和sconst_0可被删除,并且可插入伪指令sconst_false以代替它们。如前面指出的,伪指令sconst_false旨在把变量false的值(在这里以short形式编码)放在执行堆栈上。以类似的方式,伪指令iconst_1和sconst_1可以被删除,并且可插入伪指令sconst_true以代替它们。伪指令sconst_true旨在把变量true的值(在这里以short形式编码)放在执行堆栈上。同样地,伪指令ifeq可以被删除,并可插入伪指令ifBeq以代替它,伪指令ifBeq旨在验证是否执行堆栈上存在的值对应或不对应于状态真,也就是说,是否该值等于或不等于变量true的值。
若对应索引i的伪指令不是使布尔值介入的预定指令,则该对应索引i的伪指令以标准的方式进行转换(步骤235),例如借助转换表进行转换。
在对应于索引i的伪指令被转换(步骤230或235)之后,索引i加一(步骤240),算法返回步骤210,在步骤210进行测试,以确定是否存在对应索引i的待转换的伪指令。
若不存在对应于索引i的伪指令(步骤210),则所有伪指令已被转换。所得的文件,这里是Cap类型的文件125,可以在包括适当虚拟机、这里也就是Java Card虚拟机的装置尤其是微电路卡中使用。
如前面指出的,用来执行应用以实现本发明的虚拟机的指令集已被改变。添加了布尔状态比较类型函数,例如,先前描述的ifBeq函数。这样的函数允许把在执行堆栈上存在的值与对应于布尔状态真或假的预定值进行比较。布尔状态的值可以由所执行的应用或由虚拟机确定。以有利的方式,由虚拟机在其起动时将一状态赋予给每个布尔状态,以避免如果这些状态未被所述应用定义而发生错误。如前面指出的,布尔状态的值可以是预定的常量,或者可以是当虚拟机起动时由虚拟机确定的或当应用被执行时确定的随机值。这些状态是按照(所述应用所使用的)预定名称、例如真和假定义的。若布尔状态的值是预定的常量,则其以标准方式表示,否则借助于标准函数加以计算。
还观察到的是,按照上述实施方式,旨在把数值零和壹放在执行堆栈上的伪指令被旨在把(对应布尔状态的)预定值放在执行堆栈上的伪指令代替。这样的再分配在应用执行时可能出现问题,因为这样的再分配无区别地针对布尔类型的值和其他类型例如整数类型的值。因此,例如,计数器可被初始化在零值,接着随着计算进行而增加,以便按照计数器的值停止所述计算。因此,与这样的计数器相关联的变量不应被视为布尔类型。
可以实行多个解决方案来避免这样的问题。
按照第一解决方案,改变执行伪指令的虚拟机,以检测不合理的再分配。为此,(通过执行应用的虚拟机)进行测试,以检测应由虚拟机按照所执行的伪指令进行的算术运算。若这些算术运算的操作数是预先初始化为对应一布尔状态的预定值的变量,则进行测试,以把该操作数的值与布尔状态的值进行比较。若该操作数的值等于一布尔状态的值,则该操作数的值被再初始化,以便取对应该布尔状态值的数值零或壹(按照前面的实例,若该布尔状态的值为35,则取零,而若该布尔状态的值为65,则取壹)。反之,若该操作数的值不等于一个布尔状态的值,则该操作数的值不被改变。因此,(根据来自源代码编译的伪指令)应被初始化为零或壹的所有变量,按照经过转换的伪指令,被初始化为对应布尔状态的预定值,接着,若涉及用于算术运算的变量,则它们的值被虚拟机再初始化为零或壹。
按照第二解决方案,对出自源代码编译的伪指令在其转换时进行分析。因此,对于每个应被初始化为零或壹的变量进行指令分析,以确定是否该变量以后被用在至少一个算术运算例如增量中,还是被用在逻辑运算例如与等于零或壹的确定值的比较中。若该变量被用在一算术运算中,则与其初始化相关的伪指令不被改变。在相反的情况下,若该变量被用在一算术运算中,则与其初始化相关的伪指令被转换,以便把该变量初始化为对应于一个布尔状态的预定值。
图3示出按照本发明对出自源代码编译的伪指令进行分析以确定要执行的转换的这类分析步骤的一个实例。
参照图3描述的步骤例如是在参照图2描述的步骤230的过程中实行的。
在这里,第一步骤旨在确定对应索引i的伪指令是否是针对变量初始化或给变量赋值的指令(步骤300),也就是说,例如,伪指令iconst_x,该伪指令后跟随用于把值x储存在变量y中的伪指令istore_y。这个步骤是在参照图2描述的步骤220或步骤225之后执行的。
在肯定的情况下,代表有关待转换伪指令的索引的变量j被初始化为变量i的值(步骤305)。
因此进行测试,以确定是否存在对应索引j的伪指令(步骤310)。若存在对应索引j的伪指令,则进行测试,以确定是否该对应索引j的伪指令针对一算术运算以及是否该运算的操作数是被对应索引i的伪指令初始化或者赋值的变量(步骤315)。
在否定的情况下,进行测试,以确定是否该对应索引j的伪指令针对逻辑运算以及是否该运算的操作数是被对应索引i的伪指令初始化或赋值的变量(步骤320)。
在肯定的情况下,该对应索引j的伪指令如上所述按照本发明进行转换(步骤325)。该步骤后跟随着参照图2描述的步骤240。
若该对应索引j的伪指令不针对逻辑运算(步骤320),则索引j增一(步骤330),以及又一次执行步骤310,以便如果存在下一伪指令则处理该下一伪指令。
若该对应索引j的伪指令针对算术运算,以及如果该运算的操作数是被对应索引i的伪指令初始化或赋值的变量(步骤315),或者如果不存在对应索引j的伪指令,则该对应索引i的伪指令以标准的方式被转换(参照图2描述的步骤235)。
因此,参照图3描述的步骤允许区分开用于逻辑运算的变量和用于算术运算的变量,并因而能适应伪指令的转换,以便提高应用执行的安全性而不干扰其运行。
以类似的方式,如前所述的本发明可以按照在专利申请WO2005/008451中描述的方法来实施以使应用的执行安全化。按照该专利申请的教导,预定值被放在执行堆栈上。接着,在其执行应该受到控制的一组指令执行后,将执行堆栈上存在的值与预先放置在执行堆栈上的预定值比较。该比较允许检测该组指令的执行的异常。
用来控制指令组执行的预定值有利地根据本发明被改变。
按照可独立实施或可与前述实施方式结合实施的另一实施方式,中间编程语言代码的伪指令集在其转换时被改变,以便加入一个或多个允许独立于初始集的伪指令来控制函数执行的伪指令。
这里提到的是,根据Java Card规范,可对于解释这些文件的伪指令的虚拟机将一些伪指令添加到Cap类型文件的伪指令中。这些伪指令不是作为对所执行应用的指令而是作为控制命令由虚拟机处理。这些伪指令借助于预定的标识符(或者英语术语tag)被识别并形成称为定制组件(customcomponents)的实体。
因此,定制组件的数据域(英语术语中称为info item)可以用来向虚拟机传送旨在控制一些函数或一些函数组执行的伪指令。
因此,按照该第二实施方式,一些伪指令被加入Cap类型文件的伪指令中,以便控制函数的执行,例如,如专利申请WO 2005/008451中所描述的由括弧系统定义的函数的执行。这些伪指令可以尤其旨在验证在函数执行之后执行堆栈处在等候状态。
作为说明,这样的伪指令能以定制组件的数据域中的数据的形式被引入Cap类型文件中,以便控制在所考虑的文件中由括弧系统定义的各种函数的执行。它们可以命令虚拟机验证在每个函数执行之后执行堆栈是空的。为此,该虚拟机可以验证执行堆栈的高地址等于执行堆栈的低地址。
在这里观察到,这样的实施方式允许由标准虚拟机执行Cap类型文件的伪指令,以定制组件的数据域中的数据的形式插入的伪指令因此被忽略。
图4示出适于实现本发明某些步骤、特别是参照图2和3描述的步骤的装置400的硬件结构实例。装置400例如是计算机或电脑。在这里装置包括通信总线405,以下器件连接到该通信总线:
-一个或多个中央处理单元或微处理器410(CPU);
-只读存储器415(ROM,英语术语Read Only Memory的首字母缩略词),其可以包括运行本发明所需要的程序(prog、prog1和prog2(程序、程序1和程序2));
-读写存储器或高速缓冲存储器420(RAM,英语术语Random AccessMemory的首字母缩略词),其包括适于记录在上述程序执行过程中创建和改变的变量和参数的寄存器;和
-通信接口450,其适于传送和接收数据。
装置400还优选地配有:硬盘435,其可以包括上述程序以及按照本发明已处理或待处理的信息;和存储卡的读卡器440,其适于接收存储卡445并在存储卡中读取或向储存卡中写入根据本发明已处理或待处理的数据。
通信总线允许包括在装置400中或与该装置相连接的不同元件之间的通信和协同运转。总线的表示不是限制性的,尤其地,中央处理单元能直接地或通过装置400的其他元件传送指令给装置400的各个元件。
允许该可编程装置实施按照本发明的方法的每个程序的可执行代码可以被储存,例如被储存在硬盘435中或只读存储器415中。
按照一个变型,存储卡445可以包含按照本发明的信息、尤其是待处理信息,以及包含上述程序的可执行代码,该可执行代码一旦被装置400读出便被存入硬盘435中。
按照另一个变型,按照本发明的程序的可执行代码和待处理信息可以借助接口450至少部分地被接收,以便以与上述方式相同的方式被储存。
以更一般的方式,按照本发明的所述程序以及待处理信息可以在被执行之前装载入装置400的储存部件之一中。
中央单元410将控制和引导按照本发明的所述程序的软件代码的一些部分或指令的执行,所述指令是存储在硬盘435中或只读存储器415中甚至或上述其他储存元件中的指令。通电时,存入非易失存储器例如硬盘435或只读存储器415中的所述程序被转移至读写存储器420中以及用于存储实施本发明所需要的变量和参数的寄存器中,读写存储器因此包含按照本发明的所述程序的执行代码。
自然地,为了满足特定的需求,本发明技术领域中的技术人员能将改变应用于前述的说明中。特别地,尽管本发明出于示意说明和清楚的考虑而特别地参照Java编程语言进行描述,但本发明可以用其他类型的编程语言来实施。
附录
Java源文件 | Java Class文件 | 索引 | 备注 |
public void deselect(){ | |||
boolean myBoolean=false | iconst_0 | 0 | 把等于零的值放在执行堆栈上 |
istore_1 | 1 | 把执行堆栈的值存入第一局部变量 | |
boolean myResult=true | iconst_1 | 2 | 把等于壹的值放在执行堆栈上 |
istore_2 | 3 | 把执行堆栈的值存入第二局部变量 | |
if(myBoolean==true){ | iload_1 | 4 | 把第一局部变量的值放在执行堆栈上 |
ifeq 9 | 5 | 若执行堆栈的值不等于壹,进到9 | |
myResult=true | iconst_1 | 6 | 把等于壹的值放在执行堆栈上 |
istore_2 | 7 | 把执行堆栈的值存入第二局部变量 | |
}else{ | goto 11 | 8 | 进到11 |
myResult=true}else{ | iconst_0 | 9 | 把等于零的值放在执行堆栈上 |
myResult=false} | istore_2 | 10 | 把执行堆栈的值存入第二局部变量 |
} | return | 11 |
表1
Java Class文件 | Java Cap文件 | 索引 | 备注 |
iconst_0 | sconst_false | 0 | 把第一预定值(例如等于35)放在执行堆栈上 |
istore_1 | sstore_1 | 1 | 把执行堆栈的值存入第一局部变量 |
iconst_1 | sconst_true | 2 | 把第二预定值(例如等于65)放在执行堆栈上 |
istore_2 | sstore_2 | 3 | 把执行堆栈的值存入第二局部变量 |
iload_1 | sload_1 | 4 | 把第一局部变量的值放在执行堆栈上 |
ifeq 9 | ifBeq 9 | 5 | 若执行堆栈的值不等于第二预定值,进到9 |
iconst_1 | sconst_true | 6 | 把第二预定值放在执行堆栈上 |
istore_2 | sstore_2 | 7 | 把执行堆栈的值存入第二局部变量 |
goto 11 | goto 11 | 8 | 进到11 |
iconst_0 | sconst_false | 9 | 把第一预定值放在执行堆栈上 |
istore_2 | sstore_2 | 10 | 把执行堆栈的值存入第二局部变量 |
return | return | 11 |
表2
编译伪指令 | 转换伪指令 |
iconst_0 | sconst_false |
iconst_1 | sconst_true |
istore_1 | sstore_1 |
istore_2 | sstore_2 |
iload_1 | sload_1 |
iload_2 | sload_2 |
ifeq | ifBeq |
goto | goto |
return | return |
表3
Claims (10)
1.用于计算机的由虚拟机执行的中间编程代码的安全化的方法,该方法的特征在于,所述方法包括下列步骤;
-从所述中间编程代码接收(200)多个伪指令;
-转换(230,235)所述多个伪指令,所述转换包括插入至少一个伪指令的插入步骤,所述至少一个伪指令与所述多个伪指令中的至少一个伪指令的执行的控制函数相关;和
-生成伪代码,所生成的所述伪代码包括被转换的所述多个伪指令。
2.按照权利要求1所述的方法,其特征在于,所述插入步骤包括插入代表用于所述虚拟机的控制命令的伪指令的步骤。
3.按照权利要求2所述的方法,其特征在于,用于所述虚拟机的所述控制命令旨在检验所述虚拟机的执行堆栈,以验证所述虚拟机的执行堆栈是空的。
4.按照权利要求1所述的方法,其特征在于,转换步骤对于每个所接收的所述伪指令包括以下步骤:
-若所述伪指令针对至少一第一预定值的预定处理,则删除所述伪指令并插入(230)针对用于至少一第二预定值的所述预定处理的伪指令,所述至少一第二预定值不同于所述至少一第一预定值;和
-若所述伪指令针对所述至少一第一预定值与另一值的比较,则删除所述伪指令并插入(230)针对所述至少一第二预定值与所述另一值比较的伪指令。
5.按照权利要求4所述的方法,其特征在于,针对至少一第一预定值的预定处理的所述伪指令旨在对局部变量进行初始化或赋值,所述局部变量的值在初始化或赋值步骤执行之后等于所述第一预定值。
6.按照权利要求4所述的方法,其特征在于,所述方法还包括定义(225)或计算所述至少一第二预定值的步骤。
7.按照权利要求4所述的方法,其特征在于,所述方法还包括分析所述多个伪指令的至少一组的分析步骤(315,320),作为对所述分析步骤的响应而进行删除针对至少一第一预定值的预定处理的所述伪指令的步骤和插入针对用于至少一第二预定值的所述预定处理的所述伪指令的步骤。
8.按照权利要求1所述的方法,其特征在于,所述方法还包括代码编译(110)的预先步骤,所述代码编译的预先步骤的结果包括所述多个伪指令。
9.装置,所述装置包括适于实施按照权利要求1至8中任一项所述的方法的每个步骤的部件。
10.微电路卡,所述微电路卡包括通过按照权利要求1至8中任一项所述的方法获得的伪指令。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
FR1059276 | 2010-11-10 | ||
FR1059276A FR2967275B1 (fr) | 2010-11-10 | 2010-11-10 | Procede, programme d'ordinateur et dispositif de securisation de code intermediaire de programmation pour son execution par une machine virtuelle |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102681838A CN102681838A (zh) | 2012-09-19 |
CN102681838B true CN102681838B (zh) | 2016-10-05 |
Family
ID=44350592
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110463290.XA Expired - Fee Related CN102681838B (zh) | 2010-11-10 | 2011-11-10 | 由虚拟机执行的中间编程代码的安全化的方法、计算机程序和装置 |
Country Status (5)
Country | Link |
---|---|
US (1) | US9129137B2 (zh) |
EP (1) | EP2453356B1 (zh) |
KR (1) | KR101875225B1 (zh) |
CN (1) | CN102681838B (zh) |
FR (1) | FR2967275B1 (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106154959A (zh) * | 2015-04-02 | 2016-11-23 | 工业和信息化部计算机与微电子发展研究中心(中国软件评测中心) | 一种用于检测炸药生产系统中plc信息安全性的方法 |
FR3065553B1 (fr) * | 2017-04-20 | 2019-04-26 | Idemia Identity And Security | Procede d'execution d'un programme destine a etre interprete par une machine virtuelle protege contre des attaques par injection de faute |
US11055074B2 (en) * | 2017-11-13 | 2021-07-06 | Ab Initio Technology Llc | Key-based logging for processing of structured data items with executable logic |
CN111399844B (zh) * | 2020-03-12 | 2023-11-24 | 同盾(广州)科技有限公司 | 安全编译方法、装置、电子设备及计算机可读介质 |
CN111782509B (zh) * | 2020-06-15 | 2022-11-29 | 西北工业大学 | 基于虚拟仪器伪指令机制的航天自动化测试方法 |
CN113791838B (zh) * | 2021-08-20 | 2024-04-23 | 深圳市元征科技股份有限公司 | 一种程序文件调用方法、装置以及存储介质 |
CN115309405B (zh) * | 2022-08-24 | 2023-08-04 | 北京熵核科技有限公司 | 一种代码链接优化方法 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6058482A (en) * | 1998-05-22 | 2000-05-02 | Sun Microsystems, Inc. | Apparatus, method and system for providing network security for executable code in computer and communications networks |
FR2857473B1 (fr) | 2003-07-11 | 2005-09-16 | Oberthur Card Syst Sa | Procede de securisation de l'execution d'un programme informatique, notamment dans une carte a microcircuit |
FR2877118B1 (fr) * | 2004-10-22 | 2007-01-19 | Oberthur Card Syst Sa | Protection contre les attaques par generation de fautes sur les instructions de saut |
EP1960934B1 (fr) | 2005-12-13 | 2012-03-21 | Gemalto SA | Procede pour securiser l'execution d'un code logiciel en langage intermediaire dans un appareil portatif |
US7962798B2 (en) * | 2006-04-17 | 2011-06-14 | The Trustees Of Columbia University In The City Of New York | Methods, systems and media for software self-healing |
US8875115B2 (en) * | 2008-11-29 | 2014-10-28 | International Business Machines Corporation | Type merging technique to reduce class loading during Java verification |
JP5689472B2 (ja) * | 2009-11-13 | 2015-03-25 | イルデト カナダ コーポレーション | 悪意ある実行環境内での静的および動的攻撃からJavaバイトコードを保護するシステムおよび方法 |
-
2010
- 2010-11-10 FR FR1059276A patent/FR2967275B1/fr not_active Expired - Fee Related
-
2011
- 2011-11-09 US US13/292,228 patent/US9129137B2/en not_active Expired - Fee Related
- 2011-11-09 EP EP11188437.5A patent/EP2453356B1/fr active Active
- 2011-11-10 KR KR1020110117242A patent/KR101875225B1/ko active IP Right Grant
- 2011-11-10 CN CN201110463290.XA patent/CN102681838B/zh not_active Expired - Fee Related
Non-Patent Citations (3)
Title |
---|
.《EMBEDDED SYSTEMS SECURITY》.2009,1-6. * |
Ahmadou Al Khary Sere et al..< * |
Automatic detection of fault attack and countermeasures> * |
Also Published As
Publication number | Publication date |
---|---|
FR2967275B1 (fr) | 2012-12-28 |
KR20120050406A (ko) | 2012-05-18 |
CN102681838A (zh) | 2012-09-19 |
EP2453356B1 (fr) | 2020-07-15 |
EP2453356A1 (fr) | 2012-05-16 |
US20120117550A1 (en) | 2012-05-10 |
FR2967275A1 (fr) | 2012-05-11 |
US9129137B2 (en) | 2015-09-08 |
KR101875225B1 (ko) | 2018-07-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102681838B (zh) | 由虚拟机执行的中间编程代码的安全化的方法、计算机程序和装置 | |
Clarke et al. | STG: A symbolic test generation tool | |
US6671874B1 (en) | Universal verification and validation system and method of computer-aided software quality assurance and testing | |
CN102054149B (zh) | 一种恶意代码行为特征提取方法 | |
Schäfer et al. | An empirical evaluation of using large language models for automated unit test generation | |
CA3060085A1 (en) | Method for determining defects and vulnerabilities in software code | |
CN106371940A (zh) | 一种程序崩溃解决方法及装置 | |
CN106326107B (zh) | 基于仿真环境的非侵入式嵌入式软件异常处理验证方法 | |
CN103257919B (zh) | 脚本程序检查方法和装置 | |
CN104156311B (zh) | 一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法 | |
CN113672515A (zh) | 一种基于符号执行的wasm智能合约漏洞检测方法 | |
Ren et al. | Making smart contract development more secure and easier | |
CN112256271B (zh) | 一种基于静态分析的区块链智能合约安全检测系统 | |
CN105653906A (zh) | 基于地址随机的反内核挂钩方法 | |
US8185881B2 (en) | Procedure summaries for pointer analysis | |
CN107850641A (zh) | 片上系统(SoC)的系统级验证 | |
Zhao et al. | Haepg: An automatic multi-hop exploitation generation framework | |
CN106843901A (zh) | 一种页面渲染和验证的方法和装置 | |
CN109240936A (zh) | 应用程序的兼容性测试方法、终端设备及介质 | |
KR102117209B1 (ko) | 바이너리 취약점 패치 방법 및 장치 | |
CN103365772B (zh) | 软件测试自动评价装置以及方法 | |
Christakis et al. | IC-Cut: A compositional search strategy for dynamic test generation | |
CN111045670A (zh) | 一种二进制代码与源代码间复用关系的识别方法与装置 | |
CN103970654B (zh) | 一种软件可靠性虚拟测试方法 | |
CN101937395B (zh) | 一种用于漏洞检测的检测对象程序特征提取方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20161005 Termination date: 20201110 |
|
CF01 | Termination of patent right due to non-payment of annual fee |