CN110325994B - 增强软件应用的控制流完整性的设备和方法 - Google Patents

增强软件应用的控制流完整性的设备和方法 Download PDF

Info

Publication number
CN110325994B
CN110325994B CN201880013935.XA CN201880013935A CN110325994B CN 110325994 B CN110325994 B CN 110325994B CN 201880013935 A CN201880013935 A CN 201880013935A CN 110325994 B CN110325994 B CN 110325994B
Authority
CN
China
Prior art keywords
function
indirect
function call
referenced
contained
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
CN201880013935.XA
Other languages
English (en)
Other versions
CN110325994A (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 International Pte Ltd
Original Assignee
Huawei International Pte 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 International Pte Ltd filed Critical Huawei International Pte Ltd
Publication of CN110325994A publication Critical patent/CN110325994A/zh
Application granted granted Critical
Publication of CN110325994B publication Critical patent/CN110325994B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3612Software analysis for verifying properties of programs by runtime analysis
    • 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/52Monitoring 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/54Monitoring 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 adding security routines or objects to programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • 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/51Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems at application loading time, e.g. accepting, rejecting, starting or inhibiting executable software based on integrity or source reliability
    • 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)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Document Processing Apparatus (AREA)
  • Programmable Controllers (AREA)

Abstract

本文档涉及一种设备和方法,用于在所述设备上执行软件应用时使设备增强所述应用的控制流完整性。

Description

增强软件应用的控制流完整性的设备和方法
技术领域
本发明涉及一种设备和方法,用于在设备上执行软件应用时使设备增强该应用的控制流完整性。
现有技术总结
大多数软件应用都容易受到恶意攻击,这些攻击试图通过改变软件应用的控制流来更改或改变该应用的行为。通常,在软件应用接收并执行通过常规通信信道接收的恶意二进制代码时会发生这些攻击。恶意二进制代码一旦执行就会利用应用中包含的已有软件缺陷来更改应用的控制流。通过利用这些漏洞,恶意攻击者可能会破坏应用。一旦应用被破坏,恶意攻击者就可以控制软件应用的行为而不被原始用户发现。
具体而言,蠕虫或病毒可以将自身插入到软件应用的执行流中。一旦发生这种情况,软件计划过程中的流就可能转移到蠕虫或病毒指示的过程中。如果软件应用存在机器代码级别的漏洞,则蠕虫或病毒的攻击可能会导致软件机器代码的执行发生改变,从而执行非预期的机器代码指令序列。
本领域技术人员尝试了通过减少或试图尽可能多地减少软件编码中的缺陷或漏洞来解决该问题。这种方法的缺点是很难完全彻底地消除某个软件中的所有缺陷。其它缓解方法依赖于计算机系统独立地从大集合中挑选随机整数,并尝试用这些随机值包围(攻击者可能想要修改的)重要信息或流数据——这样,要成功攻击,攻击者就必须使用选择的实际值。这些方法无法保证攻击者不会获知选择的值,如果攻击者获知或成功猜到选择的值,那么这些方法可能无济于事。更广泛地说,这些方法无法防止改变设备存储器的攻击。
因此,现有解决方案仍然会使软件应用易受病毒、蠕虫的攻击和不依赖于任意选择值的保密性的其它攻击或可能修改设备存储器的攻击。
返回定向编程(Return orient programming,ROP)是一种利用程序漏洞的高级攻击方法。ROP方法使用为一组指令的“小工具”来实现在目标程序上执行任意代码。本领域技术人员已知的另一种高级攻击方法是“返回libc”(ret2libc)攻击。在ret2libc攻击方法中,攻击者将目标软件应用中的函数调用重定向到另一个非计划中的函数。这些类型的攻击更改了执行程序的正常控制流。
攻击者最常用的控制流转移攻击方法之一是攻击源代码中的间接函数调用。这是因为攻击者可能会将间接函数调用重定向到任意代码以发起ROP攻击或ret2libc攻击。为了防止这种情况发生,当前基于编译器的CFI方法侧重于确保间接函数调用中发生的控制流转移仅发生在合法的函数目标上。在这些方法中,即使攻击者想要更改控制流,间接函数调用也只能调用这些合法目标,而不能调用程序中的任意代码。因此,这减少甚至防止了此类攻击。
本领域技术人员提出的用于增强程序的CFI的方法涉及在程序的源代码或二进制代码中引入控制流保护。控制流保护在间接函数调用之前插入检查。检查确保间接函数调用的目标是当前已加载到进程的内存空间中的函数的条目。在该方法中,控制流保护表示为存储器中的位图结构,位图结构包含所有函数条目。这种方法的缺点是该控制流保护结构不够安全,因为它假定合法目标包括加载到存储器中的所有函数。通过利用这个弱点,攻击者仍然可以利用进程中的所有函数来发起攻击。
由于上述原因,本领域技术人员不断努力寻找一种增强软件应用的控制流完整性的设备和方法。
发明内容
下文根据本发明实施例阐述用于增强软件应用的控制流完整性的设备和方法。
本发明中的设备和方法的实施例提出的第一个改进是:根据本发明执行的控制流完整性检查的粒度细,并且仅用于控制流转移的合法目标。此外,随着每个函数调用的合法目标数量的减少,这意味着恶意攻击者可利用的函数也会减少。
本发明中的设备和方法的实施例提出的第二个改进是:本发明实施例提出的控制流完整性增强使得CPU开销最小,从而对CPU的整体性能的影响也最小。
本发明中的设备和方法的实施例提出的第三个改进是:本发明无需大幅更改原始源代码或已编译二进制代码。
根据通过以下方式操作的本发明中的设备的实施例提供了上述改进。
根据本发明的第一方面,公开了一种用于增强软件应用的控制流完整性的设备,所述设备包括处理器;以及所述处理器可读的非瞬时性介质,所述非瞬时性介质存储当由所述处理器执行时使得所述处理器执行以下操作的指令:接收所述软件应用的第一源代码文件,所述第一源代码文件包括函数和间接函数调用;编译所述第一源代码文件以生成第一二进制文件,其中,对于每个已编译间接函数调用,将控制流完整性校验函数与所述第一二进制文件中的每个已编译间接函数调用相关联,以便在执行每个已编译间接函数调用之前执行相关联的控制流完整性校验函数,以及将每个已编译间接函数调用中引用的函数添加到简化函数表中。
结合所述第一方面,根据本发明实施例,所述设备还包括用于指示所述处理器执行以下操作的指令:执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;以及当确定所述相关联的间接函数调用中引用的所述函数包含在所述简化函数表中时,执行所述相关联的间接函数调用。
结合所述第一方面,根据本发明实施例,所述设备还包括:指示所述处理器执行以下操作的指令:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;以及当确定所述相关联的间接函数调用中引用的所述函数包含在所述简化函数表中时,执行所述相关联的间接函数调用。
结合所述第一方面,根据本发明实施例,所述设备还包括:指示所述处理器执行以下操作的指令:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;在以下情况下执行所述相关联的间接函数调用:当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,以及当确定所述第二二进制文件已经以传统方式编译时。
结合所述第一方面,根据本发明实施例,所述设备还包括用于指示所述处理器执行以下操作的指令:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;在以下情况下执行所述相关联的间接函数调用:当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,当确定所述第二二进制文件未以传统方式编译时,以及当所述相关联的间接函数调用中引用的所述函数包含在与所述第二二进制文件相关联的简化函数表中时。
结合所述第一方面,根据本发明实施例,所述设备还包括用于指示所述处理器执行以下操作的指令:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;在以下情况下执行所述相关联的间接函数调用:当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,当确定所述第二二进制文件未以传统方式编译时,当所述相关联的间接函数调用中引用的所述函数未包含在与所述第二二进制文件相关联的简化函数表中时,以及当所述相关联的间接函数调用中引用的所述函数包含在所述运行时函数表中时。
结合所述第一方面,根据本发明实施例,所述设备还包括用于指示所述处理器执行以下操作的指令:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;在以下情况下执行所述相关联的间接函数调用:当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,以及当所述相关联的间接函数调用中引用的所述函数包含在所述运行时函数表中时。
结合所述第一方面,根据本发明实施例,所述运行时函数表存储在所述处理器可读的受保护的非瞬时性介质中。
结合所述第一方面,根据本发明实施例,所述二进制图存储在所述处理器可读的受保护的非瞬时性介质中。
结合所述第一方面,根据本发明实施例,所述间接函数调用包括作为数据结构的一部分分配的间接函数调用。
结合所述第一方面,根据本发明实施例,所述间接函数调用还包括直接分配给函数的间接函数调用。
结合所述第一方面,根据本发明实施例,所述间接函数调用还包括作为汇编函数调用分配的间接函数调用。
根据本发明的第二方面,公开了一种使用计算设备增强软件应用的控制流完整性的方法,所述方法包括:接收所述软件应用的第一源代码文件,所述第一源代码文件包括函数和间接函数调用;获取通过编译所述第一源代码生成的第一二进制文件,对于每个已编译间接函数调用:将控制流完整性校验函数与所述第一二进制文件中的每个已编译间接函数调用相关联,以便在执行每个已编译间接函数调用之前执行相关联的控制流完整性校验函数,以及将每个已编译间接函数调用中引用的函数添加到简化函数表中。
结合所述第二方面,根据本发明实施例,所述方法还包括:执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;以及当确定所述相关联的间接函数调用中引用的所述函数包含在所述简化函数表中时,执行所述相关联的间接函数调用。
结合所述第二方面,根据本发明实施例,所述方法还包括:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;当确定所述相关联的间接函数调用中引用的所述函数包含在所述简化函数表中时,执行所述相关联的间接函数调用。
结合所述第二方面,根据本发明实施例,所述方法还包括:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;在以下情况下执行所述相关联的间接函数调用:当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,以及当确定所述第二二进制文件已经以传统方式编译时。
结合所述第二方面,根据本发明实施例,所述方法还包括:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;在以下情况下执行所述相关联的间接函数调用:当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,当确定所述第二二进制文件未以传统方式编译时,以及当所述相关联的间接函数调用中引用的所述函数包含在与所述第二二进制文件相关联的简化函数表中时。
结合所述第二方面,根据本发明实施例,所述方法还包括:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;在以下情况下执行所述相关联的间接函数调用:当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,当确定所述第二二进制文件未以传统方式编译时,当所述相关联的间接函数调用中引用的所述函数未包含在与所述第二二进制文件相关联的简化函数表中时,以及当所述相关联的间接函数调用中引用的所述函数包含在所述运行时函数表中时。
结合所述第二方面,根据本发明实施例,所述方法还包括:加载所述第一二进制文件用于执行;在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;在以下情况下执行所述相关联的间接函数调用:当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,以及当所述相关联的间接函数调用中引用的所述函数包含在所述运行时函数表中时。
结合所述第二方面,根据本发明实施例,所述运行时函数表存储在所述处理器可读的受保护的非瞬时性介质中。
结合所述第二方面,根据本发明实施例,所述二进制图存储在所述处理器可读的受保护的非瞬时性介质中。
结合所述第二方面,根据本发明实施例,所述间接函数调用包括作为数据结构的一部分分配的间接函数调用。
结合所述第二方面,根据本发明实施例,所述间接函数调用还包括直接分配给函数的间接函数调用。
结合所述第二方面,根据本发明实施例,所述间接函数调用还包括作为汇编函数调用分配的间接函数调用。
附图说明
在以下详细描述中描述并在以下附图中示出根据本发明的以上优点和特征:
图1示出了根据本发明实施例的一种支持增强软件应用的控制流完整性的系统的示例性框图。
图2示出了根据本发明实施例的表示一种用于实现实施例的电子设备中的组件的框图。
图3示出了根据本发明实施例的一种编译源代码以生成随后执行的二进制代码的系统的框图。
图4示出了根据本发明实施例的一种编译两个不同源代码以生成随后执行的单个二进制代码的系统的框图。
图5示出了根据本发明实施例的示出设备在已编译源代码的运行时期间执行的过程的流程图。
图6示出了根据本发明实施例的示出设备在源代码的运行时期间执行的过程的流程图,其中源代码包括间接函数调用。
图7示出了根据本发明实施例的在图6中的设备执行源代码中的命令时由该设备执行的过程的流程图。
具体实施方式
本发明涉及一种设备和方法,用于在设备上执行软件应用时使设备增强该应用的控制流完整性。
具体而言,当编译源代码时,本发明将基于已分配给包含在源代码文件中的函数指针的间接函数调用生成简化函数表。然后,编译器将编译控制流完整性(control flowintegrity,CFI)校验函数,随后将此CFI校验函数与二进制文件中的每个已编译间接函数调用相关联,以便在执行二进制文件时,将在执行二进制文件中的每个已编译间接函数调用之前执行相关联的控制流完整性校验函数。应注意,在整个描述中,在不偏离本发明的情况下,术语“程序”和“软件应用”可以互换使用。
此外,如果源代码文件中的间接函数调用对包含在另一源代码文件中的外部函数进行了调用,则将基于该另一源代码文件的编译文件生成运行时函数表。换言之,运行时函数表基于该另一源代码文件的二进制文件生成。然后使用该运行时函数表来检查外部函数调用是否是合法调用,从而阻止非法调用。这个额外的检查层进一步强化了软件应用的控制流完整性的增强。
本领域技术人员将认识到,在整个说明书中,描述中的许多功能单元已记为模块。本领域技术人员还将认识到,模块可以实现为电子电路、逻辑芯片或设备内的电气和/或电子分立组件的任何组合。此外,本领域技术人员还将认识到,模块可以通过软件实现,软件则可以由各种处理器执行。在本发明实施例中,模块还可以包括可以指示计算机处理器基于接收的指令执行一系列事件的计算机指令或可执行代码。模块实现的选择作为设计选项留给本领域技术人员,并且不以任何方式限制本发明的范围。
如本领域技术人员所理解,编译软件应用的代码使得代码被转换为机器代码,机器代码则由处理器或虚拟机直接执行。在本发明实施例中,该机器代码可以包括存储在设备的存储器中的二进制代码。
图1示出了根据本发明实施例的一种支持软件应用的控制流完整性(controlflow integrity,CFI)增强的系统的示例性框图。图1中所示的系统包括用于从各种信源接收源代码的设备100。设备100可以包括但不限于能够无线地或通过有线连接执行计算功能的任何设备,例如服务器、计算机、平板电脑、移动计算机、上网本或可用于接收和执行指令的任何类型的计算设备。这些设备还设有用于执行各种计算和处理功能的各种模块。
通常,设备100设有编译器模块110。编译器模块110用于接收源代码105,并编译源代码105以产生二进制文件112。然后将二进制文件112存储在存储器220中,随后,设备100在存储器220中执行二进制文件112。
在本发明实施例中,设备100还可以设有开发模块(未示出),该开发模块可用于提供集成开发环境(integrated development environment,IDE)以进行软件应用开发。开发模块可以用于支持设备100内的软件应用的设计、开发、测试和/或部署。开发模块还用于支持不同编程语言以及集成不同模块以简化软件应用的开发。此外,开发模块还用于使开发者可以创建和编辑某个项目的源代码以及编译源代码以执行软件应用。
设备100可以用于通过互联网或无线网络与其它设备或外部信源进行无线通信,无线网络可以为但不限于蜂窝网络、卫星网络、电信网络或广域网(Wide Area Network,WAN)。设备100和其它外部设备之间的通信也可以通过有线方式进行。通过这些通信方式,外部用户可以远程访问设备100中包含的模块,以进行软件应用的开发或安全地运行设备100中包含的软件应用。
图2示出了根据本发明实施例的表示一种可设在设备100内的用于实现实施例的模块200的组件的框图。本领域技术人员将认识到,设于设备或接入点内的每个无线设备的确切配置可能不同,模块200的确切配置可能有所不同,而且图2仅作为示例提供。
在本发明实施例中,模块200包括控制器201和用户接口202。用户接口202用于实现用户和模块200之间的手动交互,为此,用户接口202包括在用户输入指令以控制模块200时所需的输入/输出组件。本领域技术人员将认识到,用户接口202的组件可以根据实施例而变化,但通常包括显示器240、键盘235和轨迹板236中的一个或多个。
控制器201通过总线215与用户接口202进行数据通信,并包括存储器220、安装在电路板上并且处理指令和数据以执行本实施例的方法的处理器205、操作系统206、与用户接口202进行通信的输入/输出(input/output,I/O)接口230,和在本实施例中以网卡250的形式示出的通信接口。网卡250可以用于将数据通过有线或无线网络从电子设备200发送到其它处理设备,或通过有线或无线网络接收数据等。网卡250可使用的无线网络包括但不限于无线保真(Wireless-Fidelity,Wi-Fi)、蓝牙、近场通信(Near Field Communication,NFC)、蜂窝网络、卫星网络、电信网络、广域网(Wide Area Network,WAN)等。
存储器220和操作系统206通过总线210与CPU 205进行数据通信。存储器组件包括易失性和非易失性存储器以及多种下述存储器:随机存取存储器(Random Access Memory,RAM)220、只读存储器(Read Only Memory,ROM)225和大容量存储设备245,还包括一个或多个固态驱动器(solid-state drive,SSD)或任何其它类型的驱动器。存储器220还包括用于安全地存储安全数据的安全存储246。应注意,安全存储246中的内容可能仅可由模块200的超级用户或管理员访问,而不可由模块200的任何用户访问。本领域技术人员将认识到,上述存储器组件包括非瞬时性计算机可读介质,并且应当包括除瞬时性传播信号之外的所有计算机可读介质。通常,指令作为程序代码存储在存储器组件中,但是还可以进行硬连线。存储器220可以包括内核和/或编程模块,例如可以存储在易失性或非易失性存储器中的软件应用。
本文中的术语“处理器”用于泛指能够处理这些指令的任何设备或组件,可以包括:微处理器、微控制器、可编程逻辑设备或其它计算设备。即,处理器205可以由任何合适的逻辑电路提供,用于接收输入,根据存储在存储器中的指令处理输入并生成输出(例如生成到存储器组件或显示器240的输出)。在本实施例中,处理器205可以是具有可寻址内存空间的单核或多核处理器。在一个示例中,处理器205可以是多核CPU,包括8核CPU等。
图3示出了根据本发明实施例的一种用于编译源代码以生成随后执行的二进制代码的设备100内的系统的框图。除此之外,图3还示出了显示在将所得的二进制文件320提供给存储器图330之前源代码305与编译器模块310的交互的流程图,该二进制文件320在存储器图330中执行。
在操作中,首先将源代码305提供给编译器模块310。应注意,在本发明实施例中,当编译器310开始编译源代码305时,编译器310将CFI校验函数307生成为二进制代码。这样,编译器310可以调用CFI校验函数307。
CFI校验函数307本质上是一种在被调用时检查主题函数是否包含在目标文件中的函数。在本发明实施例中,当CFI校验函数307被调用时,CFI校验函数307将确定主题函数是否包含在简化函数表315中。如果主题函数未包含在简化函数表315中,则CFI校验函数307将主题函数调用标记为违规,然后将阻止执行主题函数。下文将详细描述简化函数表315的生成。
就源代码305而言,该源代码可以包括使用C++编程语言等本领域技术人员已知的任何编程语言编写的代码。
在本发明实施例中,编译器模块310还设有函数指针分配分析(function pointerassignment analysis,FPAA)编译器311。FPAA编译器311用于在编译器310编译源代码305时基于源代码305生成简化函数表315。FPAA编译器311的内部工作原理最好使用如下所示的源代码305的样本来描述。本领域技术人员将认识到,该源代码仅作为示例示出,并不以任何方式限制本发明。
在编译器310编译源代码305时,FPAA编译器311用于从源代码305中检测和检索所有间接函数调用,例如但不限于将函数分配给函数指针的调用分配。在本发明实施例中,FPAA编译器311用于检测作为数据结构的一部分分配的间接函数调用、直接分配给函数的间接函数调用或作为汇编(ASM)函数调用分配的间接函数调用。下文列出了从上述源代码中提取的示例性间接函数调用。
本领域技术人员从这里将认识到,任何提及的间接函数调用都可与函数指针或上述类型的任何间接函数调用相关。
在检测各种类型的间接函数调用时,这些间接函数调用所引用的函数或这些函数指针分配中的函数随后被添加到简化函数表315中。在上文示出的示例源代码中,这意味着以下函数最终会全部添加到简化函数表315中。
在编译器310编译源代码305时,编译器310可以同时生成CFI校验函数307。
在操作中,编译器310正常编译源代码305以产生已编译源代码312。然而,当编译器310遇到源代码305中的间接函数调用时,编译器310将编译间接函数调用,随后将已编译间接函数调用与已编译源代码312中的CFI校验函数307相关联,以便在执行已编译源代码312时,在可以执行已编译间接函数调用之前将执行或运行相关联的CFI校验函数307。间接函数调用引用的函数随后也将会添加到简化函数表315中。
换言之,将已编译间接函数调用与CFI校验函数307相关联包括:在已编译间接函数调用的二进制代码之前的行中,将CFI校验函数307插入已编译源代码312中,以便操作系统在运行已编译间接函数调用之前执行CFI校验函数307。
重复将CFI校验函数307与已编译间接函数调用相关联并且将间接函数调用引用的函数添加到简化函数表315中的这一过程,直到将源代码305中的每个已编译间接函数调用与它们各自的CFI校验函数307相关联并且相应地生成了简化函数表315。在这个阶段,二进制文件320将会包括简化函数表315、CFI校验函数307和已编译源代码312,已编译源代码312将包括CFI校验函数307的所有相关关联或插入。
然后将二进制文件320提供给包含在设备100的存储器内的进程存储器330。随后从二进制文件320中提取已编译源代码312、简化函数表315和CFI校验函数307,并存储在设在进程存储器330内的文本部分334中。
然后,设备100接着执行存储在文本部分334内的已编译源代码312。正常运行已编译源代码312,直到已编译源代码312遇到先前已插入到代码312中的CFI校验函数307。当发生这种情况时,设备100将检查简化函数表315以确定与CFI校验函数307相关联的间接函数调用中引用的函数是否包含在简化函数表315中。如果设备100确定与CFI校验函数307相关联的间接函数调用中引用的函数包含在简化函数表315中,则设备100将正常执行相关联的间接函数调用。然后,设备100继续正常执行已编译源代码312,直到检测到另一个CFI校验函数307,然后重复上述过程。
相反,如果在任何阶段,设备100确定与CFI校验函数307相关联的间接函数调用中引用的函数未包含在简化函数表315中,则设备100将中止相关联的间接函数调用的执行,因为这意味着发生了违规行为。在此阶段,设备100可以用于跳过受影响的间接函数调用并继续执行二进制文件320,发出通知管理员发生违规行为的警报,或者设备100可以用于完全中止二进制文件320的运行。
图4示出了根据本发明实施例的一种用于编译两个不同源代码以生成随后执行的二进制代码的设备100内的系统的框图。
在操作中,将源代码305和源代码405以类似方式提供给编译器模块310,而控制流完整性(control flow integrity,CFI)校验函数307由编译器310生成。先前已结合图3描述了FPAA编译器模块311、编译器310和CFI校验函数307的功能。然而,在图4所示的实施例中,源代码305包含对源代码405中的函数的间接函数调用。换言之,源代码405包含源自源代码305的外部函数调用。
下文提供了源代码305的另一示例以及源代码405的示例。本领域技术人员将认识到,这些源代码仅作为示例示出,并不以任何方式限制本发明。
在上述示出的示例中,当编译器310接收并开始编译源代码305时,FPAA编译器311将检测编译器310中包含的间接函数调用。然后,这些间接函数调用引用的函数将会添加到简化函数表中。在编译器310开始编译源代码305时,编译器310可以同时生成CFI校验函数307。
类似地,编译器310将会正常编译源代码305以产生已编译源代码。当编译器310遇到源代码305中的间接函数调用时,编译器310将编译间接函数调用,随后将已编译间接函数调用与已编译源代码中的CFI校验函数相关联,以便在操作系统执行已编译源代码时,在可以执行已编译间接函数调用之前将执行或运行相关联的CFI校验函数。间接函数调用引用的函数随后也将会添加到简化函数表中。
在本发明实施例中,当编译器310遇到dlsym()函数等间接外部函数调用时,编译器310将编译该间接外部函数调用,并随后将已编译间接外部函数调用与已编译源代码中的CFI校验函数相关联,以便当操作系统执行已编译源代码时,在可以执行已编译间接外部函数调用之前将执行或运行相关联的CFI校验函数。然而,间接外部函数调用(例如dlsym())中引用的函数调用将不会添加到简化函数表中。
重复将CFI校验函数与已编译间接函数调用和间接外部函数调用相关联并且将某些间接函数调用引用的函数添加到简化函数表中的这一过程,直到源代码305中的每个已编译间接函数调用和间接外部函数调用已与它们各自的CFI校验函数相关联并且相应地生成了简化函数表。出于完整性,在上述示例中,这意味着简化函数表将仅包括“funcA2”。
在这个阶段,二进制文件320将会包括简化函数表、CFI校验函数和已编译源代码,已编译源代码将包括CFI校验函数的所有相关关联或插入。
在生成二进制文件320的同时或之后,编译器310将以与上述类似的方式接着编译源代码405,从而创建源代码405的简化函数表,将CFI校验函数与源代码405中的间接函数调用和/或间接外部函数调用相关联。
在这个阶段,二进制文件420将包括与源代码405相关联的简化函数表、CFI校验函数和已编译源代码405,已编译源代码405将包括CFI校验函数的所有相关关联或插入。应注意,在本发明的其它实施例中,FPAA编译器311可以用于正常编译源代码405以生成二进制文件420,即,不生成相关联的简化函数表并且不将CFI校验函数与已编译源代码405中的间接函数调用相关联。
然后将二进制文件320和二进制文件420提供给包含在设备100的存储器内的进程存储器330。随后从二进制文件320中提取相关联的简化函数表、CFI校验函数和已编译源代码305,并存储在文本部分334中。类似地,然后从二进制文件420中提取简化函数表、与已编译源代码405相关联的CFI校验函数和已编译源代码405,并存储在文本部分335中。
此外,如图4所示,还向进程存储器330提供共享库430,以便当操作系统执行已编译程序时,已编译程序可以访问共享库和/或存储在共享库430内的模块。
具体而言,包含在共享库430中的是函数指针分配分析(function pointerassignment analysis,FPAA)运行时模块422。FPAA运行时模块422用于使用在运行已编译程序期间声明的间接外部函数调用中引用的外部函数来检测和更新运行时函数表425。应注意,运行时函数表425由FPAA运行时模块422生成,存储在进程存储器330内的受保护存储器中。在本发明实施例中,当操作系统遇到正在执行的已编译源代码中的dlsym()函数等间接外部函数调用的分配时,将触发FPAA运行时模块422。然后,将dlsym()函数中引用的外部函数添加到运行时函数表425中。FPAA运行时模块422的详细工作原理将在下文的随后部分详细描述。此外,应注意,描述中提到的dlsym()函数已基于标准库Stdlib中可找到的dlsym()函数进行了修改。修改dlsym()函数使得每次在分配间接外部函数调用期间使用此dlsym()函数时,此dlsym()函数将触发FPAA运行时模块422。
在操作中,当操作系统执行存储在进程存储器330内的已编译源代码305时,已编译源代码305将正常运行,直到遇到已编译源代码305中的“加载”操作或命令。该“加载”操作本质上是一个命令,用于加载或读取进程存储器330中的另一个已编译源代码和/或加载包含在共享库430中的共享库。应注意,描述中提到的“加载”命令已基于标准库Stdlib中可找到的“加载”命令进行了修改。更改“加载”命令使得除了执行“加载”命令的标准功能之外,当操作系统遇到“加载”操作时,将使用已编译源代码或待加载到已编译源代码305中的共享库的地址更新(由FPAA运行时模块422生成并存储在进程存储器330内的受保护存储器中的)二进制图427。在上述示例中,当操作系统遇到已编译源代码305中的“加载405”命令时,这意味着已编译源代码“405”的地址将被加载到二进制图427中。
然后,在执行已编译源代码305时,FPAA运行时模块422继续使用已编译源代码和/或共享库的地址更新二进制图427,因为操作系统加载了这些参数。
此外,在运行已编译源代码305期间,当操作系统遇到dlsym()函数等间接外部函数调用时,将触发FPAA运行时模块422使用dlsym()函数中引用的函数来更新运行时函数表425。在上文提供的示例中,这意味着当操作系统执行“f1=dlsym(405,“funcB”)”命令时,FPAA运行时模块422将会把已编译源代码“405”中的“funcB”添加到运行时函数表425中。应注意,在这个阶段,源代码“405”的地址已被加载,因此已添加到二进制图427中。每次操作系统遇到dlsym()函数或正在执行的已编译源代码中的类似函数时,就重复更新运行时函数表425这一过程。
通常,必须在声明“dlsym()”函数之前声明“加载”命令,因为“dlsym()”函数可以参考二进制图427以获取“dlsym()”函数中引用的外部源代码的地址。本领域技术人员将认识到,这不是要求,并且本发明在布置函数和/或命令时还涵盖其它变体。
在操作系统执行已编译源代码305时,当操作系统遇到先前已插入已编译源代码305中的CFI校验函数时,操作系统将首先检查在与CFI校验函数相关联的间接函数调用中引用的函数是否包含在简化函数表315中。为简洁起见,从此处开始,除有明确区分,否则任何提及的间接函数调用都是指间接函数调用和间接外部函数调用这两者。如果操作系统确定与CFI校验函数相关联的间接函数调用中引用的函数包含在与已编译源代码305相关联的简化函数表中,则设备100将正常执行相关联的间接函数调用。
相反,如果操作系统确定与CFI校验函数相关联的间接函数调用中引用的函数调用未包含在与源代码305相关联的简化函数表中,则操作系统将尝试确定CFI校验函数是否与间接外部函数调用相关联。操作系统通过尝试从二进制图427中检索间接函数调用中引用的地址来完成此操作。如果操作系统无法获得相关地址,则操作系统将中止执行相关联的间接函数调用,因为这意味着发生了违规行为。
在上文的示例中,假设操作系统调用了函数“f1()”,即调用了间接外部函数调用,这意味着操作系统将尝试从二进制图427中获取“405”的地址。由于先前已将“405”的地址添加到二进制图427中,因此操作系统将加载该地址。然后,在地址成功加载时,操作系统确认间接函数调用的类型是间接外部函数调用。
然后,操作系统将基于加载的已编译源代码405确定已编译源代码405是否与遗留计算代码相关。如果操作系统确定已编译源代码405与遗留计算代码相关,则操作系统将正常执行间接外部函数调用。在描述中,遗留计算代码指的是尚未根据本发明实施例进行编译的源代码。
相反,如果操作系统确定已编译源代码405与遗留计算代码无关并且已根据本发明实施例进来了编译,则操作系统将检查与已编译源代码405相关联的简化函数表,以确定简化函数表中是否包含间接外部函数调用中引用的函数。如果间接外部函数调用中引用的函数包含在相关联的简化函数表中,则操作系统将正常执行间接外部函数调用。
如果间接外部函数调用中引用的函数未包含在相关联的简化函数表中,则操作系统接着检查间接外部函数调用中引用的函数是否包含在运行时函数表425中。在该示例中,由于FPAA运行时模块422先前已将“funcB”(即f1()中引用的函数)添加到运行时函数表425,这意味着操作系统将确定运行时函数表425中存在“funcB”。然后,操作系统将正常执行间接外部函数调用“f1()”。如果间接外部函数调用中引用的函数未包含在运行时函数表425中,则操作系统中止程序的运行,因为这意味着发生了违规行为。在此阶段,设备100可以用于跳过受影响的间接函数调用并向管理员发出警报,或者设备100可以用于完全中止二进制文件320的运行。
根据本发明实施例,一种用于设备增强软件应用的控制流完整性的方法包括该设备执行以下步骤:
步骤1:接收软件应用的第一源代码文件,第一源代码文件包括函数和间接函数调用;
步骤2:编译第一源代码以生成第一二进制文件,编译第一源代码包括:对于每个已编译间接函数调用,
子步骤(a):将控制流完整性校验函数与第一二进制文件中的每个已编译间接函数调用相关联,以便在执行每个已编译间接函数调用之前执行相关联的控制流完整性校验函数,以及
子步骤(b):将每个已编译间接函数调用中引用的函数添加到简化函数表中。
为了提供该方法,需要一种过程来配置设备增强软件应用的控制流完整性。以下描述和图5至图7描述了根据本发明的提供必要步骤的过程的实施例。
图5示出了根据本发明实施例的设备在已编译源代码的运行时期间执行的过程500。过程500开始于步骤505:加载根据本发明实施例进行编译的源代码文件。应注意,在编译该源代码期间,已将CFI校验函数与间接函数调用相关联,并且已基于已编译源代码中的间接函数调用生成了简化函数表。
然后,过程500正常运行加载的源代码。当在步骤510处,过程500遇到先前已插入到源代码中的CFI校验函数时,过程500将识别与CFI校验函数相关联的间接函数调用。然后,在步骤515处,过程500确定所识别的间接函数调用中引用的函数是否包含在先前生成的简化函数表(reduced function table,RFT)中。如果过程500确定间接函数调用中引用的函数未包含在RFT中,则过程500将中止运行加载的源代码,因为这意味着发生了违规行为。然后过程500结束。
相反,如果过程500确定所识别的间接函数调用中引用的函数包含在先前生成的RFT中,则过程500将转到步骤520。然后,在步骤520处,过程500将正常执行间接函数调用。完成后,过程500则转到步骤525:过程500继续正常执行源代码,直到过程500遇到另一个CFI校验函数或者直到源代码中的所有代码都已被执行。如果遇到另一个CFI校验函数,则过程500将返回步骤510。然后,过程500重复步骤510至525。一旦执行完源代码中的所有代码,过程500就结束。
图6示出了根据本发明实施例的设备在已编译源代码A的运行时期间执行的过程600,其中源代码A包括间接函数调用和对源代码B中的函数的间接外部函数调用。过程600开始于步骤605:设备加载已编译源代码A。应注意,在编译源代码A期间,已将CFI校验函数与间接外部函数调用相关联,并且已基于已编译源代码A中的间接函数调用生成了简化函数表,如上文所述。
当在步骤610处,过程600遇到源代码A中的间接外部函数调用的分配或加载命令时,过程600首先将识别待执行的命令。如果遇到“加载”命令,则过程600将转到步骤625:过程600然后识别在源代码A的运行期间要加载的其它源文件或库。然后,在步骤630处,过程600接着使用在先前的步骤610中识别的源文件或库的地址更新二进制图。在本实施例中,如果进程600遇到“加载B”命令,则意味着源代码B的地址将会被添加到二进制图中。
或者,如果在步骤610处,过程600遇到间接外部函数调用的分配,则过程600识别该间接外部函数调用中引用的函数和外部源代码或库。然后,在步骤620处,过程600基于间接外部函数调用中引用的外部源代码和二进制图中外部源代码的地址将间接外部函数调用中引用的函数添加到运行时函数表中。
然后,在步骤635处,过程600接着正常选择源代码A中的下一命令。在步骤640处,对于选择的每个命令,过程600将查询该命令,以确定该命令是否包括源代码A中的间接外部函数命令的其它分配或加载命令。如果在步骤640处命令满足条件,则过程600返回步骤610,从而过程600在该步骤确定发生过的命令。然后,过程600根据需要转到步骤615或625。
或者,如果在步骤640处过程600确定在步骤635中选择的命令不包括源代码A中的间接外部函数命令的其它分配或加载命令,则过程600转到步骤645:执行选择的命令。然后,过程600返回步骤635以选择下一命令。重复图6中的步骤,直到源代码A中的所有命令或指令都已执行。然后过程600结束。
图7示出了在过程600的步骤645中由设备在源代码A的运行时期间执行的过程700。当过程600在步骤645处尝试执行选择的命令时,过程700开始。
然后,在步骤705处,过程700确定选择的命令是否包括CFI校验函数。如果该命令不是CFI校验函数,则过程700返回到步骤645以执行选择的命令。
或者,如果在步骤705处过程700确定选择的命令是CFI校验函数,则过程700转到步骤710。在步骤710处,过程700首先识别与CFI校验函数相关联的间接函数调用。然后,过程700检查间接函数调用中引用的函数是否包含在与源代码A相关联的简化函数表中。如果过程700确定间接函数调用中引用的函数包含在与源代码A相关联的简化函数表中,则过程700将通过返回步骤645来执行相关联的间接函数调用。
相反,如果过程700确定间接函数调用中引用的函数未包含在与源代码A相关联的简化函数表中,则过程700将转到步骤715。在步骤715处,过程700将尝试确定CFI校验函数是否与间接外部函数调用相关联。过程700通过尝试从二进制图中检索间接函数调用中引用的地址来完成此操作。如果过程700无法获得相关地址,则过程700将结束,因为这意味着发生了违规行为。
在本实施例中,假设间接函数调用包含源代码B的地址。如果进程700能够获得间接函数调用中引用的地址,即源代码B的地址,则意味着间接函数调用为间接外部函数调用。然后过程700转到步骤720。随后,在该步骤处,过程700使用源代码B的地址来确定与该地址相关联的源代码是否与遗留计算代码相关。如果过程700确定源代码B与遗留计算代码相关,则过程700将通过返回步骤645来正常执行间接外部函数调用。
然而,如果过程700确定源代码B与遗留计算代码无关并且已根据本发明实施例进行了编译,则过程700将检查与源代码B相关联的简化函数表(reduced function table,RFT),以确定简化函数表中是否包含间接外部函数调用中引用的函数。这在步骤725处进行。如果间接外部函数调用中引用的函数包含在源代码B的相关联的简化函数表中,则过程700通过返回步骤645来正常执行间接外部函数调用。
如果间接外部函数调用中引用的函数未包含在源代码B的相关联的简化函数表中,则过程700接着检查间接外部函数调用中引用的函数是否包含在运行时函数表中。这在步骤730处进行。如果该函数可以在运行时函数表中找到,则过程700将转到步骤645以正常执行间接外部函数调用。然而,如果间接外部函数调用中引用的函数未包含在运行时函数表中,则过程700中止源代码A的运行,因为这意味着发生了违规行为。然后过程700结束。
在本发明实施例中,一旦在步骤715处过程700确定间接函数调用为间接外部函数调用,过程700就可以直接转到步骤730:过程700接着检查间接外部函数调用中引用的函数是否包含在运行时函数表中。如果该函数可以在运行时函数表中找到,则过程700将转到步骤645以正常执行间接外部函数调用。然而,如果间接外部函数调用中引用的函数未包含在运行时函数表中,则过程700中止源代码A的运行,因为这意味着发生了违规行为。然后过程700结束。在本发明本实施例中,可以跳过步骤720和725。
在本发明实施例中,一旦在步骤715处过程700确定间接函数调用为间接外部函数调用,过程700就可以直接转到步骤725:过程700将检查与源代码B相关联的简化函数表(reduced function table,RFT),以确定简化函数表中是否包含间接外部函数调用中引用的函数。这在步骤725处进行。如果间接外部函数调用中引用的函数包含在源代码B的相关联的简化函数表中,则过程700通过返回步骤645来正常执行间接外部函数调用。
否则,则过程700转到步骤730:过程700接着检查间接外部函数调用中引用的函数是否包含在运行时函数表中。如果该函数可以在运行时函数表中找到,则过程700将转到步骤645以正常执行间接外部函数调用。然而,如果间接外部函数调用中引用的函数未包含在运行时函数表中,则过程700中止源代码A的运行,因为这意味着发生了违规行为。然后过程700结束。在本发明本实施例中,可以跳过步骤720。
以上是如在所附权利要求书中阐述的根据本发明的设备和过程的实施例的描述。预计其它人可能以及将会设计落入所附权利要求书的范围内的替代方案。

Claims (20)

1.一种用于增强软件应用的控制流完整性的设备,其特征在于,包括:
处理器;以及
所述处理器可读的非瞬时性介质,所述非瞬时性介质存储当由所述处理器执行时使得所述处理器执行以下操作的指令:
接收所述软件应用的第一源代码文件,所述第一源代码文件包括函数和间接函数调用;
获取通过编译所述第一源代码文件生成的第一二进制文件,其中,所述第一源代码的编译包括:
将控制流完整性校验函数与所述第一二进制文件中的每个已编译间接函数调用相关联,以便在执行所述每个已编译间接函数调用之前执行所述相关联的控制流完整性校验函数,以及
将所述每个已编译间接函数调用中引用的函数添加到简化函数表中;
还包括:
指示所述处理器执行以下操作的指令:
加载所述第一二进制文件用于执行;
在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;
当在所述第一二进制文件中执行间接外部函数调用的分配时,用间接外部函数调用中引用的函数更新运行时函数表;
执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;以及
当确定所述相关联的间接函数调用中引用的所述函数包含在所述简化函数表中时,执行所述相关联的间接函数调用。
2.根据权利要求1所述的设备,其特征在于,还包括:
在以下情况下执行所述相关联的间接函数调用:
当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,
当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,以及
当确定所述第二二进制文件已经以传统方式编译时。
3.根据权利要求1所述的设备,其特征在于,还包括:
在以下情况下执行所述相关联的间接函数调用:
当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,
当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,
当确定所述第二二进制文件未以传统方式编译时,以及
当所述相关联的间接函数调用中引用的所述函数包含在与所述第二二进制文件相关联的简化函数表中时。
4.根据权利要求1所述的设备,其特征在于,还包括:
在以下情况下执行所述相关联的间接函数调用:
当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,
当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,
当确定所述第二二进制文件未以传统方式编译时,
当所述相关联的间接函数调用中引用的所述函数未包含在与所述第二二进制文件相关联的简化函数表中时,以及
当所述相关联的间接函数调用中引用的所述函数包含在所述运行时函数表中时。
5.根据权利要求1所述的设备,其特征在于,还包括:
在以下情况下执行所述相关联的间接函数调用:
当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,
当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,以及
当所述相关联的间接函数调用中引用的所述函数包含在所述运行时函数表中时。
6.根据权利要求1至5中任一项所述的设备,其特征在于,所述运行时函数表存储在所述处理器可读的受保护的非瞬时性介质中。
7.根据权利要求1至5中任一项所述的设备,其特征在于,所述二进制图存储在所述处理器可读的受保护的非瞬时性介质中。
8.根据权利要求1至5中任一项所述的设备,其特征在于,所述间接函数调用包括作为数据结构的一部分分配的间接函数调用。
9.根据权利要求8所述的设备,其特征在于,所述间接函数调用还包括直接分配给函数的间接函数调用。
10.根据权利要求9所述的设备,其特征在于,所述间接函数调用还包括作为汇编函数调用分配的间接函数调用。
11.一种使用计算设备增强软件应用的控制流完整性的方法,其特征在于,所述方法包括:
接收所述软件应用的第一源代码文件,所述第一源代码文件包括函数和间接函数调用;
获取通过编译所述第一源代码生成的第一二进制文件,其中,所述第一源代码的编译包括:
将控制流完整性校验函数与所述第一二进制文件中的每个已编译间接函数调用相关联,以便在执行每个已编译间接函数调用之前执行相关联的控制流完整性校验函数,以及
将每个已编译间接函数调用中引用的函数添加到简化函数表中;
所述方法还包括:
加载所述第一二进制文件用于执行;
在执行所述第一二进制文件中的加载命令时,用加载命令中引用的地址的更新二进制图;
当在所述第一二进制文件中执行间接外部函数调用的分配时,用所述间接外部函数调用中引用的函数更新运行时函数表;
执行所述已编译第一二进制文件,对于每个执行的控制流完整性校验函数而言,所述控制流完整性校验函数确定某个相关联的间接函数调用中引用的函数是否包含在所述简化函数表中;以及
当确定所述相关联的间接函数调用中引用的所述函数包含在所述简化函数表中时,执行所述相关联的间接函数调用。
12.根据权利要求11所述的方法,其特征在于,还包括:
在以下情况下执行所述相关联的间接函数调用:
当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,
当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,以及
当确定所述第二二进制文件已经以传统方式编译时。
13.根据权利要求11所述的方法,其特征在于,还包括:
在以下情况下执行所述相关联的间接函数调用:
当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,
当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,
当确定所述第二二进制文件未以传统方式编译时,以及
当所述相关联的间接函数调用中引用的所述函数包含在与所述第二二进制文件相关联的简化函数表中时。
14.根据权利要求11所述的方法,其特征在于,还包括:
在以下情况下执行所述相关联的间接函数调用:
当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,
当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,
当确定所述第二二进制文件未以传统方式编译时,
当所述相关联的间接函数调用中引用的所述函数未包含在与所述第二二进制文件相关联的简化函数表中时,以及
当所述相关联的间接函数调用中引用的所述函数包含在所述运行时函数表中时。
15.根据权利要求11所述的方法,其特征在于,还包括:
在以下情况下执行所述相关联的间接函数调用:
当确定所述相关联的间接函数调用中引用的所述函数未包含在所述简化函数表中时,
当所述相关联的间接函数调用中引用的所述函数包含在具有所述二进制图中包含的地址的第二二进制文件中时,以及
当所述相关联的间接函数调用中引用的所述函数包含在所述运行时函数表中时。
16.根据权利要求11至15中任一项所述的方法,其特征在于,所述运行时函数表存储在处理器可读的受保护的非瞬时性介质中。
17.根据权利要求11至15中任一项所述的方法,其特征在于,所述二进制图存储在处理器可读的受保护的非瞬时性介质中。
18.根据权利要求11至15中任一项所述的方法,其特征在于,所述间接函数调用包括作为数据结构的一部分分配的间接函数调用。
19.根据权利要求18所述的方法,其特征在于,所述间接函数调用还包括直接分配给函数的间接函数调用。
20.根据权利要求19所述的方法,其特征在于,所述间接函数调用还包括作为汇编函数调用分配的间接函数调用。
CN201880013935.XA 2017-02-27 2018-02-26 增强软件应用的控制流完整性的设备和方法 Active CN110325994B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
SG10201701541SA SG10201701541SA (en) 2017-02-27 2017-02-27 Device and method for reinforcing control flow integrity of software application
SG10201701541S 2017-02-27
PCT/SG2018/050086 WO2018156085A1 (en) 2017-02-27 2018-02-26 Device and method for reinforcing control flow integrity of software application

Publications (2)

Publication Number Publication Date
CN110325994A CN110325994A (zh) 2019-10-11
CN110325994B true CN110325994B (zh) 2023-09-22

Family

ID=61581698

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201880013935.XA Active CN110325994B (zh) 2017-02-27 2018-02-26 增强软件应用的控制流完整性的设备和方法

Country Status (6)

Country Link
US (1) US11429511B2 (zh)
EP (1) EP3580680B1 (zh)
CN (1) CN110325994B (zh)
BR (1) BR112019017714A2 (zh)
SG (1) SG10201701541SA (zh)
WO (1) WO2018156085A1 (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11687646B2 (en) * 2019-08-15 2023-06-27 Dellfer, Inc. Forensic data collection and analysis utilizing function call stacks
CN112668004B (zh) * 2019-10-16 2022-06-21 武汉斗鱼网络科技有限公司 一种基于llvm的函数校验方法及相关装置
CN111898130B (zh) * 2020-06-28 2024-01-19 中国科学院信息工程研究所 一种细粒度控制流完整性保护实现方法及系统
CN112799725B (zh) * 2020-10-30 2024-03-26 航天东方红卫星有限公司 一种适用于卫星型号的指令控制数据块功能的设计方法
WO2023107261A1 (en) * 2021-12-08 2023-06-15 Qualcomm Incorporated Methods for improving security in computing devices implementing control flow integrity

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101473300A (zh) * 2006-06-23 2009-07-01 微软公司 通过实施数据流完整性来保护软件
CN103345445A (zh) * 2013-07-02 2013-10-09 华中科技大学 基于控制流检测的抗错误注入攻击的安全芯片设计方法
CN105868626A (zh) * 2016-03-25 2016-08-17 中国人民解放军信息工程大学 基于控制流粗粒度完整性的监控软件业务行为的方法
CN106021110A (zh) * 2016-05-24 2016-10-12 南京大学 基于虚函数表继承关系的代码重利用攻击检测方法
CN106295258A (zh) * 2016-08-04 2017-01-04 南京大学 用于多线程后向控制流完整性保护的影子栈实现方法

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7577992B2 (en) 2005-01-14 2009-08-18 Microsoft Corporation Software security based on control flow integrity
US8341613B2 (en) * 2007-12-04 2012-12-25 International Business Machines Corporation Reducing stack space consumption via head-call optimization
US8117660B2 (en) 2008-06-19 2012-02-14 Microsoft Corporation Secure control flows by monitoring control transfers
US8504839B2 (en) * 2008-10-27 2013-08-06 Advanced Micro Devices, Inc. Method, apparatus, and device for protecting against programming attacks and/or data corruption
US20100192026A1 (en) * 2009-01-27 2010-07-29 Microsoft Corporation Implementations of program runtime checks
WO2011116448A1 (en) * 2010-03-25 2011-09-29 Irdeto Canada Corporation System and method for dynamic, variably-timed operation paths as a resistance to side channel and repeated invocation attacks
US20130024676A1 (en) * 2011-07-19 2013-01-24 Glew Andrew F Control flow integrity
US8943313B2 (en) * 2011-07-19 2015-01-27 Elwha Llc Fine-grained security in federated data sets
US9798873B2 (en) * 2011-08-04 2017-10-24 Elwha Llc Processor operable to ensure code integrity
US11003464B2 (en) * 2012-04-19 2021-05-11 Microsoft Technology Licensing, Llc Control flow integrity enforcement at scale
AU2014348812B2 (en) * 2013-11-12 2019-09-26 RunSafe Security, Inc. Improved control flow integrity system and method
US9361102B2 (en) * 2014-06-09 2016-06-07 Lehigh University Methods for enforcing control flow of a computer program
US9390260B2 (en) 2014-06-09 2016-07-12 Lehigh University Methods for enforcing control flow of a computer program
US9767004B2 (en) * 2014-06-16 2017-09-19 Symantec Corporation Dynamic call tracking method based on CPU interrupt instructions to improve disassembly quality of indirect calls
US9569613B2 (en) * 2014-12-23 2017-02-14 Intel Corporation Techniques for enforcing control flow integrity using binary translation
US9767292B2 (en) * 2015-10-11 2017-09-19 Unexploitable Holdings Llc Systems and methods to identify security exploits by generating a type based self-assembling indirect control flow graph
US10372902B2 (en) * 2017-03-06 2019-08-06 Intel Corporation Control flow integrity

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101473300A (zh) * 2006-06-23 2009-07-01 微软公司 通过实施数据流完整性来保护软件
CN103345445A (zh) * 2013-07-02 2013-10-09 华中科技大学 基于控制流检测的抗错误注入攻击的安全芯片设计方法
CN105868626A (zh) * 2016-03-25 2016-08-17 中国人民解放军信息工程大学 基于控制流粗粒度完整性的监控软件业务行为的方法
CN106021110A (zh) * 2016-05-24 2016-10-12 南京大学 基于虚函数表继承关系的代码重利用攻击检测方法
CN106295258A (zh) * 2016-08-04 2017-01-04 南京大学 用于多线程后向控制流完整性保护的影子栈实现方法

Also Published As

Publication number Publication date
BR112019017714A2 (pt) 2022-03-22
WO2018156085A1 (en) 2018-08-30
US20190384693A1 (en) 2019-12-19
CN110325994A (zh) 2019-10-11
SG10201701541SA (en) 2018-09-27
EP3580680A1 (en) 2019-12-18
US11429511B2 (en) 2022-08-30
EP3580680B1 (en) 2023-10-25

Similar Documents

Publication Publication Date Title
CN110325994B (zh) 增强软件应用的控制流完整性的设备和方法
US8245289B2 (en) Methods and systems for preventing security breaches
RU2531861C1 (ru) Система и способ оценки вредоносности кода, исполняемого в адресном пространстве доверенного процесса
US10310992B1 (en) Mitigation of cyber attacks by pointer obfuscation
US20150213260A1 (en) Device and method for detecting vulnerability attack in program
US20190102552A1 (en) System and method for detection of malicious code in the address space of processes
US9904792B1 (en) Inhibition of heap-spray attacks
JP2019502197A (ja) ランタイム生成コードにおける悪意のあるコードの検出のためのシステムおよび方法
US11449615B2 (en) System and method of forming a log when executing a file with vulnerabilities in a virtual machine
US8332941B2 (en) Exploit nonspecific host intrusion prevention/detection methods and systems and smart filters therefor
CN110390200B (zh) 用于通过拦截函数调用识别应用程序的漏洞的系统和方法
US10229046B2 (en) Memory categorization
US11397812B2 (en) System and method for categorization of .NET applications
US11853412B2 (en) Systems and methods for defeating stack-based cyber attacks by randomizing stack frame size
US11500982B2 (en) Systems and methods for reliably injecting control flow integrity into binaries by tokenizing return addresses
US11755723B2 (en) Device and method for validation of virtual function pointers
EP3040895A1 (en) System and method for protecting a device against return-oriented programming attacks
WO2020012474A1 (en) Return-oriented programming attack protection system and method
US8863159B2 (en) System, method and computer program product for inserting an emulation layer in association with a COM server DLL
CN111382433B (zh) 模块加载方法、装置、设备以及存储介质
KR102626841B1 (ko) 동적 라이브러리의 자가 무결성 검증 방법 및 이를 위한 장치
EP3674940B1 (en) System and method of forming a log when executing a file with vulnerabilities in a virtual machine
US20160313938A1 (en) Fine grained memory protection to thwart memory overrun attacks
Zolotarev et al. Memory Obfuscation by Stack Randomization for Android Applications

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