CN116595517A - 一种程序完整性校验方法及装置 - Google Patents

一种程序完整性校验方法及装置 Download PDF

Info

Publication number
CN116595517A
CN116595517A CN202210116485.5A CN202210116485A CN116595517A CN 116595517 A CN116595517 A CN 116595517A CN 202210116485 A CN202210116485 A CN 202210116485A CN 116595517 A CN116595517 A CN 116595517A
Authority
CN
China
Prior art keywords
program
class
file
memory
class file
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.)
Pending
Application number
CN202210116485.5A
Other languages
English (en)
Inventor
吕建荣
朱贤
员旭东
王勋
林靖
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN202210116485.5A priority Critical patent/CN116595517A/zh
Publication of CN116595517A publication Critical patent/CN116595517A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/566Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • General Health & Medical Sciences (AREA)
  • Virology (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请提供了一种程序完整性校验方法及装置,所述程序完整性校验方法,包括:响应于第一程序满足获取条件,获取所述第一程序的度量值,所述第一程序包括第一类Class文件,所述度量值包括第一度量值,所述第一度量值是根据被加载到内存的所述第一类文件的字节码确定的,所述获取条件包括所述第一类文件已加载到内存;根据基线值和所述度量值确定所述第一程序与第二程序是否匹配,所述第二程序包括第二类文件,所述基线值包括第一基线值,所述第一基线值是根据所述第二类文件的字节码确定的,所述第二类文件为所述第二程序中与所述第一类文件对应的类文件。

Description

一种程序完整性校验方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种程序完整性校验方法及装置。
背景技术
随着移动互联网的发展以及电子设备的智能化,使得用户可以根据自身的需求为网络设备(如路由器、交换机、服务器)或个人电子设备(如手机、平板电脑)加载应用程序。由于应用程序存在被篡改和攻击的风险。例如,攻击者可以通过篡改应用程序,如植入恶意代码,破坏应用程序的完整性,造成网络设备或个人电子设备使用异常、恶意攻击和信息泄露,或者影响计算机的正常运行。
发明内容
本申请实施例提供了一种程序完整性校验方法及装置,旨在确定被加载到内存的应用程序的完整性。
第一方面,本申请提供了一种程序完整性校验方法,该方法可以用于判断第一程序与第二程序是否匹配。其中,第一程序是安装与计算机设备上的应用程序,第二程序为厂商发布的原版应用程序。如果第一程序与第二程序匹配,说明第一程序与原版程序一致,第一程序完整。具体地,所述方法包括:在第一程序满足获取条件时,获取第一程序的度量值。其中,第一程序包括第一类(Class)文件,第一程序满足获取条件包括第一Class文件已被加载到内存。度量值包括第一度量值,第一度量值根据被加载到内存中的第一Class文件的字节码确定。也就是说,第一度量值可以体现被加载到内存的第一Class文件的特征。那么在得到度量值之后,可以将度量值和基线值相比较,从而确定第一程序与第二程序是否匹配。其中,基线值包括第一基线值。第一基线值根据第二程序中第二Class文件的字节码确定,第二Class文件为第二程序中与第一Class文件对应的Class文件。这样,通过度量值和基线值,可以确定第一程序与第二程序是否匹配,从而对第一程序进行完整性校验。另外,由于度量值是根据内存中的Class文件确定的,通过比较度量值和基线值就可以判断被加载到内存的第一C程序是否遭到篡改。如此,可以判断内存中的第一程序与第二程序是否匹配,从而确定运行中的第一程序是否遭到篡改。
在一种可能的设计中,确定第一程序满足获取条件具体包括但不限于以下两种实现方式。
在第一种实现方式中,通过第一回调函数的触发情况判断第一程序是否满足获取条件。如果第一回调函数被触发确定第一程序满足获取条件。其中,第一回调函数被触发指示第一Class文件已加载到内存。具体地,第一回调函数可以用于监控第一Class文件中方法代码的执行状态,如果第一Class文件中的方法代码进入待执行状态,第一回调函数被触发。由于方法代码被加载到内存之后才能被执行,如果第一回调函数被触发,说明第一Class文件中的方法代码已经被加载到内存。这样,通过监控第一方法的执行状态,可以确定第一程序是否被加载到内存,从而根据内存中的字节码获取度量值。
在第二种实现方式中,通过内存扫描线程判断第一程序是否满足获取条件。具体地,通过运行内存扫描线程,可以获取内存存储数据的情况,从而判断内存中是否存储有第一程序的Class文件对应的字节码。如果检测到内存中包括第一程序的Class文件对应的字节码,确认第一程序满足获取条件。
在一种可能的设计中,内存扫描线程还用于获取一个或多个Class文件的字节码。例如,如果第一Class文件被加载到内存,内存扫描线程可以用于获取第一Class文件的字节码。如果第一程序中第三Class文件也被加载到内存,内存扫描线程也能够扫描出第三Class文件被加载到内存,并获取第三Class文件的字节码。
在一种可能的设计中,度量值是根据Class文件的方法字节码得到的。也就是说,都在获取第一度量值时,可以先获取第一Class文件的方法字节码,再根据第一Class文件的方法字节码确定第一度量值。
在一种可能的设计中,第一度量值和第一基线值用于确定第一Class文件的校验结果。具体地,如果第一基线值与第一度量值满足校验条件,得到的第一Class文件的校验结果为匹配。如果第一基线值与第一度量值不满足校验条件,得到的第一Class文件的校验结果为不匹配。其中,满足校验条件是指第一度量值与第一基线值相等,或者是指第一度量值与第一基线值之间的误差小于第一阈值。
在一种可能的设计中,第一程序的完整性校验结果是根据第一Class文件的校验结果得到的,例如第一程序的完整性校验结果可以根据第一基线值和第一度量值确定第一类文件的校验结果确定。具体地,可以先判断第一基线值和第一度量值是否相等或误差在第一阈值以内。如果第一基线值与第一度量值相等或误差在第一阈值以内,说明第一类文件的校验结果为匹配。如果对于第一程序只需要校验第一类文件的校验结果,那么相应地,第一程序与第二程序匹配。如果第一基线值与第一度量值不相等或误差超过第一阈值,说明第一类文件的校验结果为不匹配。相应地,第一程序与第二程序不匹配。
在一种可能的设计中,第一程序中多个Class文件被加载到内存,那么第一程序的完整性校验结果根据多个Class文件的校验结果确定。具体地,假设第一程序还包括第三Class文件,第二程序还包括与第三Class文件对应的第四Class文件。度量值还包括第二度量值,基线值还包括第二基线值,第二度量值根据第三Class文件的字节码确定,第二基线值根据第四Class文件的字节码确定。那么在判断第一程序与第二程序是否匹配时,可以根据第一度量值和第一基线值确定第一Class文件的校验结果,根据第二度量值和第二基线值确定第二Class文件的校验结果。如果第一Class文件的校验结果为匹配,并且,第三Class文件的校验结果为匹配,确定第一程序与第二程序匹配。如果第一Class文件的校验结果为不匹配,和/或,第三Class文件的校验结果为不匹配,确定第一程序与第二程序不匹配。
在一种可能的设计中,第一度量值包括第一Class文件对应的字节码的哈希(Hash)值。
在一种可能的设计中,第一Class文件的方法字节码基于方法字节码的句柄确定。具体地,在确定第一度量值时,可以先获取句柄集合,句柄集合包括一个或多个(Handle),句柄用于标识第一Class文件中方法字节码在内存中的存储位置,例如可以用于表示方法字节码在第一Class文件的字节码对应的存储空间中的具体位置。
在一种可能的设计中,第一Class文件的方法字节码还包括常量索引字节码,常量索引字节码用于索引常量池中的常量字节码。为了确保第一度量值的稳定性,在计算第一度量值的过程中,在获取到第一Class文件对应的方法字节码之后,可以获取第一Class文件对应的常量池,再从常量池中查找与常量索引字节码对应的常量字节码。接着,可以将第一Class文件对应的方法字节码中的常量索引字节码替换为常量字节码,以便根据替换后方法字节码确定第一度量值。如此,将方法字节码中的常量索引字节码还原为常量字节码,可以提高完整性校验的准确性。
在一种可能的设计中,为了防止被篡改的应用程序影响计算机设备的安全,在确定第一程序的校验结果之前,可以使得内存中任意一个或多个Class文件处于非运行状态。例如可以控制第一程序对应的Class文件处于非运行状态。
在一种可能的设计中,还可以确定动态生成类的基线值。假设第一程序包括第五Class文件,第五Class文件在运行的过程中会生成动态生成类。动态生成类以字节码的形式被存储在,又称类字节码。为了对类字节码进行校验,可以获取类字节码的度量值,并将类字节码的度量值确定为该类字节码的基线值并存储。这样,在第一程序后续运行的过程中,如果第五Class文件又生成了类字节码,可以根据类字节码确定度量值。再根据度量值与存储的基线值判断类字节码是否遭到篡改。
在一种可能的设计中,为了准确地获得类字节码的校验结果,在将类字节码的度量值确定为类字节码的基线值之前,可以先判断第五Class文件与第六Class文件是否匹配。其中,第六Class文件为第二程序中与第五Class文件对应的Class文件。如果第五Class文件与第六Class文件匹配,说明生成类字节码的Class文件(又称类生成器)未遭到篡改。如果第五Class文件与第六Class文件不匹配,说明生成类字节码的类生成器遭到篡改,第五Class文件不安全。
在一种可能的设计中,还可以向管理端发送第一程序的校验结果。
在一种可能的设计中,为避免遭到篡改的应用程序影响计算机设备的安全性,如果第一程序与第二程序不匹配,还可以使得内存中任意一个Class文件处于非运行状态。
在一种可能的设计中,所述目标程序为基于JAVA开发的应用程序。
第二方面,本申请提供了一种程序完整性校验装置,所述装置包括:获取单元,用于响应于第一程序满足获取条件,获取所述第一程序的度量值,所述第一程序包括第一类Class文件,所述度量值包括第一度量值,所述第一度量值是根据被加载到内存的所述第一类文件的字节码确定的,所述获取条件包括所述第一类文件已加载到内存;判断单元,用于根据基线值和所述度量值所述第一程序与第二程序是否匹配,所述第二程序包括第二类文件,所述基线值包括第一基线值,所述第一基线值是根据所述第二类文件的字节码确定的,所述第二类文件为所述第二程序中与所述第一类文件对应的类文件。
在一种可能的设计中,所述获取单元,用于确定第一回调函数被触发,所述第一回调函数被触发指示所述第一类文件已加载到内存。
在一种可能的设计中,所述第一类文件包括第一方法代码,所述第一程序通过运行所述第一方法代码执行所述第一类文件对应的方法,所述第一回调函数被触发指示所述第一方法代码进入待运行状态。
在一种可能的设计中,所述获取单元,用于确定运行内存扫描线程,所述内存扫描线程用于获取所述第一类文件的字节码。
在一种可能的设计中,所述第一程序还包括第三类文件,所述获取条件包括所述第三类文件已加载到内存,所述内存扫描线程还用于获取所述第三类文件的字节码。
在一种可能的设计中,所述获取单元,用于获取所述被加载到内存的所述第一类文件对应的方法字节码;根据所述第一类文件对应的方法字节码确定所述第一度量值。
在一种可能的设计中,所述判断单元,用于根据所述第一基线值与所述第一度量值确定所述第一类文件的校验结果;如果所述第一类文件的校验结果为匹配,且对于第一程序只需要校验第一类文件的校验结果,那么确定所述第一程序与所述第二程序匹配;或,如果所述第一类文件的校验结果为不匹配,确定所述第一程序与所述第二程序不匹配。
在一种可能的设计中,所述度量值包括第二度量值,所述第二度量值根据所述第三类文件的字节码确定,所述基线值包括第二基线值,所述第二基线值根据第四类文件的字节码确定,所述第四类文件为所述第二程序中与所述第三类文件对应的类文件;所述判断单元,用于根据所述第一基线值与所述第一度量值确认所述第一类文件的校验结果;根据所述第二基线值与所述第二度量值确认所述第三类文件的校验结果;如果所述第一类文件的校验结果为匹配,并且,所述第三类文件的校验结果为匹配,确定所述第一程序与所述第二程序匹配;或,如果所述第一类文件的校验结果为不匹配,和/或,所述第三类文件的校验结果为不匹配,确定所述第一程序与所述第二程序不匹配。
在一种可能的设计中,所述判断单元,用于如果所述第一基线值与所述第一度量值满足校验条件,所述第一类文件的校验结果为匹配;或,如果所述第一基线值和所述第一度量值不满足校验条件,所述第一类文件的校验结果为不匹配。
在一种可能的设计中,所述第一度量值包括所述第一类文件对应的字节码的哈希Hash值。
在一种可能的设计中,所述获取单元,用于获取句柄集合,所述句柄集合包括一个或多个句柄,所述一个或多个句柄用于标识所述第一类文件对应的方法字节码在所述内存中的存储位置;根据所述句柄集合,从所述内存中的存储位置获取所述第一类文件对应的方法字节码。
在一种可能的设计中,所述第一类文件对应的方法字节码包括常量索引字节码,所述常量索引字节码用于索引常量池中的常量字节码;所述获取单元,用于从所述常量池中查找与所述常量索引字节码对应的常量字节码;将所述第一类文件对应的方法字节码中的常量索引字节码替换为所述常量字节码;根据所述替换后方法字节码确定所述第一程序的度量值
在一种可能的设计中,所述判断单元,用于使得所述内存中任意一个类文件处于非运行状态。
在一种可能的设计中,所述第一程序包括第五类文件,所述获取单元,还用于获取类字节码的度量值,所述类字节码是根据所述第五类文生成并存储到内存中的;将所述类字节码的度量值确定为所述类字节码的基线值。
在一种可能的设计中,所述获取单元,还用于确定所述第五类文件与所述第二程序中与所述第五类文件对应的类文件的校验结果为匹配。
在一种可能的设计中,所述判断单元,用于向管理端发送所述第一程序件的校验结果。
在一种可能的设计中,判断单元,用于响应于所述第一程序与第二程序不匹配,使得所述内存中任意一个类文件处于非运行状态。
在一种可能的设计中,所述目标程序为基于JAVA开发的应用程序。
第三方面,本申请实施例提供了一种通信装置,所述设备包括处理器和存储器,所述存储器用于存储指令或程序代码,所述处理器执行所述指令或程序代码时,以执行如前述第一方面所述的程序完整性校验方法。可选地,所述程序完整性校验方法还可以由手机或电脑等终端设备执行。
第四方面,本申请实施例提供了一种芯片,包括存储器和处理器,存储器用于存储指令或程序代码,处理器执行该指令或程序代码时,以执行如前述第一方面所述的程序完整性校验方法。
第五方面,本申请实施例提供了一种计算机可读存储介质,包括指令、程序或代码,当所述指令、程序或代码被处理器执行时,实现如前述第一方面所述的信息发送的方法,或执行如前述第一方面任一项所述的程序完整性校验方法。
第六方面,本申请实施例提供了一种计算机程序产品,包括计算机程序,当所述计算机程序被处理器执行时,实现如前述第一方面所述的信息发送的方法,或执行如前述第一方面任一项所述的程序完整性校验方法。
附图说明
图1为本申请实施例提供的计算机设备100的一种结构示意图;
图2为本申请实施例提供的程序完整性校验方法的一种方法流程图;
图3为本申请实施例提供的基线值获取方法的一种方法流程图;
图4为本申请实施例提供的对动态生成类的基线值的获取方法的一种方法流程图;
图5为本申请实施例提供的程序完整性校验装置500的一种结构示意图;
图6为本申请实施例提供的设备600的一种结构示意图;
图7为本申请实施例提供的设备700的一种结构示意图。
具体实施方式
判断应用程序是否遭到篡改,即应用程序完整性校验方法是对待运行的应用程序进行校验。具体地,可以判断待运行的应用程序与厂商发布的应用程序是否一致。如果待运行的应用程序与厂商发布的应用程序一致,说明应用程序未遭到篡改,计算机可以继续运行应用程序。如果待运行的应用程序与厂商发布的应用程序不一致,说明该应用程序遭到了篡改,计算机可以拒绝运行该应用程序。在一种可能的实现中,上述对应用程序进行校验的过程可以被称为对应用程序的完整性校验。
在传统的完整性校验方案中,发布应用程序的厂商可以在发布应用程序之前获取应用程序的特征值,再根据应用程序的特征值确定应用程序的基线值。在运行应用程序之前,安装有应用程序的计算机可以根据安装的应用程序获取特征值,并根据应用程序的特征值确定应用程序的度量值。接着,计算机可以比较基线值和度量值是否匹配。若匹配,说明安装在计算机上的应用程序和厂商发布的原版应用程序一致,应用程序未遭到篡改,应用程序的完整性校验通过。若不匹配,说明安装在计算机上的应用程序和厂商发布的原版应用程序不一致,应用程序遭到篡改,应用程序的完整性校验不通过。
其中,应用程序的特征值用于标识应用程序,可以是应用程序的部分代码,例如可以是应用程序中方法部分的代码,或者是应用程序中固定位置的代码。如果两个应用程序的特征值一致,可以认为这两个应用程序的代码相同。代码相同的应用程序可以被称为相同的应用程序。在一种可能的实现中,根据应用程序的特征值确定度量值(或基线值),可以包括根据哈希(Hash)算法计算应用程序的特征值的哈希值,并将计算得到的哈希值作为应用程序的度量值(或基线值)。或者,应用程序的特征值也可以作为应用程序的度量值或基线值。
在传统的应用程序的完整性校验方法中,度量值是根据静态存储在硬盘等存储器中的应用程序的特征值得到的。也就是说,传统的应用程序校验方法可以对静态存储的应用程序进行完整性校验。
但是,在应用程序动态运行的过程中,应用程序的代码会被加载到内存,计算机的处理器通过运行内存中的代码实现应用程序的功能。而传统的完整性校验方法只能获取静态存储的应用程序的特征值,不能动态获取内存中应用程序的特征值,也就不能动态地对应用程序进行校验。因此,如果应用程序运行过程中遭到了攻击,例如应用程序在被加载到内存的过程中遭到了篡改,或者应用程序在被加载到内存之后遭到了篡改,传统的程序完整性校验方法无法确定内存中的应用程序是否与厂商发布的原版应用程序一致,也就不能判断应用程序遭到篡改。
下面以基于JAVA开发的应用程序为例,对上述内容进行详细介绍。
基于JAVA开发的应用程序包括一个或多个类(Class)文件。在开发过程中,JAVA文件包括JAVA源代码。在开发完成后,JAVA源代码被编译为字节码,并以Class文件的形式发布。也就是说,将JAVA源代码编译为字节码相当于将JAVA源代码编译为Class文件。Class文件包括字节码,Class文件中的字节码被称为Class的字节码。如果计算机设备要运行应用程序,计算机设备首先获取发布的Class文件。在运行应用程序时,应用程序的Class文件被加载到计算机设备的内存,并在计算机内存中被进一步编译为机器码。计算机设备的处理器通过运行所述机器码实现应用程序的功能。
在一种可能的实现中,上述将JAVA源代码编译为字节码的过程可以被称为前端编译,上述将字节码编译为机器码的过程可以被称为后端编译,后端编译可以由JAVA虚拟机(Java Virtual Machine,JVM)执行。以Class文件的形式发布包括发布文件后缀为“.class”的文件,且所述文件中包括字节码。被加载到内存的Class文件以字节码的形式被存储在内存中,可以被称为Class程序或Class。
其中,字节码包括方法字节码和变量字节码。方法字节码根据JAVA源代码中的方法代码编译得到,变量字节码根据JAVA源代码中非方法代码编译得到。这样,计算机通过运行内存中的方法字节码实现应用程序的功能。可以理解的是,在应用程序未被运行时,应用程序的Class文件被存储在存储器中。一个应用程序可以包括一个或多个Class文件。
传统的完整性校验方法只能静态地对应用程序进行完整性校验,无法动态地对应用程序进行完整性校验。例如,如果应用程序的Class文件在被加载到内存的过程中遭到篡改,或者Class文件在加载到内存后遭到了篡改,内存中的字节码与根据原始应用程序的Class文件编译出的字节码不同。这样,如果根据内存中的字节码运行,可能导致安全性问题。但是,由于硬盘等存储器中的Class文件并未遭到篡改,传统的完整性校验方法仍然会认为应用程序完整,不能准确地发现攻击,安全性较差。可见,传统的完整性校验方法无法对运行状态的程序进行完整性校验。
进一步地,应用程序在运行过程中可能会生成字节码会。这些在应用程序运行过程中被生成的字节码被存储在内存中。处理器可以运行这些字节码。在这些字节码被执行完毕后,处理器删除内存中的字节码。与Class文件中的字节码类似,这些在应用程序运行过程中被生成的字节码被称为动态生成类,也可以被称为类字节码。由于传统的完整性校验方法无法获取内存中的字节码,也就无法获取动态生成类的度量值和基线值,无法对动态生成类进行校验。
为了解决上述提及的无法准确对运行状态下的应用程序进行完整性校验的问题,本申请实施例提供了一种程序完整性校验方法,旨在对运行状态下的应用程序进行完整性校验。
本申请实施例提供的程序完整性校验方法可以应用于图1所示的应用场景。参见图1,该图为本申请实施例提供的计算机100的一种结构示意图。在图1中,计算机设备100包括第一存储器110、第二存储器120和处理器130。第二存储器120分别与第一存储器110和处理器130连接。在一种可能的实现中,处理器130还与第一存储器110连接。
其中,第一存储器110为计算机设备100中数据读写速度较慢的存储设备,具体可以是硬盘等存储设备,例如可以是机械硬盘,也可以是固态硬盘(Solid State Disk,SSD)等存储设备。第二存储器120为计算机设备100中数据读写速度较快的存储设备,例如可以是内存,也可以是高速缓冲存储器(Cache)等存储设备。处理器130为计算机设备100中用于处理数据的设备,例如可以是计算机设备100的中央处理器(Central Processing Unit,CPU),或者是计算机设备100中用于处理数据的芯片。
在本申请实施例中,计算机设备100为具有数据处理能力的设备,例如可以是计算机、服务器或终端设备等设备。计算机设备100的第一存储器110中存储有第一程序,第一程序为基于JAVA开发的应用程序,第一程序包括第一Class文件。在运行第一程序时,第一Class文件被加载到第二存储器120。在本申请实施例中,第一Class文件包括第一字节码。通过运行第一字节码,处理器130能够实现第一Class文件的功能。本申请实施例提供的程序完整性校验方法由处理器130执行,具体可以由安装在计算机设备100中的应用程序执行。或者,所述程序完整性校验方法也可以由处理器140(图1中未示出)执行,处理器140可以读取第二存储器120中存储的数据,并控制处理器110停止运行应用程序。
其中,计算机设备100中还可以存储有基线值,基线值根据第二程序的第二Class文件得到。第二程序与第一程序对应,第二Class文件与第一Class文件对应。第二程序是程序厂商发布的程序,是厂商发布的原版应用程序,可以认为是具有安全性和完整性的程序。第一程序是被安装或存储到计算机设备100上的程序,是有被纂改风险的程序。其中,基线值被存储在计算机设备100的存储器上,例如可以被存储在第一存储器110中。
作为一种可能的实现,本申请实施例提供的技术方案由处理器中的运行的完整性校验软件执行,所述完整性校验软件基于Java虚拟机工具接口(Java Virtual MachineTool Interface,JVMTI)实现。
下面以第一程序被存储在硬盘、第一程序对应的方法字节码被存储在内存,且本申请实施例提供的方法由处理器执行为例,对本申请实施例提供的程序完整性校验方法进行介绍。参见图2,该图为本申请实施例提供的程序完整性校验方法的一种方法流程图,该方法可以包括如下步骤S201-S203。
S201:判断第一程序是否满足获取条件。
其中,获取条件用于判断第一程序中的第一Class文件已被加载到内存。第一Class文件可以是第一程序中特定的Class文件,也可以是第一程序中的任意一个Class文件。如果第一程序满足获取条件,第一程序中的第一Class文件已被从硬盘加载到内存。如果第一程序满足获取条件,处理器可以执行下文所述的步骤S202。
在本申请实施例中,处理器确定第一程序满足获取条件具体包括但不限于以下两种实现方式。
实现方式一:处理器确定第一回调函数被触发。
在第一种实现方式中,处理器基于第一回调函数的触发状态判断第一程序是否满足获取条件。如果第一回调函数被触发,处理器确定第一程序满足获取条件。其中,第一回调函数用于监控第一Class文件的运行状况。如果第一回调函数被触发,说明第一Class文件已经被加载到了内存,处理器继续执行S202。
具体地,第一回调函数用于监控第一Class文件的运行状况,是指第一回调函数用于监控第一Class文件是否进入待运行状态。其中,第一Class文件进入待运行状态表示第一Class文件即将被处理器运行,即第一Class文件即将进入运行状态。也就是说,如果处理器运行第一Class文件,第一回调函数确定第一Class文件从未运行状态变为待运行状态。这样,第一回调函数被触发,处理器确定第一程序满足获取条件。
由于被运行的程序需要先加载到内存,在处理器运行第一Class文件之前,第一Class文件已被加载到内存中。那么即将被运行的Class文件已经被加载到内存。因此,如果第一回调函数被触发,说明第一Class文件即将被处理器运行,第一Class文件已经被加载到内存。
在一种可能的实现方式中,第一回调函数用于监控第一Class文件中方法代码对应的字节码的运行状态。例如,假设JAVA源代码包括第一方法代码。在JAVA源代码被编译为字节码后,第一方法代码对应的字节码属于第一Class文件。那么第一回调函数可以用于监控第一Class文件中与第一方法代码对应的字节码的执行状态。这样,如果第一回调函数被触发,表示处理器即将运行第一方法代码对应的字节码,即处理器即将运行第一Class文件,第一Class文件进入待运行状态,第一程序满足获取条件。
在本申请实施例中,第一回调函数可以用于监控第一Class文件中特定的一个或多个方法代码(例如上述第一方法代码)对应的字节码的执行情况,也可以用于监控第一Class文件中所有方法代码对应的字节码的执行情况。
第一回调函数可以是用于监控多个Class文件的回调函数,也可以是单独用于监控第一Class文件的回调函数。如果第一回调函数用于监控多个Class文件的运行状态,所述多个Class文件包括前述第一Class文件。如果多个Class文件中任意一个Class文件进入待执行状态,处理器确定第一回调函数被触发。
如果第一回调函数是单独用于监控第一Class文件的回调函数,且第一程序包括多个Class文件,处理器中可以运行有多个回调函数,每个回调函数用于监控一个Class文件的运行状态。如果多个回调函数中任意一个回调函数被触发,处理器确定第一程序满足获取条件。也就是说,如果第一程序包括第一Class文件和第三Class文件,处理器中还运行有第三回调函数。第三回调函数用于监控第三Class文件的运行状态。如果第三回调函数被触发,表示第三Class文件即将进入运行状态,第三Class文件已加载到内存,第一程序满足获取条件。接着,处理器执行下文所述的S202。在一种可能的实现中,如果第一回调函数未被触发,第三回调函数被触发,下文所述的度量值可以根据第三Class文件确定,不根据第一Class文件确定。
需要说明的是,第一程序满足获取条件的前提是第一程序中的第一Class文件被加载到内存,不表示第一Class文件被加载到内存后第一程序就满足获取条件。回调函数被触发表示第一Class文件即将进入待运行状态。在一些可能的实现中,如果第一Class文件被加载到内存,但是第一Class文件未进入待运行状态,回调函数不会被触发。这样,即使第一Class文件被加载到内存,第一程序仍然不满足获取条件。
在一种可能的实现中,如果本申请实施例提供技术方案基于JVMTI实现,上述回调函数可以基于MethodEntry函数和/或CompiledMethodLoad函数等函数注册。
实现方式二:处理器通过检测线程确定第一程序满足获取条件。
在第二种实现方式中,处理器通过运行检测线程判断第一程序是否满足获取条件。其中,检测线程用于获取计算机设备内存的存储情况,例如可以用于获取存储在内存中的数据的相关信息。通过运行检测线程,处理器可以确定内存中存储的数据的情况。如果检测线程确定第一程序中的任一Class文件被加载到内存,处理器确定第一程序满足获取条件。如果检测线程确定内存中不包括第一程序中任一Class文件对应的字节码,说明的第一程序的Class文件未被加载到内存,处理器确定第一程序不满足获取条件。例如,如果检测线程确定内存中包括第一Class文件对应的字节码,说明第一程序的Class文件已经被加载到内存,处理器确定第一程序满足获取条件。
另外,检测线程还用于触发处理器运行内存扫描线程,内存扫描线程用于获取Class文件的字节码。如果检测线程确定内存中包括第一程序中任意Class文件对应的方法字节码,内存扫描线程被触发。在一种可能的实现中,检测线程和内存扫描线程可以是同一个线程。关于内存扫描线程的详细介绍可以参见S202的描述,这里不再赘述。
在本申请实施例中,检测线程可以是处理器触发运行的。也就是说,在满足检测线程的触发条件时,处理器运行检测线程,从而通过检测线程判断第一程序是否满足获取条件。具体地,处理器触发运行检测线程包括但不限于以下三种方式。
方式一:处理器周期触发运行检测线程。
具体地,处理器周期性触发检测线程,即处理器周期性扫描内存中存储的数据,并判断第一程序的Class文件是否已被加载到内存。例如,计算机设备上可以关联运行定时线程和检测线程。定时线程用于周期性触发检测线程。如此,处理器每间隔固定时间扫描一次内存,从而每间隔固定时间判断第一程序是否满足获取条件。
方式二:处理器在第一程序的运行状态发生变化时触发运行检测线程。
具体地,在运行第一程序的过程中,第一程序的运行状态每改变一次,处理器可以触发运行一次检测线程。例如,在第一程序开始运行时,第一程序的运行状态从未运行变为运行,处理器触发运行检测线程。或者,在第一程序中某个模块启动或关闭之后,第一程序的运行状态发生变化,处理器触发运行检测线程。
方式三:处理器在目标事件发生时触发运行检测线程。
具体地,可以设置一个或多个目标事件,并监测目标事件的发生状态。如果处理器确定目标事件发生,处理器触发运行检测线程。其中,目标事件例如可以包括计算机设备上电、计算机设备的接口被启用和第三应用程序被启动等事件中的任意一种或多种,这里不做限定。
在一种可能的实现中,如果本申请实施例提供技术方案基于JVMTI实现,上述检测线程可以被挂载到JVM中。
可以理解的是,上述确定第一程序满足获取条件的两种实现方式可以单独使用,也可以组合使用
在确定第一程序的校验结果之前,处理器无法确定第一程序是否安全。为避免被篡改的第一程序影响设备的安全,在确定第一程序满足获取条件之后,处理器拦截第一程序,阻止第一程序继续运行。具体地,处理器可以控制内存中任意一个第一程序的Class文件处于非运行状态,也可以阻止第一程序的Class文件继续加载到内存。
S202:获取第一程序的度量值。
在确定第一程序满足获取条件之后,处理器获取第一程序的度量值。其中,第一程序的度量值是根据第一程序中被加载到内存Class文件的字节码得到的。例如,如果第一Class文件被加载到内存,第一程序的度量值可以根据第一Class文件的字节码得到。
在获取第一程序的度量值之前,处理器先获取第一程序的字节码。具体地,根据确定第一程序满足获取条件的方式不同,处理器获取的字节码不同。下面进行详细介绍。
在第一种可能的实现方式中,处理器通过回调函数确定第一程序的Class文件被加载到内存,那么计算第一程序的度量值所用的字节码为触发回调函数的Class文件的字节码。
根据前文介绍可知,回调函数用于监控第一程序中一个或多个Class文件的执行状态。如果某个Class文件被执行,说明该Class文件已被加载到内存且即将被处理器执行。那么处理器可以获取该Class文件的字节码,并根据Class文件的字节码确定第一程序的度量值。可以理解的是,如果第一程序包括多个Class文件,处理器可以只根据触发了回调函数的Class文件的字节码确定度量值。在一种可能的实现中,未触发回调函数的Class文件的字节码不用于计算度量值。
例如,如果第一程序包括第一Class文件和第三Class文件,第一回调函数用于监控第一Class文件的执行状态,第三回调函数用于监控第三Class文件的执行状态。那么如果第一回调函数被触发,第三回调函数未被触发,处理器根据第一Class文件的字节码确定第一程序的度量值。如果第三回调函数被触发,第一回调函数未被触发,处理器根据第三Class文件的字节码确定第一程序的度量值。如果第一回调函数被触发,且第三回调函数也被触发,处理器分别根据第一Class文件的字节码和第三Class文件的字节码确定两个度量值。其中,根据第一Class文件的字节码确定的度量值被称为第一度量值,根据第三Class文件的字节码确定的度量值被称为第三度量值。
在一种可能的实现中,计算第一程序的度量值所用的字节码也可以是被加载到内存的第一程序的全部Class文件的字节码。
在第二种可能的实现方式中,处理器通过检测线程确定第一Class文件已被加载到内存,那么计算第一程序的度量值所用的字节码为被加载到内存的第一程序的全部Class文件的字节码。
具体地,处理器可以通过运行内存扫描线程扫描内存,从而获取被加载到内存的第一程序的全部Class文件的字节码。例如,如果第一程序包括第一Class文件和第三Class文件,且第一Class文件和第三Class文件已被加载到内存,那么处理器可以通过内存扫描线程扫描内存,从而得到获取第一Class文件的字节码和第三Class文件的字节码,并分别计算得到第一度量值和第三度量值。其中,根据第一Class文件的字节码确定的度量值被称为第一度量值,根据第三Class文件的字节码确定的度量值被称为第三度量值。
在一种可能的实现中,如果本申请实施例提供技术方案基于JVMTI实现,上述内存扫描线程可以通过调用GetLoadedClasses函数获取第一程序中已被加载到内存的字节码。
考虑到Class文件的字节码包括方法字节码。其中,方法字节码不会随着程序的运行发生改变,在本申请实施例中,处理器获取第一Class文件的字节码可以指处理器获取第一Class文件的方法字节码。也就是说,第一程序的度量值根据第一程序中被加载到内存的Class文件的方法字节码确定。
下面以第一Class文件为例,介绍处理器获取第一Class文件的方法字节码具体方法。
在确定第一程序满足获取条件之后,处理器先获取第一Class文件的方法字节码在内存中的存储位置,再根据第一Class文件的方法字节码在内存中的存储位置获取第一Class文件的方法字节码。
具体地,处理器可以先获取句柄(Handle)集合,句柄集合包括一个或多个句柄,每个句柄用于标识第一Class文件的方法字节码在第一Class文件的字节码对应的存储空间中的存储位置。接着,处理器根据句柄集合,从内存中第一Class文件的字节码的存储位置查找并获取第一Class文件的方法字节码。
例如,如果第一Class文件包括第一方法字节码和第二方法字节码。其中,第一方法字节码根据JAVA源代码中第一方法代码编译得到,第二方法字节码根据JAVA源代码中第二方法代码编译得到。那么处理器获取的句柄集合包括第一句柄和第二句柄。其中,第一句柄用于指示第一方法字节码在第一Class文件的字节码中的存储位置,第二句柄用于指示第二方法字节码在第一Class文件的字节码中的存储位置。相应地,处理器根据第一句柄的指示从第一Class文件的字节码中查找并获取第一方法字节码,根据第二句柄的指示从第一Class文件的字节码中查找并获取第二方法字节码。
在一种可能的实现中,如果本申请实施例提供技术方案基于JVMTI实现,处理器通过调用GetClassMethods函数获取第一Class文件的句柄集合。在获取句柄集合之后,处理器通过调用GetByteCodes函数获取句柄集合对应的方法字节码。
句柄指示方法字节码在字节码的存储空间中具体的存储位置。在根据句柄获取方法字节码之前,处理器先确定字节码的存储位置。也就是说,在获取第一Class文件的方法字节码的过程中,处理器首先确定第一Class文件的字节码在内存中的存储位置。具体地,处理器可以通过获取第一Class文件对应的指针确定第一Class文件的字节码在内存中的存储位置。其中,第一Class文件的指针指示第一Class文件的字节码在内存中的存储位置例如,处理器可以通过调用GetMethodDeclaringClass函数确定第一Class文件的指针。
如果处理器通过内存扫描线程确定第一程序满足获取条件,处理器可以获取内存中每个Class文件对应的句柄集合,再根据句柄集合分别获取每个Class文件的方法字节码。
在一些可能的实现中,方法字节码包括常量索引字节码,常量索引字节码用于索引常量池中的常量字节码。常量池包括常量字节码和常量索引字节码之间的关联关系。这样,在将JAVA源代码编译为字节码的过程中,可以通过常量索引字节码代替常量字节码。也就是说,根据第一Class文件中方法字节码包括常量索引字节码,不包括常量字节码。一般地,常量索引字节码的长度小于常量字节码的长度,上述编译方法可以减少Class文件的大小。
但是,如果常量池发生改变,根据相同的JAVA源代码编译出的第一Class文件也会发生改变,导致根据第一Class文件确定的度量值发生改变,影响程序完整性的校验结果。这样,在获取到第一Class文件的方法字节码之后,可以将方法字节码中的常量索引字节码替换为常量字节码,以确保度量值的准确性。如此,可以减少完整性校验的误报率。
具体地,在获取到第一Class文件的方法字节码之后,处理器先获取第一Class文件对应的常量池,例如可以通过调用GetConstantPool函数获取第一Class文件的常量池。接着,处理器根据常量池确定第一Class文件的方法字节码所包括的常量索引字节码,并根据常量池确定上述常量索引字节码对应的常量字节码,再将第一Class文件的方法字节码中的常量索引字节码替换为对应的常量字节码。
在获取到第一Class文件的方法字节码之后,处理器可以通过Hash算法确定第一Class文件对应的度量值。具体地,处理器可以根据安全Hash算法计算第一Class文件的方法字节码的哈希值,并将计算得到的哈希值作为第一度量值。或者,处理器也可以将第一Class文件的方法字节码作为第一的度量值。
作为一种可能的实现,度量值以Class文件为粒度的。也就是说,不同的Class文件对应不同的度量值。如果第一程序包括第一Class文件和第三Class文件,第一程序的度量值包括第一度量值和的第二度量值。其中,第一度量值根据第一Class文件的方法字节码确定,第二度量值根据第三Class文件的方法字节码确定。
S203:根据基线值和度量值确定第一程序与第二程序是否匹配。
在获取第一程序的度量值之后,处理器根据基线值和度量值确定第一程序与第二程序是否匹配。其中,第一程序与第二程序匹配,表示第一程序与第二程序一致,第一程序未遭到篡改,第一程序的完整性校验通过。可选地,第一程序与第二程序匹配,也可以表示第一程序与第二程序之间的差异在预设范围内。关于获取基线值的详细介绍可以参见图3,这里不再赘述。
如果度量值与基线值匹配,说明第一程序与第二程序匹配。那么处理器确定计算机设备可以安全地继续运行第一程序。如果度量值与基线值不匹配,说明第一程序与第二程序不匹配,处理器确定第一程序遭到篡改,第一程序为不安全的应用程序。那么处理器可以第一程序继续运行,例如可以使得内存中任意一个或多个第一程序的Class文件处于非运行状态。
在确定第一程序的完整性校验结果之后,处理器还可以向管理端发送第一程序的完整性校验结果。其中,管理端可以是用于管理或监控计算机设备的设备,例如可以是服务器等设备。
下面介绍根据基线值和度量值确定第一程序与第二程序是否匹配的具体过程。
根据前文介绍可知,第一程序中每个Class文件对应一个度量值,度量值的粒度为Class文件。相应地,基线值的粒度也为Class文件,第二程序中每个Class文件对应一个度量值。这样,在判断第一程序和第二程序是否匹配时,处理器可以根据某个Class文件的度量值,和该Class文件在第二程序中对应的Class文件的基线值确定该Class文件的校验结果。如果Class文件的基线值与度量值满足校验条件,处理器确定该Class文件的校验结果为匹配。其中,度量值与基线值满足校验条件包括度量值与基线值相等和/或度量值与基线值之差小于预设阈值。如果度量值与基线值不满足校验条件,度量值和基线值不匹配。
例如,假设第二程序包括第二Class文件,且第二Class文件和第一Class文件相对应,那么在判断第一程序与第二程序是否匹配时,处理器根据第一度量值和第一基线值确定第一Class文件的校验结果。其中,第一基线值根据第二Class文件的字节码确定。第一Class文件的校验结果表示第一度量值和第一基线值是否匹配。如果第一度量值和第一基线值匹配,那么第一Class文件的校验结果为匹配;如果第一度量值和第一基线值不匹配,那么第一Class文件的校验结果为不匹配。
假设处理器在上述步骤S202中还获取了第二度量值,第二程序还包括第四Class文件,且第四Class文件和第三Class文件相对应。第二度量值根据第三Class文件的方法字节码确定,那么在判断第一程序与第二程序是否匹配时,处理器还根据第二度量值和第二基线值确定第三Class文件的校验结果。其中,第二基线值根据第四Class文件的字节码确定。第三Class文件的校验结果表示第二度量值和第二基线值是否匹配。如果第二度量值和第二基线值匹配,那么第三Class文件的校验结果为匹配;如果第二度量值和第二基线值不匹配,那么第三Class文件的校验结果为不匹配。
如果第一程序获取了多个Class文件的度量值,处理器分别根据每个Class文件的度量值和基线值确定每个Class文件的校验结果。接着,处理器综合多个Class文件的校验结果确定第一程序与第二程序是否匹配。如果每个Class的校验结果均为匹配,处理器确定第一程序与第二程序匹配;如果任意一个Class的校验结果为不匹配,处理器确定第一程序与第二程序不匹配。也就是说,如果处理器在上述步骤S202中获取了第一度量值和第二度量值,。如果第一基线值与第一度量值不匹配,和/或第二基线值与第二度量值不匹配,即,第一基线值与第一度量值对应的Class文件的校验结果为不匹配,和/或第二基线值与第二度量值对应的Class文件的校验结果为不匹配,那么处理器确定第一程序与第二程序不匹配。如果处理器在上述步骤S202中仅获取了第一度量值和第二度量值,且第一基线值与第一度量值匹配、第二基线值与第二度量值匹配,即,第一基线值与第一度量值对应的Class文件的校验结果为匹配,且第二基线值与第二度量值对应的Class文件的校验结果为匹配,那么处理器确定第一程序与第二程序匹配。
根据上述介绍可知,在第一程序的Class文件被加载到内存之后,获取第一程序的度量值,并将第一程序的度量值和根据第二程序得到的基线值相比较。根据基线值和度量值确定校验结果。如果校验结果表示第一程序和第二程序一致,说明第一程序完整,没有遭到攻击者的篡改。如果校验结果表示第一程序和第二程序不一致,说明第一程序不完整,已被攻击者的篡改。如此,可以确定第一程序的完整性,避免遭到攻击。
另外,根据内存中的Class文件获取度量值,并和基线值相比较,可以判断第一程序所包括的Class文件和第二程序所包括的Class文件是否一致,从而确定第一程序所包括的类文件是否遭到篡改。这样,由于度量值是根据内存中的Class文件确定的,通过比较度量值和基线值就可以判断被加载到内存的第一程序是否遭到篡改。如此,可以判断内存中的第一程序与第二程序是否匹配,从而确定运行中的第一程序是否遭到篡改。
进一步地,通过检测线程或者回调函数,可以在第一程序运行的过程中,动态地对第一程序进行完整性校验。而且,回调函数和检测线程对处理器的性能要求较低,占用的计算资源较少,对第一程序的正常运行的影响较小。
下面结合图3,对技术方案中根据第二程序确定基线值的方法进行介绍。参见图3,该图为本申请实施例提供的基线值获取方法的一种方法流程图,该方法可以包括如下步骤S301-S304。
所述S301-S304可以由计算机设备中的处理器执行。需要说明的是,图3所示实施例中的处理器和图2所示实施例中的处理器为不同的计算机设备中的处理器。
S301:获取第二程序的Class文件集合。
为了获取基线值,处理器先获取第二程序的Class文件集合。Class文件集合包括一个或多个Class文件的标识。具体地,Class文件集合包括第二程序中每个Class文件的标识,用于指示第二程序所包括的Class文件。其中,Class文件集合又被称为类名单(ClassList)。处理器可以通过运行类加载程序获取第二程序的Class文件集合。
S302:根据Class文件集合将Class文件加载到内存。
在获取到Class文件集合之后,处理器根据Class文件集合将第二程序中的多个Class文件从硬盘等存储设备加载到内存,相当于将第二程序中的Class文件加载到。S303:获取每个Class文件的字节码。
在将Class文件加载到内存之后,处理器可以获取Class文件的字节码。与获取度量值的过程类似,处理器可以通过调用GetLoadedClasses函数、GetClassMethods函数、GetByteCodes函数和GetConstantPool函数等函数获取第二程序的每个Class文件的字节码。
S304:根据Class文件的字节码确定基线值。
在获取到第二程序的每个Class文件的字节码之后,处理器根据Class文件的字节码确定基线值。如果第二程序包括多个Class文件,处理器分别为多个Class文件确定基线值。例如,如果第二程序包括第二Class文件和第四Class文件,处理器可以根据第二Class文件的字节码确定第二Class文件对应的基线值。根据第四Class文件的字节码确定第四Class文件对应的基线值。
通过获取第二程序的Class文件集合,可以确定第二程序所包括的多个Class文件。这样,可以全面地获取第二程序的基线值,从而更好地对第一程序进行完整性校验。
根据前文介绍可知,应用程序在运行过程中可能生成动态生成类。在本申请实施例提供的方式中,还可以对动态生成类进行校验。
在本申请实施例中,可以通过动态获取的方式获取动态生成类的基线值。下面结合图4,对技术方案中确定动态生成类的基线值的方法进行介绍。参见图4,该图为本申请实施例提供的动态生成类的基线值的获取方法的一种方法流程图,该方法可以包括如下步骤S401-S403。所述S401-S403可以由计算机设备中的处理器执行。需要说明的是,图4所示实施例中的处理器和图3所示实施例中的处理器为不同的计算机设备中的处理器。在一种可能的实现中,图4所示的技术方案和图2所示的技术方案由同一个处理器执行。
S401:确定类字节码被第一程序生成。
在第一程序运行的过程中,第一程序生成类字节码。处理器可以监控内存中字节码的加载情况。如果检测到类字节码被第一程序生成,说明第一程序在运行过程中生成了动态生成类,处理器继续执行下文所述的步骤S402。
S402:获取类字节码的度量值。
在确定类字节码被第一程序生成之后,处理器获取类字节码的度量值。具体地,处理器采用上述S202所述的步骤获取类字节码的度量值,这里不再赘述。
S403:将类字节码的度量值确定为类字节码的基线值。
在得到类字节码的度量值之后,处理器可以将类字节码的度量值确定为类字节码的基线值并存储在存储设备中。这样,如果在后续运行过程中第一程序生成类字节码,处理器可以根据新生成的类字节码确定度量值,并与类字节码的基线值进行比较,确定类字节码是否遭到篡改。如此,动态地获取动态生成类的基线值,可实现了对动态生成类的完整性校验。
在一种可能的实现中,处理器将第一个得到的类字节码的度量值确定为类字节码的基线值。也就是说,如果得到了类字节码的度量值,且处理器所属的计算机设备并未存储类字节码的基线值,处理器可以将类字节码的度量值确定为类字节码的基线值并存储。这样,在处理器再次得到类字节码的度量值之后,由于计算机设备已存储了类字节码的基线值,处理器将已存储的基线值和得到的度量值相比较,从而对类字节码进行完整性校验。
在一种可能的实现中,在将类字节码的度量值确定为类字节码的基线值之前,处理器先确定类字节码的类生成器完整。其中,类字节码的类生成器为生成类字节码的Class文件。例如,假设第一程序包括第五Class文件,第五Class文件在运行过程中生成类字节码,那么可以将第五Class文件称为类字节码的类生成器。相应地,在将类字节码的度量值确定为类字节码的基线值之前,可以先确定第五Class文件完整。如果第五Class文件不完整,说明书生成类字节码的Class文件可能遭到篡改,类字节码的度量值可能不准确,无法作为基线值。
参见图5,本申请实施例还提供了一种程序完整性校验装置500,该信息接收装置500可以实现图2或图4所示实施例中处理器的功能。该程序完整性校验装置500包括获取单元510和判断单元520。其中,获取单元510,用于实现图2所示实施例中的S202,判断单元520,用于实现图2所示实施例中的S203。
具体的,所述获取单元510,用于响应于第一程序满足获取条件,获取所述第一程序的度量值,所述第一程序包括第一类Class文件,所述度量值包括第一度量值,所述第一度量值是根据被加载到内存的所述第一类文件的字节码确定的,所述获取条件包括所述第一类文件已加载到内存。
所述判断单元520,用于根据基线值和所述度量值确定所述第一程序与第二程序是否匹配,所述第二程序包括第二类文件,所述基线值包括第一基线值,所述第一基线值是根据所述第二类文件的字节码确定的,所述第二类文件为所述第二程序中与所述第一类文件对应的类文件。
具体执行过程请参考上述图2所示实施例中相应步骤的详细描述,这里不再一一赘述。
需要说明的是,本申请实施例中对单元的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。本申请实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。例如,上述实施例中,处理单元和发送单元可以是同一个单元,也不同的单元。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
图6是本申请实施例提供的一种设备600的结构示意图。上文中的程序完整性校验装置500可以通过图6所示的设备来实现。参见图6,该设备600包括至少一个处理器601,通信总线602以及至少一个网络接口604,可选地,该设备600还可以包括存储器603。
处理器601可以是一个通用中央处理器(Central Processing Unit,CPU)、特定应用集成电路(Application-specific Integrated Circuit,ASIC)或一个或多个用于控制本申请方案程序执行的集成电路(Integrated Circuit,IC)。处理器可以用于对报文或数据进行处理,以实现本申请实施例中提供的程序完整性校验方法。
比如,当图6所示的设备实现本申请实施例提供的程序完整性校验方法时,该处理器601可以用于,响应于第一程序满足获取条件,获取所述第一程序的度量值,所述第一程序包括第一类Class文件,所述度量值包括第一度量值,所述第一度量值是根据被加载到内存的所述第一类文件的字节码确定的,所述获取条件包括所述第一类文件已加载到内存;根据基线值和所述度量值确定所述第一程序与第二程序是否匹配,所述第二程序包括第二类文件,所述基线值包括第一基线值,所述第一基线值是根据所述第二类文件的字节码确定的,所述第二类文件为所述第二程序中与所述第一类文件对应的类文件。
通信总线602用于在处理器601、网络接口604和存储器603之间传送信息。
存储器603可以是只读存储器(Read-only Memory,ROM)或可存储静态信息和指令的其它类型的静态存储设备,存储器603还可以是随机存取存储器(Random AccessMemory,RAM)或者可存储信息和指令的其它类型的动态存储设备,也可以是只读光盘(Compact Disc Read-only Memory,CD-ROM)或其它光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其它磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其它介质,但不限于此。存储器603可以是独立存在,通过通信总线602与处理器601相连接。存储器603也可以和处理器601集成在一起。
可选地,存储器603用于存储执行本申请实施例提供的技术方案的程序代码或指令,并由处理器601来控制执行。处理器601用于执行存储器603中存储的程序代码或指令。程序代码中可以包括一个或多个软件模块。可选地,处理器601也可以存储执行本申请实施例提供的技术方案的程序代码或指令,在这种情况下处理器601不需要到存储器603中读取程序代码或指令。
网络接口604可以为收发器一类的装置,用于与其它设备或通信网络通信,通信网络可以为以太网、无线接入网(RAN)或无线局域网(Wireless Local Area Networks,WLAN)等。在本申请实施例中,网络接口604可以用于接收分段路由网络中的其他节点发送的报文,也可以向分段路由网络中的其他节点发送报文。网络接口604可以为以太接口(Ethernet)接口、快速以太(Fast Ethernet,FE)接口或千兆以太(Gigabit Ethernet,GE)接口等。
在具体实现中,作为一种实施例,设备600可以包括多个处理器,例如图6中所示的处理器601和处理器605。这些处理器中的每一个可以是一个单核(single-CPU)处理器,也可以是一个多核(multi-CPU)处理器。这里的处理器可以指一个或多个设备、电路、和/或用于处理数据(例如计算机程序指令)的处理核。
图7是本申请实施例提供的一种设备700的结构示意图。图7所示的设备可以实现本申请实施例提供的程序完整性校验方法。参见图7所示的设备结构示意图,设备700包括主控板和一个或多个接口板。主控板与接口板通信连接。主控板也称为主处理单元(MainProcessing Unit,MPU)或路由处理卡(Route Processor Card),主控板包括CPU和存储器,主控板负责对设备700中各个组件的控制和管理,包括路由计算、设备管理和维护功能。接口板也称为线处理单元(Line Processing Unit,LPU)或线卡(Line Card),用于接收和发送报文。在一些实施例中,主控板与接口板之间或接口板与接口板之间通过总线通信。在一些实施例中,接口板之间通过交换网板通信,在这种情况下设备700也包括交换网板,交换网板与主控板、接口板通信连接,交换网板用于转发接口板之间的数据,交换网板也可以称为交换网板单元(Switch Fabric Unit,SFU)。接口板包括CPU、存储器、转发引擎和接口卡(Interface Card,IC),其中接口卡可以包括一个或多个网络接口。网络接口可以为Ethernet接口、FE接口或GE接口等。CPU与存储器、转发引擎和接口卡分别通信连接。存储器用于存储转发表。转发引擎用于基于存储器中保存的转发表转发接收到的报文,如果接收到的报文的目的地址为设备700的IP地址,则将该报文发送给主控板或接口板的CPU进行处理;如果接收到的报文的目的地址不是设备700的IP地址,则根据该目的地查转发表,如果从转发表中查找到该目的地址对应的下一跳和出接口,将该报文转发到该目的地址对应的出接口。转发引擎可以是网络处理器(Network Processor,NP)。接口卡也称为子卡,可安装在接口板上,负责将光电信号转换为数据帧,并对数据帧进行合法性检查后转发给转发引擎处理或接口板CPU。在一些实施例中,CPU也可执行转发引擎的功能,比如基于通用CPU实现软转发,从而接口板中不需要转发引擎。在一些实施例中,转发引擎可以通过ASIC或现场可编程门阵列(Field Programmable Gate Array,FPGA)实现。在一些实施例中,存储转发表的存储器也可以集成到转发引擎中,作为转发引擎的一部分。
本申请实施例还提供一种芯片系统,包括:处理器,所述处理器与存储器耦合,所述存储器用于存储程序或指令,当所述程序或指令被所述处理器执行时,使得该芯片系统实现上述图2所示实施例中处理器执行的程序完整性校验方法,或使得该芯片系统实现上述图3所示实施例中处理器执行的基线值确定方法,或使得该芯片系统实现上述图4所示实施例中处理器执行的动态生成类的基线值确定方法。
可选地,该芯片系统中的处理器可以为一个或多个。该处理器可以通过硬件实现也可以通过软件实现。当通过硬件实现时,该处理器可以是逻辑电路、集成电路等。当通过软件实现时,该处理器可以是一个通用处理器,通过读取存储器中存储的软件代码来实现。可选地,该芯片系统中的存储器也可以为一个或多个。该存储器可以与处理器集成在一起,也可以和处理器分离设置,本申请并不限定。示例性的,存储器可以是非瞬时性处理器,例如只读存储器ROM,其可以与处理器集成在同一块芯片上,也可以分别设置在不同的芯片上,本申请对存储器的类型,以及存储器与处理器的设置方式不作具体限定。
示例性的,该芯片系统可以是FPGA,可以是ASIC,还可以是系统芯片(System onChip,SoC),还可以是CPU,还可以是NP,还可以是数字信号处理电路(Digital SignalProcessor,DSP),还可以是微控制器(Micro Controller Unit,MCU),还可以是可编程控制器(Programmable Logic Device,PLD)或其他集成芯片。
应理解,上述方法实施例中的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。结合本申请实施例所公开的方法步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
本申请实施例还提供了一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行以上方法实施例提供的、由处理器执行的程序完整性校验方法。
本申请实施例还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行以上方法实施例提供的、由处理器执行的程序完整性校验方法。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑模块划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要获取其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各模块单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件模块单元的形式实现。
所述集成的单元如果以软件模块单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已。
以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。

Claims (31)

1.一种程序完整性校验方法,其特征在于,所述方法,包括:
响应于第一程序满足获取条件,获取所述第一程序的度量值,所述第一程序包括第一类Class文件,所述度量值包括第一度量值,所述第一度量值是根据被加载到内存的所述第一类文件的字节码确定的,所述获取条件包括所述第一类文件已加载到内存;
根据基线值和所述度量值确定所述第一程序与第二程序是否匹配,所述第二程序包括第二类文件,所述基线值包括第一基线值,所述第一基线值是根据所述第二类文件的字节码确定的,所述第二类文件为所述第二程序中与所述第一类文件对应的类文件。
2.根据权利要求1所述的方法,其特征在于,所述响应于第一程序满足获取条件,包括:
确定第一回调函数被触发,所述第一回调函数被触发指示所述第一类文件已加载到内存。
3.根据权利要求2所述的方法,其特征在于,所述第一类文件包括第一方法代码,所述第一程序通过运行所述第一方法代码执行所述第一类文件对应的方法,所述第一回调函数被触发指示所述第一方法代码进入待运行状态。
4.根据权利要求1-3任一项所述的方法,其特征在于,所述响应于第一程序满足获取条件,包括:
确定运行内存扫描线程,所述内存扫描线程用于获取所述第一类文件的字节码。
5.根据权利要求1-6任一项所述的方法,其特征在于,所述获取所述第一程序的度量值,包括:
获取所述被加载到内存的所述第一类文件的方法字节码;
根据所述第一类文件对应的方法字节码确定所述第一度量值。
6.根据权利要求1-5任一项所述的方法,其特征在于,所述根据基线值和所述度量值确定所述第一程序与第二程序是否匹配,包括:
根据所述第一基线值与所述第一度量值确定所述第一类文件的校验结果;
根据所述第一类文件的校验结果,确定所述第一程序与所述第二程序是否匹配。
7.根据权利要求1-6任一项所述的方法,其特征在于,所述第一度量值包括所述第一类文件对应的字节码的哈希Hash值。
8.根据权利要求5所述的方法,其特征在于,所述获取所述第一类文件对应的方法字节码包括:
获取句柄集合,所述句柄集合包括一个或多个句柄,所述一个或多个句柄用于标识所述第一类文件对应的方法字节码在所述内存中的存储位置;
根据所述句柄集合,从所述内存中的存储位置获取所述第一类文件对应的方法字节码。
9.根据权利要求1-8任一项所述的方法,其特征在于,在所述根据基线值和所述度量值确定校验结果之前,所述方法还包括:
使得所述内存中任意一个类文件处于非运行状态。
10.根据权利要求1-9任一项所述的方法,其特征在,所述第一程序包括第三类文件,所述方法还包括:
获取类字节码的度量值,所述类字节码是根据所述第三类文生成并存储到内存中的;
将所述类字节码的度量值确定为所述类字节码的基线值。
11.根据权利要求10所述的方法,其特征在于,所述将所述类字节码的度量值确定为所述类字节码的基线值之前,所述方法包括:
确定所述第三类文件与所述第二程序中与所述第三类文件对应的类文件的校验结果为匹配。
12.根据权利要求1-11任一项所述的方法,其特征在于,所述方法还包括:
向管理端发送所述第一程序的校验结果。
13.根据权利要求1-12任一项所述的方法,其特征在于,所述方法还包括:
响应于所述第一程序与第二程序不匹配,使得所述内存中任意一个类文件处于非运行状态。
14.根据权利要求1-13任一项所述的方法,其特征在于,所述目标程序为基于JAVA开发的应用程序。
15.一种程序完整性校验装置,其特征在于,所述装置包括:
获取单元,用于响应于第一程序满足获取条件,获取所述第一程序的度量值,所述第一程序包括第一类Class文件,所述度量值包括第一度量值,所述第一度量值是根据被加载到内存的所述第一类文件的字节码确定的,所述获取条件包括所述第一类文件已加载到内存;
判断单元,用于根据基线值和所述度量值所述第一程序与第二程序是否匹配,所述第二程序包括第二类文件,所述基线值包括第一基线值,所述第一基线值是根据所述第二类文件的字节码确定的,所述第二类文件为所述第二程序中与所述第一类文件对应的类文件。
16.根据权利要求15所述的装置,其特征在于,
所述获取单元,用于确定第一回调函数被触发,所述第一回调函数被触发指示所述第一类文件已加载到内存。
17.根据权利要求16所述的装置,其特征在于,所述第一类文件包括第一方法代码,所述第一程序通过运行所述第一方法代码执行所述第一类文件对应的方法,所述第一回调函数被触发指示所述第一方法代码进入待运行状态。
18.根据权利要求15-17任一项所述的装置,其特征在于,
所述获取单元,用于确定运行内存扫描线程,所述内存扫描线程用于获取所述第一类文件的字节码。
19.根据权利要求15-18任一项所述的装置,其特征在于,
所述获取单元,用于获取所述被加载到内存的所述所述第一类文件对应的方法字节码;根据所述第一类文件对应的方法字节码确定所述第一度量值。
20.根据权利要求15-19任一项所述的装置,其特征在于,
所述判断单元,用于根据所述第一基线值与所述第一度量值确定所述第一类文件的校验结果;根据所述第一类文件的校验结果,确定所述第一程序与所述第二程序是否匹配。
21.根据权利要求15-20任一项所述的装置,其特征在于,所述第一度量值包括所述第一类文件对应的字节码的哈希Hash值。
22.根据权利要求19所述的装置,其特征在于,
所述获取单元,用于获取句柄集合,所述句柄集合包括一个或多个句柄,所述一个或多个句柄用于标识所述第一类文件对应的方法字节码在所述内存中的存储位置;根据所述句柄集合,从所述内存中的存储位置获取所述第一类文件对应的方法字节码。
23.根据权利要求15-22任一项所述的装置,其特征在于,
所述判断单元,用于使得所述内存中任意一个类文件处于非运行状态。
24.根据权利要求15-23任一项所述的装置,其特征在,所述第一程序包括第三类文件,所述获取单元,还用于获取类字节码的度量值,所述类字节码是根据所述第三类文生成并存储到内存中的;将所述类字节码的度量值确定为所述类字节码的基线值。
25.根据权利要求24所述的装置,其特征在于,
所述获取单元,还用于确定所述第三类文件与所述第二程序中与所述第三类文件对应的类文件的校验结果为匹配。
26.根据权利要求15-25任一项所述的装置,其特征在于,
所述判断单元,用于向管理端发送所述第一程序件的校验结果。
27.根据权利要求15-26任一项所述的装置,其特征在于,
所述判断单元,用于响应于所述第一程序与第二程序不匹配,使得所述内存中任意一个类文件处于非运行状态。
28.根据权利要求15-27任一项所述的装置,其特征在于,所述目标程序为基于JAVA开发的应用程序。
29.一种通信装置,其特征在于,所述通信装置包括:
存储器,包括指令;
处理器,当所述处理器执行所述指令时,使得所述通信装置执行如权利要求1-14任一项所述的程序完整性校验方法。
30.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时,实现如权利要求1-14任一项所述的程序完整性校验方法。
31.一种计算机程序产品,其特征在于,包括程序,当所述程序在处理器上运行时,执行如权利要求1-14任一项所述的程序完整性校验方法。
CN202210116485.5A 2022-02-07 2022-02-07 一种程序完整性校验方法及装置 Pending CN116595517A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210116485.5A CN116595517A (zh) 2022-02-07 2022-02-07 一种程序完整性校验方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210116485.5A CN116595517A (zh) 2022-02-07 2022-02-07 一种程序完整性校验方法及装置

Publications (1)

Publication Number Publication Date
CN116595517A true CN116595517A (zh) 2023-08-15

Family

ID=87597810

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210116485.5A Pending CN116595517A (zh) 2022-02-07 2022-02-07 一种程序完整性校验方法及装置

Country Status (1)

Country Link
CN (1) CN116595517A (zh)

Similar Documents

Publication Publication Date Title
US8931086B2 (en) Method and apparatus for reducing false positive detection of malware
US9262637B2 (en) System and method for verifying integrity of platform object using locally stored measurement
US8196203B2 (en) Method and apparatus for determining software trustworthiness
US12111937B2 (en) Memory scan-based process monitoring
CN107276851B (zh) 一种节点的异常检测方法、装置、网络节点及控制台
US11283812B2 (en) Trustworthiness evaluation of network devices
US11455395B2 (en) Perform verification check in response to change in page table base register
US8554908B2 (en) Device, method, and storage medium for detecting multiplexed relation of applications
WO2022028081A1 (zh) 一种完整性度量方法和完整性度量装置
JP2006146600A (ja) 動作監視サーバ、端末装置及び動作監視システム
CN110287049B (zh) 数据处理方法、装置和存储介质
CN116595517A (zh) 一种程序完整性校验方法及装置
JP7104574B2 (ja) コンピュータ資産管理システムおよびコンピュータ資産管理方法
JP2017199250A (ja) 計算機システム、データの分析方法、及び計算機
CN110716818B (zh) 一种异常处理方法、装置、硬件保护设备及存储介质
CN114095227A (zh) 一种数据通信网关可信认证方法、系统及电子设备
JP6041727B2 (ja) 管理装置、管理方法及び管理プログラム
US10810098B2 (en) Probabilistic processor monitoring
US20240028713A1 (en) Trust-based workspace instantiation
KR102006232B1 (ko) 복수개의 디바이스 정보 종합 분석을 통한 디바이스 이상 징후 탐지 방법 및 그 장치
Voit et al. DYNAMIC DEVICE COMPROMISE FOOTPRINT PRE-FILTERING
CN108205624B (zh) 电子装置及检测恶意文件的方法
CN112131584A (zh) 保证bios和bmc之间传输数据准确的方法、系统、设备及介质
CN117835240A (zh) 一种定制rom识别方法、装置、电子设备及介质
CN118093722A (zh) 基于区块链的数据处理方法、装置、设备及介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination