CN110598378B - 全局偏移表度量方法、动态度量方法及相关装置、设备 - Google Patents

全局偏移表度量方法、动态度量方法及相关装置、设备 Download PDF

Info

Publication number
CN110598378B
CN110598378B CN201910707930.3A CN201910707930A CN110598378B CN 110598378 B CN110598378 B CN 110598378B CN 201910707930 A CN201910707930 A CN 201910707930A CN 110598378 B CN110598378 B CN 110598378B
Authority
CN
China
Prior art keywords
address
global offset
offset table
length
measured
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.)
Active
Application number
CN201910707930.3A
Other languages
English (en)
Other versions
CN110598378A (zh
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 CN201910707930.3A priority Critical patent/CN110598378B/zh
Publication of CN110598378A publication Critical patent/CN110598378A/zh
Application granted granted Critical
Publication of CN110598378B publication Critical patent/CN110598378B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/64Protecting data integrity, e.g. using checksums, certificates or signatures
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

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

Abstract

本申请实施例公开了一种GOT表度量方法,该方法在进程运行的过程中,获取GOT表的起始地址和长度,以便根据上述GOT表的起始地址和长度确定出完整的需要度量的GOT表,该GOT表具体包括进程的GOT表和进程所依赖的动态库的GOT表;进而,通过对所确定的GOT表中每个元素进行完整性度量,或者通过对该GOT表整体进行完整性度量,实现对于GOT表的完整性度量。由此在对软件完整性进行动态度量的过程中增加了对于GOT表的完整性度量。

Description

全局偏移表度量方法、动态度量方法及相关装置、设备
技术领域
本申请涉及高级持续性威胁防御技术领域,具体涉及一种全局偏移表度量方法、动态度量方法及相关装置、设备。
背景技术
高级可持续威胁攻击(advanced persistent threat,APT)又被称为定向威胁攻击,是指某组织针对特定对象展开的持续有效的攻击活动。目前,APT攻击日益盛行,攻击者可以通过植入恶意软件或者篡改系统软件等方式,达到窃听隐私、非法获取利益等目的,对网络安全带来了极大的挑战。
目前,很多机构和企业主要利用软件完整性保护技术防御APT攻击,软件完整性技术可以通过对软件整个生命周期的各个阶段进行保护,达到防御APT攻击的目的。如图1所示,软件完整性保护技术在软件的开发发布阶段,通过对软件进行数字签名来保证软件的完整性;在软件启动、加载和升级阶段,通过数字签名验证、可信启动及远程证明技术等保证软件的完整性;在软件运行的过程中,通过动态度量方法对可执行程序运行时的完整性进行度量。
基于现有的动态度量方法对可执行程序的完整性进行度量时,主要关注需要度量的程序对应的代码段的完整性,以及该程序所依赖的动态库代码段的完整性,上述二者的完整性校验通过,即可认为该程序未被篡改。然而,经发明人研究发现,这种动态度量方法并未全面地考虑程序运行过程中各个需要度量的因素,在一些情况下,这种动态度量方法仍存在防御漏洞,无法达到最佳的防御效果。
发明内容
本申请实施例提供了一种全局偏移表度量方法、动态度量方法及相关装置、设备,在对软件进行动态度量的过程中,额外增加了对全局偏移表(global offset table,GOT)的完整性度量,保证对程序运行过程中涉及的相关因素进行更全面的度量,从而达到更好的防御效果。
有鉴于此,本申请第一方面提供了一种GOT表度量方法,该方法在进程运行的过程中,获取GOT表的起始地址和长度,以便根据上述GOT表的起始地址和长度确定出完整的需要度量的GOT表,该GOT表具体包括进程的GOT表和进程所依赖的动态库的GOT表;进而,通过对所确定的GOT表中每个元素进行完整性度量,或者通过对该GOT表整体进行完整性度量,实现对于GOT表的完整性度量。本申请考虑到GOT表在程序运行的过程中起着极为重要的作用,因此,在对软件完整性进行动态度量的过程中增加了对于GOT表的完整性度量,并且相应地提出了一套适用于度量GOT表完整性的机制,基于该机制实现对于GOT表完整性的准确度量。
在本申请实施例第一方面的第一种实现方式中,可以通过以下方式获取GOT表的起始地址和长度:基于进程的进程描述符查找程序头,并根据该程序头确定动态段的偏移地址;然后根据程序头对应的文件类型以及动态段的偏移地址,确定动态段的实际地址;进而,基于动态段的实际地址对该动态段进行访问,并从该动态段中获取参考元素;最终,基于该参考元素确定GOT表的起始地址和长度。由此,可以通过上述获取GOT表的起始地址和长度的方式,准确地定位所要度量的GOT表,即准确地获取到待度量的GOT表。
在本申请实施例第一方面的第二种实现方式中,可以进一步通过以下方式确定动态段的偏移地址:根据进程描述符查找进程运行时依赖的虚拟地址空间;并基于该虚拟地址空间中用于指示程序头的内存位置的元素,查找程序头;最终根据程序头中用于指示动态段的偏移地址的元素,确定动态段的偏移地址。由此,可以通过上述确定动态段的偏移地址的方式,准确地定位动态段的偏移地址。
在本申请实施例第一方面的第三种实现方式中,可以进一步通过以下方式确定动态段的实际地址:当程序头对应的文件类型为可执行程序时,确定动态段的偏移地址为动态段的实际地址;当程序头对应的文件类型为动态库时,计算进程的加载地址与动态段的实际地址的和值,作为动态段的实际地址。由此,可以通过上述确定动态段的实际地址的方式,准确地定位动态段的实际地址。
在本申请实施例第一方面的第四种实现方式中,在上述第二种实现方式中获取的参考元素包括GOT表地址参考元素、PLT表元素长度参考元素和PLT表长度参考元素的情况下,可以进一步通过以下方式确定GOT表的起始地址和长度:根据GOT表地址参考元素,确定GOT表的参考起始地址;根据PLT表元素长度参考元素,确定PLT表中每个元素的元素长度;根据PLT表长度参考元素,确定PLT表的总长度;然后,根据PLT表的总长度、PLT表中每个元素的元素长度以及GOT表的元素长度,计算GOT表的长度;根据GOT表的参考起始地址以及GOT表的元素长度,计算GOT表的起始地址。由此,可以通过上述确定GOT表的起始地址和长度方式,准确地确定GOT表的起始地址和长度。
在本申请实施例第一方面的第五种实现方式中,在根据GOT表的起始地址和长度对该GOT表中的每个元素进行完整性度量之前,可以先对GOT表对应的ELF文件进行签名校验,待签名校验通过后,再根据GOT表的起始地址和长度对该GOT表中的每个元素进行完整性度量。由此,确保对GOT表进行完整性度量时所基于的ELF文件为未被篡改的文件,进而保证对于GOT表的完整性度量的可靠性。
在本申请实施例第一方面的第六种实现方式中,可以通过以下方式对GOT表中的每个元素进行完整性度量:访问GOT表对应的ELF文件中的PLT表,根据GOT表中待度量元素对应的PLT表元素确定该待度量元素对应的函数名称;确定该待度量元素落入的虚拟地址空间,并获取该虚拟地址空间对应的文件名;对该文件名对应的ELF文件进行签名校验,签名校验通过后,在该文件名对应的ELF文件中找到待度量元素对应的函数名称,并根据该函数名称对应的标识确定待度量元素对应的函数是否已被重定向;若已被重定向,则采用第一度量策略对待度量元素进行完整性度量,若未被重定向,则采用第二度量策略对待度量元素进行完整性度量。由此,基于上述方式对GOT表中每个元素逐一进行完整性度量,保证准确地衡量GOT表中的每个元素是否已被篡改。
在本申请实施例第一方面的第七种实现方式中,上述第一度量策略具体为:当上述ELF文件为可执行程序时,将待度量元素对应的函数在该ELF文件中的偏移地址与待度量元素进行对比,得到待度量元素对应的完整性校度量结果;当上述ELF文件为动态库时,计算该ELF文件的加载地址与待度量元素对应的函数在ELF文件中的偏移地址的和值,将该和值与待度量元素进行对比,得到待度量元素对应的完整度量结果。
在本申请实施例第一方面的第八种实现方式中,上述第二度量策略具体为:当上述ELF文件为可执行程序时,将待度量元素对应的函数在该ELF文件的GOT表中的取值与待度量元素进行对比,得到待度量元素的完整性度量结果;当上述ELF文件为动态库时,计算待度量元素对应的函数在该ELF文件的GOT表中的取值与ELF文件的加载地址的和值,将该和值与待度量元素进行对比,得到待度量元素对应的完整性度量结果。
在本申请实施例第一方面的第九种实现方式中,若要对GOT表整体进行完整性度量,则在获取GOT表的起始地址和长度之前,先在进程加载的过程中,通过重定向编译选项完成对于GOT表的重定向,并将重定向后的GOT表设置为只读属性;进而,在对GOT表整体进行完整性度量时,根据该GOT表的起始地址和长度计算该GOT表整体对应的哈希值,再将该哈希值与GOT表对应的度量基线值进行对比,得到该GOT表对应的完整性度量结果。由此,从度量GOT表整体的角度出发,实现对于GOT表的完整性度量。
本申请第二方面提供了一种动态度量方法,该方法在对软件完整性进行度量的过程中,同时对进程的代码段、进程所依赖的动态库代码段和GOT表(进程的GOT表和进程所依赖的动态库的GOT表)进行了完整性度量,保证对程序运行时涉及的相关因素进行更加全面的动态度量。具体的,该动态度量方法在进程运行的过程中,获取该进程的代码段的起始地址和长度、该进程所依赖的动态库代码段的起始地址和长度,以及GOT表的起始地址和长度;进而,根据代码段的起始地址和长度相应地计算代码段对应的哈希(hash)值,将该hash值与预存的该代码段对应的度量基线值进行对比,确定代码段对应的完整性度量结果;根据动态库代码段的起始地址和长度计算动态库代码段对应的hash值,将该hash值与预存的该动态库代码段对应的度量基线值进行对比,确定动态库代码段对应的完整性度量结果;采用上述第一方面提及的任意一种GOT表度量方法,基于GOT表的起始地址和长度对GOT表的完整性进行度量,得到该GOT表对应的完整性度量结果;最终,根据上述代码段对应的完整性度量结果、动态库代码段对应的完整性度量结果和GOT表对应的完整性度量结果,确定软件完整性度量结果。
上述动态度量方法在对进程的代码段以及进程所依赖的动态库代码段进行完整性度量的基础上,进一步对GOT表进行了度量,对程序运行过程中涉及的相关因素进行了更全面的度量,减少防御漏洞,保证达到更好的防御效果。
本申请第三方面提供了一种全局偏移表度量装置,所述装置包括:
获取模块,用于在进程运行的过程中,获取全局偏移表的起始地址和长度;所述全局偏移表包括所述进程的全局偏移表和所述进程依赖的动态库的全局偏移表;
度量模块,用于根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量,或者对所述全局偏移表整体进行完整性度量。
在本申请实施例第三方面的第一种实现方式中,所述获取模块包括:
偏移地址确定单元,用于通过所述进程的进程描述符查找程序头,并根据所述程序头确定动态段的偏移地址;
实际地址确定单元,用于根据所述程序头对应的的文件类型以及所述动态段的偏移地址,确定所述动态段的实际地址;
参考元素获取单元,用于基于所述动态段的实际地址访问所述动态段,从所述动态段中获取参考元素;
全局偏移表确定单元,用于根据所述参考元素,确定所述全局偏移表的起始地址和长度。
在本申请实施例第三方面的第二种实现方式中,所述偏移地址确定单元具体用于:
通过所述进程描述符,查找所述进程运行时依赖的虚拟地址空间;
基于所述虚拟地址空间中用于指示程序头的内存位置的元素,查找所述程序头;
根据所述程序头中用于指示动态段的偏移地址的元素,确定所述动态段的偏移地址。
在本申请实施例第三方面的第三种实现方式中,所述实际地址确定单元具体用于:
当所述程序头对应的文件类型为可执行程序时,确定所述动态段的偏移地址为所述动态段的实际地址;
当所述程序头对应的文件类型为动态库时,确定所述进程的加载地址与所述动态段的实际地址的和值为所述动态段的实际地址。
在本申请实施例第三方面的第四种实现方式中,所述参考元素包括:全局偏移表地址参考元素、PLT表元素长度参考元素和PLT表长度参考元素;则所述全局偏移表确定单元具体用于:
根据所述全局偏移表地址参考元素,确定所述全局偏移表的参考起始地址;根据所述PLT表元素长度参考元素,确定PLT表中每个元素的元素长度;根据所述PLT表长度参考元素,确定所述PLT表的总长度;
根据所述PLT表的总长度、所述PLT表中每个元素的元素长度以及所述全局偏移表的元素长度,计算所述全局偏移表的长度;
根据所述全局偏移表的参考起始地址以及所述全局偏移表的元素长度,计算所述全局偏移表的起始地址。
在本申请实施例第三方面的第五种实现方式中,所述装置还包括:
校验模块,用于对所述全局偏移表对应的可执行与可链接格式ELF文件进行签名校验;签名校验通过后,执行所述根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量。
在本申请实施例第三方面的第六种实现方式中,所述度量模块包括:
函数名称确定单元,用于访问所述全局偏移表对应的ELF文件中的PLT表,根据所述全局偏移表中待度量元素对应的PLT表元素,确定所述待度量元素对应的函数名称;
文件名获取单元,用于确定所述待度量元素落入的虚拟地址空间,并获取所述虚拟地址空间对应的文件名;
签名校验单元,用于对所述文件名对应的ELF文件进行签名校验;
函数类型确定单元,用于签名校验通过后,在所述文件名对应的ELF文件找到所述函数名称,并确定所述待度量元素对应的函数是否已被重定向;
完整性度量单元,用于若已被重定向,则采用第一度量策略对所述待度量元素进行完整性度量;若未被重定向,则采用第二度量策略对所述待度量元素进行完整性度量。
在本申请实施例第三方面的第七种实现方式中,所述第一度量策略包括:
当所述ELF文件为可执行程序时,将所述待度量元素对应的函数在所述ELF文件中的偏移地址与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果;
当所述ELF文件为动态库时,将所述ELF文件的加载地址与所述待度量元素对应的函数在所述ELF文件中的偏移地址的和值与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果。
在本申请实施例第三方面的第八种实现方式中,所述第二度量策略包括:
当所述ELF文件为可执行程序时,将所述待度量元素对应的函数在所述ELF文件的全局偏移表中的取值与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果;
当所述ELF文件为动态库时,将所述待度量元素对应的函数在所述ELF文件的全局偏移表中的取值与所述ELF文件的加载地址的和值与待度量元素进行对比,得到所述待度量元素对应的完整性度量结果。
在本申请实施例第三方面的第九种实现方式中,对所述全局偏移表整体进行完整性度量时,所述装置还包括:
重定向模块,用于在进程加载过程中,通过重定向编译选项完成对于所述全局偏移表的重定向,并将重定向后的全局偏移表设置为只读属性;
则所述度量模块具体用于:
根据所述全局偏移表的起始地址和长度,计算所述全局偏移表整体对应的哈希值;
将所述哈希值与所述全局偏移表对应的度量基线值进行对比,得到所述全局偏移表对应的完整性度量结果。
本申请第四方面提供了一种动态度量装置,所述装置包括:
获取模块,用于在进程运行的过程中,获取所述进程的代码段的起始地址和长度,以及所述进程所依赖的动态库代码段的起始地址和长度,以及全局偏移表的起始地址和长度,所述全局偏移表包括所述进程的全局偏移表和所述进程依赖的动态库的全局偏移表;
第一度量模块,用于根据所述代码段的起始地址和长度,计算所述代码段对应的哈希值,将所述代码段对应的哈希值与所述代码段对应的度量基线值进行对比,得到所述代码段对应的完整性度量结果;
第二度量模块,用于根据所述动态库代码段的起始地址和长度,计算所述动态库代码段对应的哈希值,将所述动态库代码段对应的哈希值与所述动态库代码段对应的度量基线值进行对比,得到所述动态库代码段对应的完整性度量结果;
第三度量模块,用于根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量,或者对所述全局偏移表整体进行完整性度量,得到所述全局偏移表对应的完整性度量结果;
第四度量模块,用于根据所述代码段对应的完整性度量结果、所述动态库代码段对应的完整性度量结果和所述全局偏移表对应的完整性度量结果,确定软件完整性度量结果。
本申请第五方面提供了一种设备,所述设备包括:处理器以及存储器;
所述存储器用于存储计算机程序,并将所述计算机程序传输给所述处理器;
所述处理器用于根据所述计算机程序中的指令执行第一方面所述的方法。
本申请第六方面提供了一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如第一方面所述的方法。
附图说明
图1为相关技术中软件完整性保护技术的实现示意图;
图2为相关技术中动态度量方法的实现原理示意图;
图3为相关技术中通过修改GOT表劫持控制流的实现示意图;
图4为本申请实施例提供的可信度量系统的结构示意图;
图5为本申请实施例提供的一种GOT表度量方法的流程示意图;
图6为本申请实施例提供的获取GOT表的起始地址和长度的示意图;
图7为本申请实施例提供的度量GOT表中元素的完整性的示意图;
图8为本申请实施例提供的基于本申请中的GOT表度量方法检测到攻击的示意图;
图9为本申请实施例提供的另一种GOT表度量方法的流程示意图;
图10为本申请实施例提供的一种动态度量方法的流程示意图;
图11为本申请实施例提供的一种GOT表度量装置的结构示意图;
图12为本申请实施例提供的一种动态度量装置的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
相关技术中动态度量方法的实现原理如图2所示,在软件包发布时,针对该软件包中需要度量的进程,计算该进程的代码段对应的hash值作为该代码段对应的度量基线值,计算该进程所依赖的动态库代码段对应的hash值作为该动态库代码段对应的度量基线值,进而,将如此计算得到的各代码段各自对应的度量基线值和各动态库代码段各自对应的度量基线值存储至硬件可信环境中。
在进程运行的过程中,可以周期性地触发开启度量任务,或者响应于用户的相关操作触发开启度量任务。开启度量任务后,运行在硬件可信环境中的度量模块通过遍历进程内存描述符(mm_struct),确定进程的代码段以及进程所依赖的动态库代码段的起始地址和长度,进而分别计算该代码段对应的hash值和动态库代码段对应的hash值,将该代码段对应的hash值与该代码段对应的度量基线值进行对比,将该动态库代码段对应的hash值与该动态库代码段对应的度量基线值进行对比,若对比结果表明代码段对应的hash值与该代码段对应的度量基线值不一致,和/或动态库代码段对应的hash值与该动态库代码段对应的度量基线值不一致,则说明代码段和/或动态库代码段已被篡改。如此,实现对于软件运行过程中软件完整性的检查,及时监测是否存在恶意代码的植入。
然而,经发明人研究发现,上述图2所示的动态度量方法仅对进程的代码段以及进程所依赖的动态库代码段进行了完整性度量,而忽视了在进程运行过程中起着重要作用的GOT表。
具体的,在当前较为常用的操作系统如linux系统中,进程调用其所依赖的动态库代码段中定义的函数时,通常需要通过GOT表进行重定位来获取函数的真实地址,进而实现对于函数的访问;一旦GOT表被篡改,不法分子即可实现对于进程控制流的劫持,并实施攻击。如图3所示,进程原本期望调用动态库中的check_password函数对用户的密码进行检测,再依据检测结果确定后续所需执行的操作,但是由于GOT表受到篡改,将导致进程调用恶意动态库中的bypass_password函数,使得不法分子可以直接通过密码检测,如此劫持了进程控制流。
基于上述发明人的发现结果,本申请实施例提供了一种GOT表度量方法,该方法提出了针对于GOT表的完整性度量机制,通过对GOT表中每个元素进行完整性度量,或者通过对GOT表整体进行完整性度量,实现对于GOT表的完整性度量。如此,在对软件完整性进行动态度量的过程中,可以基于本申请提供的GOT表完整性度量机制对GOT表的完整性进行度量,保证对程序运行期间GOT表的完整性进行监测,防止因GOT表被篡改而导致程序控制流被劫持。
此外,本申请实施例还进一步提供了一种动态度量方法,该动态度量方法在图2所示的动态度量方法的基础上,将本申请实施例提供的GOT表度量方法融入其中,即在对软件完整性进行动态度量的过程中,同时对进程的代码段的完整性、进程所依赖的动态库代码段的完整性以及GOT表的完整性进行度量,由此保证对进程运行时涉及的各个因素进行全面度量,减少防御漏洞,保证达到更好的防御效果。
应理解,本申请实施例提供的GOT表度量方法和动态度量方法可以应用于任意一种计算机系统中,具体可以应用于计算机系统中的可信度量系统,下面对本申请实施例提供的GOT表度量方法和动态度量方法适用的可信度量系统进行介绍。
参见图4,图4为本申请实施例提供的可信度量系统的结构示意图。如图4所示,该可信度量系统包括:安全芯片410和动态度量管理模块420。其中,安全芯片410具体可以为TPM(trusted Platform module)安全芯片;动态度量管理模块420具体包括:度量代理单元421和内核度量单元422。
对软件完整性进行度量时,可信度量系统可以基于安全芯片410的可信启动保证启动过程的可信;进而,将信任链传递至动态度量管理模块420,动态度量管理模块420中的度量代理单元421接收到用户空间发起的度量请求后,进一步将该度量请求传输至内核度量单元422,内核度量单元422相应地针对需要度量的进程或模块计算相关度量数据,并将计算得到的度量数据与预存的度量基线值进行对比,从而确定软件完整性度量结果。
应理解,上述相关度量数据在本申请中具体可以指待度量代码段的hash值、待度量动态库代码段的hash值以及对GOT表进行度量时所需计算的值。
下面通过两个实施例分别对基于GOT表中每个元素进行GOT表完整性度量,以及基于GOT表整体进行GOT表完整性度量的实现方式进行介绍。
参见图5,图5为本申请实施例提供的一种GOT表度量方法的流程示意图,该方法通过对GOT表中每个元素进行完整性度量,实现对于GOT表的完整性度量。如图5所示,该方法包括以下步骤:
步骤501:在进程运行的过程中,获取GOT表的起始地址和长度;所述GOT表包括进程的GOT表和进程依赖的动态库的GOT表。
在进程运行的过程中,动态度量管理模块可以周期性地对GOT表的完整性进行度量,和/或响应于用户触发的度量请求对GOT表的完整性进行度量。此时,动态度量管理模块需要获取GOT表的起始地址和长度,以便基于所获取的GOT表的起始地址和长度获取到实际需要度量的GOT表。
具体获取GOT表的起始地址和长度时,动态度量管理模块可以通过该进程的进程描述符查找程序头,并根据该程序头确定动态段(.dynamic段)的偏移地址;然后,根据程序头对应的文件类型以及.dynamic段的偏移地址,进一步确定.dynamic段的实际地址;进而,基于.dynamic段的实际地址对该.dynamic段进行访问,以从该.dynamic段中获取到可以用于确定GOT表的起始地址和长度的参考元素;最终,基于所获取的参考元素,确定GOT表的起始地址和长度。
下面结合图6对上述获取GOT表的起始地址和长度的实现方式做详细的介绍。一些操作系统如linux系统等通常会利用进程描述符来描述每个进程,该进程描述符的数据类型具体可以为task_struct结构体,其中包含了描述该进程所需的所有信息。通过该进程描述符可以找到该进程的内存描述符,该内存描述符的数据类型具体可以为mm_struct结构体,基于该内存描述符可以进一步找到进程空间的每一段虚拟地址空间,即该进程运行时所依赖的虚拟地址空间,虚拟地址空间通常用vma_struct结构体来描述。
找到进程空间的每一段虚拟地址空间后,可以基于虚拟地址空间中用于指示程序头的内存位置的元素查找程序头。具体的,可以从虚拟地址空间的起始位置获取e_phoff元素,该e_phoff元素用于指示程序头的偏移,依据该e_phoff元素即可相应地找到程序头。接着,读取程序头中的每个元素,根据其中的用于指示动态段的偏移地址的元素即PT_DYNAMIC元素,相应地确定.dynamic段的偏移地址。
确定出.dynamic段的偏移地址后,可以进一步根据程序头对应的文件类型以及该.dynamic段的偏移地址,确定.dynamic段的实际地址。具体的,如若程序头对应的文件类型为可执行程序,则可以直接确定.dynamic段的偏移地址为该.dynamic段的实际地址;如若程序头对应的文件类型为动态库,则可以计算进程的加载地址与该.dynamic段的偏移地址的和值,将该和值确定为.dynamic段的实际地址。
确定出.dynamic段的实际地址后,对该.dynamic段的实际地址进行访问,获取该.dynamic段中可以用于确定GOT表的起始地址和长度的参考元素。具体获取的参考元素可以包括:GOT表地址参考元素、PLT表元素长度参考元素和PLT表长度参考元素;其中,GOT表地址参考元素具体可以为.dynamic段中的DT_PLTGOT元素,PLT表元素长度参考元素具体可以为.dynamic段中的DT_SYMENT元素或DT_RELANET元素或DT_RELENT元素,PLT表长度参考元素具体可以为.dynamic段中的DT_PLTRELSZ元素或DT_RELASZ元素。
根据DT_PLTGOT元素可以直接确定GOT表的参考起始地址got_start;根据DT_SYMENT元素或DT_RELANET元素或DT_RELENT元素,可以确定PLT表中每个元素的元素长度rela_size;根据DT_PLTRELSZ元素或DT_RELASZ元素,可以确定PLT表的总长度pltrel_size。
由于PLT表中的元素与GOT表中的元素是一一对应的,因此,可以基于PLT表的总长度、PLT表中每个元素的长度以及GOT表的元素长度,计算GOT表的长度;具体的,可以利用PLT表的总长度pltrel_size除以PLT表中每个元素的元素长度rela_size确定PLT表中的元素数量,即确定GOT表中的元素数量,进而,利用GOT表中的元素数量乘上GOT表的元素长度,确定GOT表的长度,上述GOT表的元素长度在64位的操作系统下为8,在32位的操作系统下为4。
计算GOT表的起始地址时,可以根据GOT表的参考起始地址以及GOT表的元素长度进行计算。具体的,考虑到GOT表中的前三个元素需要跳过,可以利用GOT表的参考起始地址got_start加上3乘上GOT表的元素长度,得到GOT表的起始地址。
应理解,图6所示的获取GOT表的起始地址和长度的实现方式仅为示例,在实际应用中,动态度量管理模块也可以采用其他方式获取GOT表的起始地址和长度,在此不对获取GOT表的起始地址和长度的实现方式做任何限定。
步骤502:根据所述GOT表的起始地址和长度,对所述GOT表中的每个元素进行完整性度量。
经步骤501确定出GOT表的起始地址和长度后,动态度量管理模块可以依据所确定的GOT表的起始地址和长度获取实际需要度量的GOT表,进而,对该GOT表中的每个元素进行完整性度量,若GOT表中每个元素的完整性度量结果均表征其对应的元素没有被篡改,则说明该GOT表没有被篡改,其通过了此次完整性度量,反之,若GOT表中某个或某些元素的完整性度量结果表征其对应的元素已被篡改,则说明该GOT表已被篡改,其没有通过此次完整性度量。
需要说明的是,在对GOT表中的每个元素进行完整性度量之前,动态度量管理模块可以先对该GOT表对应的可执行与可链接格式(executable and linkable format,ELF)文件进行签名校验;待该签名校验通过后,动态度量管理模块再对GOT表中的每个元素进行完整性度量。
具体的,动态度量管理模块可以采用特定的哈希算法,计算该GOT表对应的ELF文件的hash值,并且获取预存在硬件可信环境中的该ELF文件对应的签名,解密该签名得到该ELF文件对应的hash值;将实时计算得到的hash值与解密签名得到的hash值进行对比,若对比结果表征二者一致,则可继续对GOT表中每个元素进行完整性度量,若对比结果表征二者不一致,则确定GOT表对应的ELF文件已被篡改,无法继续对GOT表中每个元素做进一步完整性度量。
具体对GOT表中每个元素进行完整性度量时,动态度量管理模块可以访问GOT表对应的ELF文件中的PLT表,根据GOT表中待度量元素对应的PLT表元素,确定该待度量元素对应的函数名称;确定该待度量元素所落入的虚拟地址空间,并获取该虚拟地址空间对应的文件名;对该文件名对应的ELF文件进行签名校验;签名校验通过后,在该文件名对应的ELF文件中找到待度量元素对应的函数名称,并确定待度量元素对应的函数是否已被重定向;若该待度量元素对应的函数已被重定向,则采用第一度量策略对该待度量元素的完整性进行度量,若该待度量元素对应的函数未被重定向,则采用第二度量策略对该待度量元素的完整性进行度量。
下面结合图7对上述度量GOT表中每个元素的完整性的实现方式做详细的介绍。对GOT表对应的ELF文件进行签名校验通过后,获取该ELF文件中的PLT表,并通过访问该PLT表获取GOT表中当前待度量元素对应的PLT表元素,从该PLT表元素的st_name成员中获得待度量元素对应的函数名称。如图7所示,假设需要度量的GOT表为file1 got段,该file1 got段对应的ELF文件为signed file1 elf,从该signed file1 elf中获取file1 rel plt段;假设当前待度量元素为got[x],从file1rel plt段中找到got[x]对应的relplt[x],进而从relplt[x]的st_name成员中获取到got[x]对应的函数名称symbol name。
根据该待度量元素的数值查询该待度量元素具体落入的虚拟地址空间,即将该待度量元素的数值与进程运行时所依赖的各个虚拟地址空间进行匹配,此处的虚拟地址空间即为在获取GOT表的起始地址和长度过程中确定出的进程运行时依赖的虚拟地址空间;进而,获取该虚拟地址空间对应的文件名,并获取该文件名对应的ELF文件。如图7所示,根据待度量元素got[x]对应的数值,在整个进程的虚拟地址空间中查找got[x]具体落入的虚拟地址空间;假设got[x]落入虚拟地址空间vm_start2至vm_end2中,相应地获取vm_start2至vm_end2对应的文件名lib1,并获取lib1对应的ELF文件signed lib1 elf。
进而,对上述文件名对应的该ELF文件进行签名校验;即计算该ELF文件对应的hash值,同时获取预存在硬件可信环境中的该ELF文件对应的签名,解密该签名得到对应的hash值,将实时计算得到的hash值与解密签名得到的hash值进行对比,若二者一致,则表明对于该ELF文件的签名校验通过,若二者不一致,则说明该ELF文件已被篡改,无需继续进行后续的度量操作。
签名校验通过后,从该ELF文件中找到待度量元素对应的函数名称,并根据该函数名称对应的符号标识,确定待度量元素对应的函数是否已被重定向;若函数名称对应的符号标识为本地符号,则说明该待度量元素对应的函数已被重定向,若函数名称对应的符号标识为全局符号,则说明该待度量元素对应的函数未被重定向。当待度量元素对应的函数已被重定向时,采取第一度量策略对该待度量元素进行完整性度量;当待度量元素对应的函数未被重定向时,采取第二度量策略对该待度量元素进行完整性度量。
具体基于第一度量策略对待度量元素进行完整性度量时,若ELF文件为可执行程序,则直接将该待度量元素对应的函数在ELF文件中的偏移地址与待度量元素进行对比,在对比结果表征二者一致的情况下,确定该待度量元素通过完整性度量,在对比结果表征二者不一致的情况下,确定该待度量元素已被篡改,没有通过完整性度量;若ELF文件为动态库,则计算ELF文件的加载地址与待度量元素对应的函数在ELF文件中的偏移地址的和值,将该和值与待度量元素进行对比,在对比结果表征二者一致的情况下,确定该待度量元素通过完整性度量,在对比结果表征二者不一致的情况下,确定该待度量元素已被篡改,没有通过完整性度量。
具体基于第二度量策略对待度量元素进行完整性度量时,若ELF文件为可执行程序,则直接将待度量元素对应的函数在ELF文件的GOT表中的取值与待度量元素进行对比,在对比结果表征二者一致的情况下,确定该待度量元素通过完整性度量,在对比结果表征二者不一致的情况下,确定该待度量元素已被篡改,没有通过完整性度量;若ELF文件为动态库,则计算待度量元素对应的函数在ELF文件的GOT表中的取值与ELF文件的加载地址的和值,将该和值与待度量元素进行对比,在对比结果表征二者一致的情况下,确定该待度量元素通过完整性度量,在对比结果表征二者不一致的情况下,确定该待度量元素已被篡改,没有通过完整性度量。
上述GOT表度量方法提出了针对于GOT表的完整性度量机制,通过对GOT表中每个元素进行完整性度量,实现对于GOT表的完整性度量。如此,在对软件完整性进行动态度量的过程中,可以基于本申请提供的GOT表完整性度量机制对GOT表的完整性进行度量,保证对程序运行期间GOT表的完整性进行监测,防止因GOT表被篡改而导致程序控制流被劫持。
经发明人实验验证,采用图5所示的GOT表度量方法,能够有效地检测通过修改GOT表篡改运行进程的攻击,具体参见图8。如图8所示,测试程序分别调用print good和printbad两个外部函数打印I am good和I am bad;测试程序对GOT表进行修改,将print good函数地址修改为print bad后,再次调用print good实际将输出I am bad;采用图5所示的GOT表度量方法将检测到测试程序中的print good函数被篡改。
参见图9,图9为本申请实施例提供的另一种GOT表度量方法的流程示意图,该方法通过对GOT表整体进行完整性度量,实现对于GOT表的完整性度量。如图9所示,该方法包括以下步骤:
步骤901:在进程运行的过程中,获取GOT表的起始地址和长度;所述GOT表包括进程的GOT表和进程所依赖的动态库的GOT表。
步骤901的具体实现方式与上述图5所示实施例中步骤501的实现方式相同,详见步骤501的相关描述,此处不再赘述。
需要说明的是,在实际应用中,执行步骤901之前,需要通过在进程文件编译时额外添加的重定向编译选项(LD_BIND_NOW),在进程加载时完成对于所有GOT表的重定向,并将重定向后的GOT表设置为只读属性。
步骤902:根据所述GOT表的起始地址和长度,对所述GOT表整体进行完整性度量。
经步骤901确定出GOT表的起始地址和长度后,动态度量管理模块可以依据所确定的GOT表的起始地址和长度获取实际需要度量的GOT表,进而,对该GOT表整体进行完整性度量,若对于该GOT表整体的完整性度量通过,则确认GOT表通过了此次完整性度量,反之,若对于该GOT表整体的完整性度量未通过,则说明该GOT表可能被篡改,该GOT表没有通过此次完整性度量。
具体实现时,动态度量管理模块可以根据该待度量GOT表的起始地址和长度,计算该待度量GOT表整体对应的hash值,与此同时,动态度量管理模块从硬件可信环境中获取该待度量GOT表对应的度量基线值,该度量基线值通常是在软件包发布时计算得到的,将计算得到的hash值与所获取的度量基线值进行对比,若二者一致,则说明GOT表没有被篡改,若二者不一致,则说明GOT表已被篡改。
上述GOT表度量方法提出了针对于GOT表的完整性度量机制,通过对GOT表整体进行完整性度量,实现对于GOT表的完整性度量。如此,在对软件完整性进行动态度量的过程中,可以基于本申请提供的GOT表完整性度量机制对GOT表的完整性进行度量,保证对程序运行期间GOT表的完整性进行监测,防止因GOT表被篡改而导致程序控制流被劫持。
本申请实施例还提供了一种动态度量方法,在实际应用中,动态度量管理模块可以基于该动态度量方法对进程运行过程中的软件完整性进行度量,以检测进程的代码段、进程所依赖的动态库代码段和进程的GOT表是否被篡改。参见图10,图10为本申请实施例提供的动态度量方法的流程示意图,如图10所示,该方法包括以下步骤:
步骤1001:在进程运行的过程中,获取所述进程的代码段的起始地址和长度,以及所述进程所依赖的动态库代码段的起始地址和长度,以及GOT表的起始地址和长度,所述GOT表包括进程的GOT表和进程所依赖的动态库的GOT表。
具体获取进程的代码段的起始地址和长度的方式以及获取进程所依赖的动态库代码段的起始地址和长度的方式,相关技术中已有较为成熟的获取方式,本申请此处可以直接采用相关技术中获取代码段的起始地址和长度的方式和获取进程所依赖的动态库代码段的起始地址和长度的方式。
具体获取GOT表的起始地址和长度的方式在图5所示实施例已进行了详细的介绍,此处不再赘述,详细参见图5中步骤501的相关描述。
步骤1002:根据所述代码段的起始地址和长度,计算所述代码段对应的hash值,将所述代码段对应的hash值与所述代码段对应的度量基线值进行对比,得到所述代码段对应的完整性度量结果。
获取到代码段的起始地址和长度后,即可基于该起始地址和长度获取到待度量的代码段,进而计算该待度量的代码段对应的hash值,与此同时,动态度量管理模块还将从硬件可信环境中获取该代码段对应的度量基线值,该度量基线值是在软件包发布时基于该代码段计算得到的;对比计算得到的hash值与所获取的度量基线值是否一致,若一致,则表明该代码段通过了完整性度量,若不一致,则表明该代码段已被篡改,没有通过完整性度量。
步骤1003:根据所述动态库代码段的起始地址和长度,计算所述动态库代码段对应的hash值,将所述动态库代码段对应的hash值与所述动态库代码段对应的度量基线值进行对比,得到所述动态库代码段对应的完整性度量结果。
获取到动态库代码段的起始地址和长度后,即可基于该起始地址和长度获取到待度量的动态库代码段,进而计算该待度量的动态库代码段对应的hash值,与此同时,动态度量管理模块还将从硬件可信环境中获取该动态库代码段对应的度量基线值,该度量基线值是在软件包发布时基于该动态库代码段计算得到的;对比计算得到的hash值与所获取的度量基线值是否一致,若一致,则表明该动态库代码段通过了完整性度量,若不一致,则表明该动态库代码段已被篡改,没有通过完整性度量。
步骤1004:根据所述GOT表的起始地址和长度,对所述GOT表中的每个元素进行完整性度量,或者对所述GOT表整体进行完整性度量,得到所述GOT表对应的完整性度量结果。
获取到GOT表的起始地址和长度后,即可基于该起始地址和长度获取到待度量的GOT表,进而,采用图5或图8所示的方法对该待度量的GOT表的完整性进行度量,具体度量方式详细参见图5所示实施例中步骤502的实现方式,或者参见图8所示实施例中步骤802的实现方式,此处不再赘述。
需要说明的是,在实际应用中,可以先执行步骤1002,也可以先执行步骤1003,还可以先执行步骤1004,在此不对步骤1002、步骤1003和步骤1004的执行顺序做任何限定。
步骤1005:根据所述代码段对应的完整性度量结果、所述动态库代码段对应的完整性度量结果和所述全局偏移表对应的完整性度量结果,确定软件完整性度量结果。
获取到代码段对应的完整性度量结果、动态库代码段对应的完整性度量结果和GOT表对应的完整性度量结果后,即可根据这些度量结果相应地确定软件运行过程中软件的完整性度量结果。应理解,若代码段对应的完整性度量结果、动态库代码段对应的完整性度量结果和GOT表对应的完整性度量结果中任意一者表明没有通过完整性度量,则说明软件可能被篡改,软件的完整性度量未通过;若代码段对应的完整性度量结果、动态库代码段对应的完整性度量结果和GOT表对应的完整性度量结果均表明通过完整性度量,则确定软件未被篡改,通过完整性度量。
上述动态度量方法在现有的动态度量方法的基础上,将图5或图8所示的GOT表度量方法融入其中,即在对软件完整性进行动态度量的过程中,同时对进程的代码段的完整性、进程所依赖的动态库代码段的完整性以及进程的GOT表的完整性进行度量,由此保证对进程运行时涉及的各个因素进行全面度量,减少防御漏洞,保证达到更好的防御效果。
针对上文描述的GOT表度量方法,本申请还提供了对应的GOT表度量装置,以使上述GOT表度量方法在实际中的应用以及实现。
参见图11,图11为本申请实施例提供的一种GOT表度量装置的结构示意图;该装置包括:
获取模块1101,用于在进程运行的过程中,获取全局偏移表的起始地址和长度;所述全局偏移表包括所述进程的全局偏移表和所述进程依赖的动态库的全局偏移表;
度量模块1102,用于根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量,或者对所述全局偏移表整体进行完整性度量。
可选的,所述获取模块包括:
偏移地址确定单元,用于通过所述进程的进程描述符查找程序头,并根据所述程序头确定动态段的偏移地址;
实际地址确定单元,用于根据所述程序头对应的的文件类型以及所述动态段的偏移地址,确定所述动态段的实际地址;
参考元素获取单元,用于基于所述动态段的实际地址访问所述动态段,从所述动态段中获取参考元素;
全局偏移表确定单元,用于根据所述参考元素,确定所述全局偏移表的起始地址和长度。
可选的,所述偏移地址确定单元具体用于:
通过所述进程描述符,查找所述进程运行时依赖的虚拟地址空间;
基于所述虚拟地址空间中用于指示程序头的内存位置的元素,查找所述程序头;
根据所述程序头中用于指示动态段的偏移地址的元素,确定所述动态段的偏移地址。
可选的,所述实际地址确定单元具体用于:
当所述程序头对应的文件类型为可执行程序时,确定所述动态段的偏移地址为所述动态段的实际地址;
当所述程序头对应的文件类型为动态库时,确定所述进程的加载地址与所述动态段的实际地址的和值为所述动态段的实际地址。
可选的,所述参考元素包括:全局偏移表地址参考元素、PLT表元素长度参考元素和PLT表长度参考元素;则所述全局偏移表确定单元具体用于:
根据所述全局偏移表地址参考元素,确定所述全局偏移表的参考起始地址;根据所述PLT表元素长度参考元素,确定PLT表中每个元素的元素长度;根据所述PLT表长度参考元素,确定所述PLT表的总长度;
根据所述PLT表的总长度、所述PLT表中每个元素的元素长度以及所述全局偏移表的元素长度,计算所述全局偏移表的长度;
根据所述全局偏移表的参考起始地址以及所述全局偏移表的元素长度,计算所述全局偏移表的起始地址。
可选的,所述装置还包括:
校验模块,用于对所述全局偏移表对应的可执行与可链接格式ELF文件进行签名校验;签名校验通过后,执行所述根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量。
可选的,所述度量模块包括:
函数名称确定单元,用于访问所述全局偏移表对应的ELF文件中的PLT表,根据所述全局偏移表中待度量元素对应的PLT表元素,确定所述待度量元素对应的函数名称;
文件名获取单元,用于确定所述待度量元素落入的虚拟地址空间,并获取所述虚拟地址空间对应的文件名;
签名校验单元,用于对所述文件名对应的ELF文件进行签名校验;
函数类型确定单元,用于签名校验通过后,在所述文件名对应的ELF文件找到所述函数名称,并确定所述待度量元素对应的函数是否已被重定向;
完整性度量单元,用于若已被重定向,则采用第一度量策略对所述待度量元素进行完整性度量;若未被重定向,则采用第二度量策略对所述待度量元素进行完整性度量。
可选的,所述第一度量策略包括:
当所述ELF文件为可执行程序时,将所述待度量元素对应的函数在所述ELF文件中的偏移地址与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果;
当所述ELF文件为动态库时,将所述ELF文件的加载地址与所述待度量元素对应的函数在所述ELF文件中的偏移地址的和值与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果。
可选的,所述第二度量策略包括:
当所述ELF文件为可执行程序时,将所述待度量元素对应的函数在所述ELF文件的全局偏移表中的取值与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果;
当所述ELF文件为动态库时,将所述待度量元素对应的函数在所述ELF文件的全局偏移表中的取值与所述ELF文件的加载地址的和值与待度量元素进行对比,得到所述待度量元素对应的完整性度量结果。
可选的,对所述全局偏移表整体进行完整性度量时,所述装置还包括:
重定向模块,用于在进程加载过程中,通过重定向编译选项完成对于所述全局偏移表的重定向,并将重定向后的全局偏移表设置为只读属性;
则所述度量模块具体用于:
根据所述全局偏移表的起始地址和长度,计算所述全局偏移表整体对应的哈希值;
将所述哈希值与所述全局偏移表对应的度量基线值进行对比,得到所述全局偏移表对应的完整性度量结果。
上述GOT表度量装置提出了针对于GOT表的完整性度量机制,通过对GOT表中每个元素进行完整性度量,实现对于GOT表的完整性度量。如此,在对软件完整性进行动态度量的过程中,可以基于本申请提供的GOT表完整性度量机制对GOT表的完整性进行度量,保证对程序运行期间GOT表的完整性进行监测,防止因GOT表被篡改而导致程序控制流被劫持。
参见图12,图12为本申请实施例提供的一种动态度量装置的结构示意图;该装置包括:
获取模块1201,用于在进程运行的过程中,获取所述进程的代码段的起始地址和长度,以及所述进程所依赖的动态库代码段的起始地址和长度,以及全局偏移表的起始地址和长度,所述全局偏移表包括所述进程的全局偏移表和所述进程依赖的动态库的全局偏移表;
第一度量模块1202,用于根据所述代码段的起始地址和长度,计算所述代码段对应的哈希值,将所述代码段对应的哈希值与所述代码段对应的度量基线值进行对比,得到所述代码段对应的完整性度量结果;
第二度量模块1203,用于根据所述动态库代码段的起始地址和长度,计算所述动态库代码段对应的哈希值,将所述动态库代码段对应的哈希值与所述动态库代码段对应的度量基线值进行对比,得到所述动态库代码段对应的完整性度量结果;
第三度量模块1204,用于根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量,或者对所述全局偏移表整体进行完整性度量,得到所述全局偏移表对应的完整性度量结果;
完整性度量模块1205,用于根据所述代码段对应的完整性度量结果、所述动态库代码段对应的完整性度量结果和所述全局偏移表对应的完整性度量结果,确定软件完整性度量结果。
上述动态度量装置在对软件完整性进行动态度量的过程中,同时对进程的代码段的完整性、进程所依赖的动态库代码段的完整性以及进程的GOT表的完整性进行度量,由此保证对进程运行时涉及的各个因素进行全面度量,减少防御漏洞,保证达到更好的防御效果。
本申请实施例提供了一种设备,所述设备包括:处理器以及存储器;
所述存储器用于存储计算机程序,并将所述计算机程序传输给所述处理器;所述处理器用于根据所述计算机程序中的指令执行前述各个实施例所述的GOT表度量方法中的任意一种实施方式,或动态度量方法中的任意一种实施方式。
本申请实施例还提供一种计算机可读存储介质,用于存储程序代码,该程序代码用于执行前述各个实施例所述的GOT表度量方法中的任意一种实施方式,或动态度量方法中的任意一种实施方式。
本申请实施例还提供一种包括指令的计算机程序产品,当其在计算机上运行时,使得计算机执行前述各个实施例所述的GOT表度量方法中的任意一种实施方式,或动态度量方法中的任意一种实施方式。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(英文全称:Read-OnlyMemory,英文缩写:ROM)、随机存取存储器(英文全称:Random Access Memory,英文缩写:RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

Claims (22)

1.一种全局偏移表度量方法,其特征在于,所述方法包括:
在进程运行的过程中,获取全局偏移表的起始地址和长度;所述全局偏移表包括所述进程的全局偏移表和所述进程依赖的动态库的全局偏移表;
根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量,或者对所述全局偏移表整体进行完整性度量;
所述获取全局偏移表的起始地址和长度,包括:
通过所述进程的进程描述符查找程序头,并根据所述程序头确定动态段的偏移地址;
根据所述程序头对应的文件类型以及所述动态段的偏移地址,确定所述动态段的实际地址;
基于所述动态段的实际地址访问所述动态段,从所述动态段中获取参考元素;
根据所述参考元素,确定所述全局偏移表的起始地址和长度。
2.根据权利要求1所述的方法,其特征在于,所述通过所述进程的进程描述符查找程序头,并根据所述程序头确定动态段的偏移地址,包括:
通过所述进程描述符,查找所述进程运行时依赖的虚拟地址空间;
基于所述虚拟地址空间中用于指示程序头的内存位置的元素,查找所述程序头;
根据所述程序头中用于指示动态段的偏移地址的元素,确定所述动态段的偏移地址。
3.根据权利要求1所述的方法,其特征在于,所述根据所述程序头对应的文件类型以及所述动态段的偏移地址,确定所述动态段的实际地址,包括:
当所述程序头对应的文件类型为可执行程序时,确定所述动态段的偏移地址为所述动态段的实际地址;
当所述程序头对应的文件类型为动态库时,确定所述进程的加载地址与所述动态段的实际地址的和值为所述动态段的实际地址。
4.根据权利要求1所述的方法,其特征在于,所述参考元素包括:全局偏移表地址参考元素、PLT表元素长度参考元素和PLT表长度参考元素;
则所述根据所述参考元素,确定所述全局偏移表的起始地址和长度,包括:
根据所述全局偏移表地址参考元素,确定所述全局偏移表的参考起始地址;根据所述PLT表元素长度参考元素,确定PLT表中每个元素的元素长度;根据所述PLT表长度参考元素,确定所述PLT表的总长度;
根据所述PLT表的总长度、所述PLT表中每个元素的元素长度以及所述全局偏移表的元素长度,计算所述全局偏移表的长度;
根据所述全局偏移表的参考起始地址以及所述全局偏移表的元素长度,计算所述全局偏移表的起始地址。
5.根据权利要求1所述的方法,其特征在于,在所述根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量之前,所述方法还包括:
对所述全局偏移表对应的可执行与可链接格式ELF文件进行签名校验;签名校验通过后,执行所述根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量。
6.根据权利要求1所述的方法,其特征在于,所述根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量,包括:
访问所述全局偏移表对应的ELF文件中的PLT表,根据所述全局偏移表中待度量元素对应的PLT表元素,确定所述待度量元素对应的函数名称;
确定所述待度量元素落入的虚拟地址空间,并获取所述虚拟地址空间对应的文件名;
对所述文件名对应的ELF文件进行签名校验;
签名校验通过后,在所述文件名对应的ELF文件找到所述函数名称,并确定所述待度量元素对应的函数是否已被重定向;
若已被重定向,则采用第一度量策略对所述待度量元素进行完整性度量;若未被重定向,则采用第二度量策略对所述待度量元素进行完整性度量。
7.根据权利要求6所述的方法,其特征在于,所述第一度量策略包括:
当所述ELF文件为可执行程序时,将所述待度量元素对应的函数在所述ELF文件中的偏移地址与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果;
当所述ELF文件为动态库时,将所述ELF文件的加载地址与所述待度量元素对应的函数在所述ELF文件中的偏移地址的和值与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果。
8.根据权利要求6所述的方法,其特征在于,所述第二度量策略包括:
当所述ELF文件为可执行程序时,将所述待度量元素对应的函数在所述ELF文件的全局偏移表中的取值与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果;
当所述ELF文件为动态库时,将所述待度量元素对应的函数在所述ELF文件的全局偏移表中的取值与所述ELF文件的加载地址的和值与待度量元素进行对比,得到所述待度量元素对应的完整性度量结果。
9.根据权利要求1所述的方法,其特征在于,对所述全局偏移表整体进行完整性度量时,在所述获取全局偏移表的起始地址和长度之前,所述方法还包括:
在进程加载过程中,通过重定向编译选项完成对于所述全局偏移表的重定向,并将重定向后的全局偏移表设置为只读属性;
则所述根据所述全局偏移表的起始地址和长度,对所述全局偏移表整体进行完整性度量,包括:
根据所述全局偏移表的起始地址和长度,计算所述全局偏移表整体对应的哈希值;
将所述哈希值与所述全局偏移表对应的度量基线值进行对比,得到所述全局偏移表对应的完整性度量结果。
10.一种动态度量方法,其特征在于,所述方法包括:
在进程运行的过程中,获取所述进程的代码段的起始地址和长度,以及所述进程所依赖的动态库代码段的起始地址和长度,以及全局偏移表的起始地址和长度,所述全局偏移表包括所述进程的全局偏移表和所述进程依赖的动态库的全局偏移表;
根据所述代码段的起始地址和长度,计算所述代码段对应的哈希值,将所述代码段对应的哈希值与所述代码段对应的度量基线值进行对比,得到所述代码段对应的完整性度量结果;
根据所述动态库代码段的起始地址和长度,计算所述动态库代码段对应的哈希值,将所述动态库代码段对应的哈希值与所述动态库代码段对应的度量基线值进行对比,得到所述动态库代码段对应的完整性度量结果;
根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量,或者对所述全局偏移表整体进行完整性度量,得到所述全局偏移表对应的完整性度量结果;
根据所述代码段对应的完整性度量结果、所述动态库代码段对应的完整性度量结果和所述全局偏移表对应的完整性度量结果,确定软件完整性度量结果。
11.一种全局偏移表度量装置,其特征在于,所述装置包括:
获取模块,用于在进程运行的过程中,获取全局偏移表的起始地址和长度;所述全局偏移表包括所述进程的全局偏移表和所述进程依赖的动态库的全局偏移表;
度量模块,用于根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量,或者对所述全局偏移表整体进行完整性度量;
其中,所述获取模块包括:
偏移地址确定单元,用于通过所述进程的进程描述符查找程序头,并根据所述程序头确定动态段的偏移地址;
实际地址确定单元,用于根据所述程序头对应的文件类型以及所述动态段的偏移地址,确定所述动态段的实际地址;
参考元素获取单元,用于基于所述动态段的实际地址访问所述动态段,从所述动态段中获取参考元素;
全局偏移表确定单元,用于根据所述参考元素,确定所述全局偏移表的起始地址和长度。
12.根据权利要求11所述的装置,其特征在于,所述偏移地址确定单元具体用于:
通过所述进程描述符,查找所述进程运行时依赖的虚拟地址空间;
基于所述虚拟地址空间中用于指示程序头的内存位置的元素,查找所述程序头;
根据所述程序头中用于指示动态段的偏移地址的元素,确定所述动态段的偏移地址。
13.根据权利要求11所述的装置,其特征在于,所述实际地址确定单元具体用于:
当所述程序头对应的文件类型为可执行程序时,确定所述动态段的偏移地址为所述动态段的实际地址;
当所述程序头对应的文件类型为动态库时,确定所述进程的加载地址与所述动态段的实际地址的和值为所述动态段的实际地址。
14.根据权利要求11所述的装置,其特征在于,所述参考元素包括:全局偏移表地址参考元素、PLT表元素长度参考元素和PLT表长度参考元素;则所述全局偏移表确定单元具体用于:
根据所述全局偏移表地址参考元素,确定所述全局偏移表的参考起始地址;根据所述PLT表元素长度参考元素,确定PLT表中每个元素的元素长度;根据所述PLT表长度参考元素,确定所述PLT表的总长度;
根据所述PLT表的总长度、所述PLT表中每个元素的元素长度以及所述全局偏移表的元素长度,计算所述全局偏移表的长度;
根据所述全局偏移表的参考起始地址以及所述全局偏移表的元素长度,计算所述全局偏移表的起始地址。
15.根据权利要求11所述的装置,其特征在于,所述装置还包括:
校验模块,用于对所述全局偏移表对应的可执行与可链接格式ELF文件进行签名校验;签名校验通过后,执行所述根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量。
16.根据权利要求11所述的装置,其特征在于,所述度量模块包括:
函数名称确定单元,用于访问所述全局偏移表对应的ELF文件中的PLT表,根据所述全局偏移表中待度量元素对应的PLT表元素,确定所述待度量元素对应的函数名称;
文件名获取单元,用于确定所述待度量元素落入的虚拟地址空间,并获取所述虚拟地址空间对应的文件名;
签名校验单元,用于对所述文件名对应的ELF文件进行签名校验;
函数类型确定单元,用于签名校验通过后,在所述文件名对应的ELF文件找到所述函数名称,并确定所述待度量元素对应的函数是否已被重定向;
完整性度量单元,用于若已被重定向,则采用第一度量策略对所述待度量元素进行完整性度量;若未被重定向,则采用第二度量策略对所述待度量元素进行完整性度量。
17.根据权利要求16所述的装置,其特征在于,所述第一度量策略包括:
当所述ELF文件为可执行程序时,将所述待度量元素对应的函数在所述ELF文件中的偏移地址与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果;
当所述ELF文件为动态库时,将所述ELF文件的加载地址与所述待度量元素对应的函数在所述ELF文件中的偏移地址的和值与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果。
18.根据权利要求16所述的装置,其特征在于,所述第二度量策略包括:
当所述ELF文件为可执行程序时,将所述待度量元素对应的函数在所述ELF文件的全局偏移表中的取值与所述待度量元素进行对比,得到所述待度量元素对应的完整性度量结果;
当所述ELF文件为动态库时,将所述待度量元素对应的函数在所述ELF文件的全局偏移表中的取值与所述ELF文件的加载地址的和值与待度量元素进行对比,得到所述待度量元素对应的完整性度量结果。
19.根据权利要求11所述的装置,其特征在于,对所述全局偏移表整体进行完整性度量时,所述装置还包括:
重定向模块,用于在进程加载过程中,通过重定向编译选项完成对于所述全局偏移表的重定向,并将重定向后的全局偏移表设置为只读属性;
则所述度量模块具体用于:
根据所述全局偏移表的起始地址和长度,计算所述全局偏移表整体对应的哈希值;
将所述哈希值与所述全局偏移表对应的度量基线值进行对比,得到所述全局偏移表对应的完整性度量结果。
20.一种动态度量装置,其特征在于,所述装置包括:
获取模块,用于在进程运行的过程中,获取所述进程的代码段的起始地址和长度,以及所述进程所依赖的动态库代码段的起始地址和长度,以及全局偏移表的起始地址和长度,所述全局偏移表包括所述进程的全局偏移表和所述进程依赖的动态库的全局偏移表;
第一度量模块,用于根据所述代码段的起始地址和长度,计算所述代码段对应的哈希值,将所述代码段对应的哈希值与所述代码段对应的度量基线值进行对比,得到所述代码段对应的完整性度量结果;
第二度量模块,用于根据所述动态库代码段的起始地址和长度,计算所述动态库代码段对应的哈希值,将所述动态库代码段对应的哈希值与所述动态库代码段对应的度量基线值进行对比,得到所述动态库代码段对应的完整性度量结果;
第三度量模块,用于根据所述全局偏移表的起始地址和长度,对所述全局偏移表中的每个元素进行完整性度量,或者对所述全局偏移表整体进行完整性度量,得到所述全局偏移表对应的完整性度量结果;
完整性度量模块,用于根据所述代码段对应的完整性度量结果、所述动态库代码段对应的完整性度量结果和所述全局偏移表对应的完整性度量结果,确定软件完整性度量结果。
21.一种设备,其特征在于,所述设备包括:处理器以及存储器;
所述存储器用于存储计算机程序,并将所述计算机程序传输给所述处理器;
所述处理器用于根据所述计算机程序中的指令执行权利要求1至10任一项所述的方法。
22.一种计算机可读存储介质,其特征在于,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1至10任一项所述的方法。
CN201910707930.3A 2019-08-01 2019-08-01 全局偏移表度量方法、动态度量方法及相关装置、设备 Active CN110598378B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910707930.3A CN110598378B (zh) 2019-08-01 2019-08-01 全局偏移表度量方法、动态度量方法及相关装置、设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910707930.3A CN110598378B (zh) 2019-08-01 2019-08-01 全局偏移表度量方法、动态度量方法及相关装置、设备

Publications (2)

Publication Number Publication Date
CN110598378A CN110598378A (zh) 2019-12-20
CN110598378B true CN110598378B (zh) 2023-07-18

Family

ID=68853370

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910707930.3A Active CN110598378B (zh) 2019-08-01 2019-08-01 全局偏移表度量方法、动态度量方法及相关装置、设备

Country Status (1)

Country Link
CN (1) CN110598378B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111309396B (zh) * 2020-02-14 2023-08-15 北京字节跳动网络技术有限公司 一种系统库的访问方法、装置以及计算机可读存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5845118A (en) * 1995-12-14 1998-12-01 International Business Machines Corporation Method for generating shared library executable code with lazy global offset table address calculation
CN101593259A (zh) * 2009-06-29 2009-12-02 北京航空航天大学 软件完整性验证方法及系统
CN104751048A (zh) * 2015-01-29 2015-07-01 中国科学院信息工程研究所 一种预链接机制下的动态链接库完整性度量方法
CN109478217A (zh) * 2016-07-29 2019-03-15 高通股份有限公司 使用基于偏移的虚拟地址映射对目标应用功能的基于内核的检测
CN109684829A (zh) * 2018-12-04 2019-04-26 中国科学院数据与通信保护研究教育中心 一种虚拟化环境中服务调用监控方法和系统

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5845118A (en) * 1995-12-14 1998-12-01 International Business Machines Corporation Method for generating shared library executable code with lazy global offset table address calculation
CN101593259A (zh) * 2009-06-29 2009-12-02 北京航空航天大学 软件完整性验证方法及系统
CN104751048A (zh) * 2015-01-29 2015-07-01 中国科学院信息工程研究所 一种预链接机制下的动态链接库完整性度量方法
CN109478217A (zh) * 2016-07-29 2019-03-15 高通股份有限公司 使用基于偏移的虚拟地址映射对目标应用功能的基于内核的检测
CN109684829A (zh) * 2018-12-04 2019-04-26 中国科学院数据与通信保护研究教育中心 一种虚拟化环境中服务调用监控方法和系统

Also Published As

Publication number Publication date
CN110598378A (zh) 2019-12-20

Similar Documents

Publication Publication Date Title
US10528745B2 (en) Method and system for identification of security vulnerabilities
US8701187B2 (en) Runtime integrity chain verification
US8601273B2 (en) Signed manifest for run-time verification of software program identity and integrity
US8364973B2 (en) Dynamic generation of integrity manifest for run-time verification of software program
CN105608386B (zh) 一种可信计算终端完整性度量、证明方法及装置
JP5639725B2 (ja) ソフトウェアの信頼性を測定する方法及び装置
US8544089B2 (en) Auditing a device
CN101473329A (zh) 用于执行可信计算完整性测量报告的设备和方法
US20160098555A1 (en) Program code attestation circuitry, a data processing apparatus including such program code attestation circuitry and a program attestation method
US8375442B2 (en) Auditing a device
CN110334515B (zh) 一种基于可信计算平台生成度量报告的方法及装置
Di Federico et al. How the {ELF} Ruined Christmas
Zhang et al. Recfa: Resilient control-flow attestation
US11520886B2 (en) Advanced ransomware detection
CN110598378B (zh) 全局偏移表度量方法、动态度量方法及相关装置、设备
CN112099909B (zh) 一种虚拟机内存度量方法、装置、处理器芯片及系统
CN117272286A (zh) 基于tee的进程动态完整性度量方法及系统
EP3229164B1 (en) Devices for measuring and verifying system states
CN111046390B (zh) 一种协同防御补丁防护方法、装置及存储设备
Jeong et al. MysteryChecker: Unpredictable attestation to detect repackaged malicious applications in Android
Shen et al. Randezvous: Making Randomization Effective on MCUs
CN110677483B (zh) 信息处理系统和可信安全管理系统
CN113646763B (zh) shellcode的检测方法及装置
CN110334514A (zh) 一种基于可信计算平台验证度量报告的方法及装置
CN106911678B (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
GR01 Patent grant
GR01 Patent grant