CN111919214A - 针对安全性违反的补丁的自动生成 - Google Patents

针对安全性违反的补丁的自动生成 Download PDF

Info

Publication number
CN111919214A
CN111919214A CN201880091955.9A CN201880091955A CN111919214A CN 111919214 A CN111919214 A CN 111919214A CN 201880091955 A CN201880091955 A CN 201880091955A CN 111919214 A CN111919214 A CN 111919214A
Authority
CN
China
Prior art keywords
patch
code
candidate
processors
security violation
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
CN201880091955.9A
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.)
Google LLC
Original Assignee
Google LLC
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 Google LLC filed Critical Google LLC
Publication of CN111919214A publication Critical patent/CN111919214A/zh
Pending legal-status Critical Current

Links

Images

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/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • 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/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/658Incremental updates; Differential updates
    • 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)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Quality & Reliability (AREA)
  • Stored Programmes (AREA)

Abstract

本公开的各方面提供用于为安全性违反自动地生成补丁。例如,可以为代码生成多个输入。可以使用多个输入来执行代码以获得多个代码位置处的执行状态。执行状态可以包括针对多个输入中的至少一些的至少一个安全性违反。使用执行状态,可以确定引起至少一个安全性违反的一个或多个补丁条件。使用执行状态,可以基于多个代码位置中的一个或多个补丁条件中的每一个均发生了至少一个安全性违反的代码位置来确定一个或多个对应补丁位置。可以自动地生成针对至少一个安全性违反的至少一个候选补丁。该至少一个候选补丁可以包括补丁条件中的一个和对应补丁位置中的一个。

Description

针对安全性违反的补丁的自动生成
相关申请的交叉引用
本申请要求2018年5月21日提交的美国临时申请号62/674,133的提交日的权益,其公开内容通过引用并入本文中。
背景技术
软件或应用代码中的安全性缺陷或违反修复起来可能要花费大量资源和时间,例如数月或更长时间。查找安全性违反的努力产生源源不断的此类问题,使得在任何给定时间,许多安全性违反是公开的或未修复的。在实践中,创建、测试和部署修复的过程需要由许多人类操作员进行计划外的努力。只要操作员在关键路径中,迅速地修复这些问题就是不可行的。在这些安全性违反公开的时间期间,这些应用仍然处于风险中。作为示例,安全性违反可以包括存储器安全性违反(诸如读取超过用于该数据的缓冲器大小的数据,因为这可能不适当地允许访问应用为了起作用而不应该访问的数据)、输入验证错误、竞争条件、未定义行为等。
发明内容
本公开的各方面提供了为安全性违反自动地生成补丁的方法。该方法包括:由一个或多个处理器为代码生成多个输入;由一个或多个处理器使用多个输入来执行代码以获得多个代码位置处的执行状态,这些执行状态包括针对多个输入中的至少一个的至少一个安全性违反;由一个或多个处理器使用执行状态来确定引起安全性违反的一个或多个补丁条件;由一个或多个处理器使用执行状态来基于多个代码位置中的发生了至少一个安全性违反条件的代码位置来确定一个或多个对应补丁位置;以及由一个或多个处理器为至少一个安全性违反自动地生成至少一个候选补丁,该至少一个候选补丁包括补丁条件中的一个和一个或多个对应补丁位置中的一个。
在一个示例中,该方法也包括由一个或多个处理器通过将至少一个候选补丁插入到代码中来生成打补丁的代码。在另一示例中,至少一个候选补丁被配置成使与至少一个安全性违反相关联的多个输入中的至少一些舍弃执行。在此示例中,至少一个候选补丁使代码的至少一部分在可能发生安全性违反之前中止执行。在另一示例中,至少一个候选补丁被配置成为安全性违反生成诊断信息的日志。在另一示例中,该方法也包括:由一个或多个处理器通过将一个或多个候选补丁中的每一个插入到代码中来生成候选打补丁的代码集;由一个或多个处理器使用多个输入来执行候选打补丁的代码中的每一个以获得多个代码位置处的打补丁的执行状态;由一个或多个处理器基于打补丁的执行状态在一个或多个候选补丁当中选择候选补丁;以及由一个或多个处理器通过将所选择的候选补丁插入到代码中来生成第二打补丁的代码。在另一示例中,该方法也包括:由一个或多个处理器基于复杂度、与至少一个安全性违反的位点的接近度或对代码的执行的影响中的至少一个从至少一个候选补丁中选择候选补丁;以及由一个或多个处理器通过将所选择的候选补丁插入到代码中来生成打补丁的代码。在此示例中,该方法也包括:由一个或多个处理器为打补丁的代码生成新的多个输入;由一个或多个处理器使用新的多个输入来执行打补丁的代码以获得多个代码位置处的新的执行状态,这些新的执行状态包括新的安全性违反;由一个或多个处理器使用新的执行状态来计算引起与多个输入中的一个或多个相关联的新的安全性违反的一个或多个新的补丁条件;由一个或多个处理器使用新的执行状态来确定发生一个或多个新的补丁条件中的每一个的一个或多个新的对应补丁位置;以及由一个或多个处理器为新的安全性违反生成至少一个新的候选补丁,该至少一个新的候选补丁中的每一个均包括新的补丁条件中的一个和新的对应补丁位置中的一个,其中,至少一个新的候选补丁被配置成使与新的安全性违反相关联的新的违反输入舍弃执行。此外或替换地,基于输入是否导致安全性违反对用于基于学习的模型的训练输入进行聚类。在另一示例中,使用机器学习模型来生成一个或多个补丁条件,并且该方法进一步包括基于输入是否到达代码中的感兴趣区域对用于模型的输入进行聚类。在另一示例中,确定一个或多个补丁条件进一步包括确定与至少一个安全性违反有关的至少一个动态不变量。在此示例中,动态不变量包括谓词模板。此外或替换地,该方法也包括将动态不变量中的两个或更多个联合以便确定一个或多个补丁条件。在另一示例中,生成一个或多个补丁条件进一步包括确定与至少一个安全性违反有关的最弱前置条件。在另一示例中,生成一个或多个补丁条件进一步包括通过由日志收集的存储器状态来跟踪数据流。在此示例中,通过存储器状态来跟踪数据流包括使用选择性存储器跟踪。
本公开的另一方面提供了一种用于为安全性违反自动地生成补丁的系统。该系统包括一个或多个处理器,该一个或多个处理器被配置成:为代码生成多个输入;使用多个输入来执行代码以获得多个代码位置处的执行状态,这些执行状态包括针对多个输入中的至少一个的安全性违反;使用执行状态来确定引起安全性违反的一个或多个补丁条件;使用执行状态来基于多个代码位置中的一个或多个补丁条件中的每一个均发生了至少一个安全性违反的代码位置来确定一个或多个对应补丁位置;以及为至少一个安全性违反自动地生成至少一个候选补丁,该至少一个候选补丁包括补丁条件中的一个和一个或多个对应补丁位置中的一个。
在一个示例中,一个或多个处理器被进一步配置成通过将至少一个候选补丁插入到代码中来生成打补丁的代码。在另一示例中,至少一个候选补丁被配置成使与至少一个安全性违反相关联的多个输入中的至少一些舍弃执行并且使代码的至少一部分在可能发生安全性违反之前中止执行。在另一示例中,至少一个候选补丁被配置成为安全性违反生成诊断信息的日志。
此类特征是有利的,因为即使在完全修复可用之前,它们也可以用于保护易受攻击的代码免于经由安全性违反的攻击。这些特征提供了在操作员不必等待完全修复的情况下针对安全性违反的补丁的自动生成。这些补丁虽然不完全修复程序的逻辑,但是可以使代码在发生安全性违反之前中止,从而强化或保护代码免于利用。这具有将减轻潜在利用的时间从数月减少到数小时的优点。另外,补丁可以具有替代或附加功能,诸如收集数据以进行更好的取证分析并且显示安全性违反以警告开发者和用户。
附图说明
图1是图示根据本公开的各方面的示例系统的框图。
图2是依照本公开的各方面的示例功能图。
图3A-3B是依照本公开的各方面的代码和打补丁的代码的示例。
图4A-4B是依照本公开的各方面的代码和打补丁的代码的示例。
图5是依照本公开的各方面的代码的示例。
图6是依照本公开的各方面的代码的示例。
图7是依照本公开的各方面的代码的示例。
图8A-8B是依照本公开的各方面的代码和打补丁的代码的示例。
图9是依照本公开的各方面的示例功能图。
图10是依照本公开的各方面的代码的示例。
图11是依照本公开的各方面的示例功能图。
图12是依照本公开的各方面的示例功能图。
图13是依照本公开的各方面的示例功能图。
图14是依照本公开的各方面的示例功能图。
图15是图示依照本公开的各方面的示例方法的流程图。
具体实施方式
概述
技术通常涉及为计算机代码中的安全性漏洞自动地生成补丁。可以在开发期间和在部署代码之后定期地检测安全性违反。虽然一些系统可以实现自动化以大规模地查找安全性违反,但是这些系统缺乏自动地减轻已知安全性违反的影响的能力。修复所找到的问题的自动化的缺乏可以导致操作员手动地解决安全性违反而受折磨。此外,很可能涉及团队努力的创建、测试和部署完全修复的过程可能花费大量的时间。该过程因此可以让代码容易受到攻击,可能持续数天或甚至数月。
在这方面,通过为安全性违反或漏洞提供补丁来解决这种差距的自动化解决方案可以是尤其有用的。这些补丁虽然不完全修复应用的逻辑,但是可以用于使应用在发生安全性漏洞之前中止,从而强化应用免受利用,在一些情况下无期限地,但是理想地在部署完全且完整修复之前。这有可能将潜在利用的时间从数月减少至数小时或甚至更少。
为了保护易受攻击的代码不受攻击,可以自动地生成针对安全性违反的补丁。例如,可以使用模糊技术来为代码生成输入。然后可以使用所生成的每个输入来执行代码。对于每次执行,可以监视各个代码位置处的状态,包括是否已发生了安全性违反。可以分析代码、所生成的输入和执行状态,以确定很可能引起了与一个或多个输入相关联的安全性违反的条件以及以确定条件很可能发生所在的对应补丁位置。基于这些评价,可以为安全性违反生成至少一个候选补丁。候选补丁可以包括补丁条件和对应补丁位置中的一个。至少一个候选补丁可以使与安全性违反相关联的违反输入舍弃执行和/或记录执行,以便允许操作员实时地观察问题并进一步使用日志来调查。
本文描述的技术是有利的,因为即使在完全修复可用之前,它也保护易受攻击的代码免于经由安全性违反的攻击。技术提供了在操作员不必等待完全修复的情况下针对安全性违反的补丁的自动生成。这些补丁虽然不完全修复程序的逻辑,但是可以使代码在发生安全性违反之前中止,从而强化或保护代码免于利用。这具有将减轻潜在利用的时间从数月减少到数小时的优点。此外,试探法和机器学习可以用于选择阻止安全性违反、但是仍然允许具有非违反输入的通过执行的自动地生成的补丁。技术进一步提供迭代过程来验证所生成的补丁,分析补丁的影响,并且产生更合适的补丁以供选择。另外,补丁可以具有替代或附加功能,诸如收集数据以进行更好的取证分析并且显示安全性违反以警告开发者和用户。
本公开的各方面提供用于为安全性违反自动地生成补丁。例如,可以为计算机代码生成多个输入。可以使用多个输入来执行代码以获得多个代码位置处的执行状态。执行状态可以包括针对多个输入中的至少一个的至少一个安全性违反。使用执行状态,可以确定引起至少一个安全性违反的一个或多个补丁条件。使用执行状态,可以基于多个代码位置中的一个或多个补丁条件中的每一个均发生了至少一个安全性违反的代码位置来确定一个或多个对应补丁位置。可以自动地生成针对安全性违反的至少一个候选补丁。该至少一个候选补丁可以包括补丁条件中的一个和对应补丁位置中的一个。
示例
图1包括可以在其中实现本文描述的特征的示例系统100。不应该将其认为是限制本公开的范围或本文描述的特征的有用性。在此示例中,系统100能够包括经由网络150连接的计算设备110、120、130和存储系统140。每个计算设备110、120、130能够包含通常存在于通用计算设备中的一个或多个处理器112、存储器114和其它组件。
尽管在系统100中描绘了仅几个计算设备和存储系统,但是可以将系统扩展到任何数目的附加设备。除了包括经由网络连接的多个计算设备和存储系统的系统之外,本文描述的特征还可以同样地适用于其它类型的设备,诸如单独的芯片,包括并入片上系统(Soc)的芯片或具有存储器的其它芯片。
计算设备110、120、130中的每一个的存储器114能够存储可由一个或多个处理器112访问的信息,包括能够由一个或多个处理器执行的指令。存储器也能够包括能够由处理器检索、操纵或存储的数据。存储器可以是能够存储可由处理器访问的信息的任何非暂时性类型,诸如硬盘驱动器、存储卡、ROM、RAM、DVD、CD-ROM、支持写入的存储器和只读存储器。
指令可以是要由一个或多个处理器直接执行的任何指令集,诸如机器代码,或者是要由一个或多个处理器间接执行的任何指令集,诸如脚本。在那方面,能够在本文中互换地使用术语“指令”、“应用”、“步骤”和“程序”。指令能够被以目标代码格式存储以供由诸如一个或多个处理器112的处理器直接处理,或者以包括被按需解释或提前编译的独立源代码模块的脚本或合集的任何其它计算设备语言存储。在下面更详细地说明指令的函数、方法和例程。
数据可以由一个或多个处理器112依照指令来检索、存储或修改。例如,尽管本文描述的主题不受任何特定数据结构限制,但是数据能够被存储在计算机寄存器中,作为具有许多不同字段和记录的表存储在关系数据库中,或者存储在XML文档中。数据也能够被以诸如但不限于二进制值、ASCII或Unicode的任何计算设备可读格式格式化。此外,数据能够包括足以标识相关信息的任何信息,诸如数字、描述性文字、专有代码、指针、对存储在其它存储器中如在其它网络位置处的数据的引用、或由函数使用来计算相关数据的信息。
一个或多个处理器112可以是任何常规的处理器,诸如可商购的CPU。或者,处理器可以是诸如专用集成电路(“ASIC”)或其它基于硬件的处理器的专用组件。尽管不必要,但是计算设备110中的一个或多个可以包括专门的硬件组件以执行具体计算过程,诸如更快或更高效地对视频进行解码、使视频帧与图像匹配、使视频失真、对失真视频进行编码等。
尽管图1在功能上将计算设备110的处理器、存储器和其它元件图示为在同一块内,但是处理器、计算机、计算设备或存储器实际上能够包括可以或可能未被存储在同一物理外壳中的多个处理器、计算机、计算设备或存储器。例如,存储器可以是位于与计算设备110的外壳不同的外壳中的硬盘驱动器或其它存储介质。因此,对处理器、计算机、计算设备或存储器的引用将被理解成包括对可以或可能不并行操作的处理器、计算机、计算设备或存储器的合集的引用。例如,计算设备110可以包括作为负载平衡服务器场、分布式系统等操作的服务器计算设备。又另外,尽管下述一些功能被指示为在具有单个处理器的单个计算设备上进行,但是本文描述的主题的各个方面能够由多个计算设备来实现,例如,通过网络150传送信息。
计算设备110、120、130中的每一个均可以处于网络150的不同节点处并且能够与网络150的其它节点直接和间接进行通信。尽管在图1中描绘了仅几个计算设备,但是应该领会,典型系统能够包括大量连接的计算设备,其中每个不同的计算设备处于网络150的不同节点处。例如,计算设备110、120、130中的每一个均可以是作为负载平衡服务器场的一部分的服务器计算设备。
本文描述的网络150和中间节点能够使用各种协议和系统来互连,使得网络可以是因特网、万维网、具体内联网、广域网或局域网的一部分。网络能够利用标准通信协议,诸如以太网、WiFi和HTTP、一个或多个公司专有的协议以及前述的各种组合。尽管当如上所述发送或接收信息时获得了某些优点,但是本文描述的主题的其它方面不限于信息的任何特定传输方式。
像以上讨论的存储器一样,存储系统140也可以存储能够由计算设备110、120和/或130中的任一个访问的信息。然而,在这种情况下,存储系统140可以存储能够通过网络150访问的信息。与存储器一样,存储系统能够包括能够存储可由处理器访问的信息的任何非暂时性类型,诸如硬盘驱动器、存储卡、ROM、RAM、DVD、CD-ROM、支持写入的存储器和只读存储器。
在此示例中,计算设备110、120、130中的每一个的前述指令可以包括一个或多个应用。这些应用可以包括能够被运行以执行各种任务的代码。此代码中的至少有一些可能容易受到来自第三方的旨在窃取信息、减慢处理速度或以其它方式造成破坏的攻击。此外,应用可以包括:“补丁生成器”280(在图2中示出为“程序元数据”270),其被配置成基于各种类型的数据(在图2中示出为“程序元数据”270)中的任一种自动地生成补丁;“代码挖掘器”(在图2中示出为“代码挖掘器”240),其生成程序元数据中的至少一些;“候选选择器”(在图11中示出为候选选择器1110),其从候选补丁中选择或确定获胜补丁;以及如在下面进一步讨论的各种其它指令。
为了保护易受攻击的代码免受攻击,可以通过首先为代码生成输入来检测潜在安全性违反。例如,诸如LLVM LibFuzzer或其它技术的模糊技术可以用于为代码生成随机输入或模糊目标。这些输入中的至少一些可以是违反输入,或者相反,可以暴露或导致安全性违反的输入。类似地,这些输入中的至少一些输入可以是非违反输入,或者相反,不一定暴露或导致安全性漏洞的输入。所生成的输入也可以组成“测试语料库”。图2是标识针对代码集210的候选补丁生成的各方面的示例功能图200。在此示例中,图2的测试语料库220可以包括以上讨论的所生成的输入。
然后可以使用所生成的每个输入来执行代码。对于每次执行,可以监视各种代码位置处的执行状态。例如,代码位置可以涉及在各个步骤中变换或移动数据。在通过这些代码位置的程序执行的过程中,可以在元数据中跟踪并更新存储器分配和释放。此元数据可以包括诸如适用存储器区域的大小的信息以及一些内容信息(诸如字符串的潜在空结束)。在运行时,元数据可以用于针对每一指针跟踪它正指向哪一个基指针以及因此它正指向哪一个存储器分配。因此,对于任何存储器访问,元数据可以标识所分配的存储器区域的大小。因此,当执行代码时,元数据实质上是针对每一被访问存储区域的诊断信息的日志的收集或打印输出。例如,这种诊断信息可以包括:标识编译器基础设施或LLVM调试信息,诸如程序位置、变量信息、被访问存储器字节地址、被访问存储器区域的起始地址(如果是无效访问则为0)、被访问存储区域的结束地址(如果是无效访问则为0)、被访问存储器字节的下一个空结束字符(如果不适用则为-1)以及其它此类信息。
状态可以指示是否已发生了安全性违反并且也指示执行总体上是没有安全性违反的“非崩溃执行”还是具有安全性违反的“崩溃执行”。崩溃执行的示例可以包括堆缓冲器溢出、静态存储器溢出、释放后使用以及导致未定义行为的其它运行时问题。对于每种类型的崩溃执行,可以有一组通常发生的补丁模式要考虑。可以将这些模式编码为模板补丁,对于这些模板补丁,需要发现正被打补丁的代码的适当实例化。
可以分析代码、所生成的输入和执行状态以确定很可能引起了与一个或多个输入相关联的安全性违反的条件。例如,诸如图2的代码挖掘器240的代码挖掘器可以用于将所生成的输入和通过执行的执行状态与失败执行的执行状态相比较以标识将非崩溃执行与崩溃执行区分开的条件。图4A是具有会导致执行崩溃的C字符串缺陷的示例代码的示例。在此示例中,代码挖掘器可以用于标识多个条件,包括:result->content的字符串长度与content的字符串长度相同;result->content的字符串长度与result->length相同;content的字符串长度与result->length相同;result->content的分配大小比result->content的字符串长度大1;result->content的分配大小比result->length大1;等。这些关系中的许多关系可能对生成补丁没有用,但是至少一些可能是有趣的,诸如result->content的分配大小与result->length的值之间的关系。
代码挖掘器也可以生成补丁条件或用于这些条件的不变量。返回图2,代码挖掘器240可以生成然后被并入到程序元数据270中的“崩溃不变量”250和“非崩溃不变量”260作为补丁生成器280的输入。不变量可以是程序的状态的抽象表示。例如,变量x=10。由代码挖掘器生成的崩溃不变量和非崩溃不变量可以是动态不变量,因为静态地计算的不变量对于诸如非标准化循环或递归函数的特征来说可能太不精确。动态不变量可以是适用于代码的执行集的条件的抽象表示,然而可以遍及程序的所有路径静态地计算静态不变量。可以将动态不变量表达为在下面进一步讨论的谓词模板,诸如some_variable=symbolic_buffer_length(与在以下示例中进一步讨论的符号缓冲器长度有关)、some_variable=some_other_variable(其中some_other_variable将包括符号缓冲器长度)、some_variable+some_constant≤buffer_size,依此类推。可以联合来自跨多次执行的动态不变量以创建更复杂的动态不变量,从而创建更复杂的补丁。可以将这些崩溃不变量和非崩溃不变量并入到被输入到补丁生成器中的程序元数据中。
可以以各种方式确定动态不变量。例如,可以基于用户输入确定动态不变量。在一些情况下,采用诸如Daikon、决策树、分类器等的一种或多种机器学习技术来确定非崩溃执行与崩溃执行之间的差异、相关性和不变性是有利的。例如,所生成的输入和上述元数据可以用于训练模型。在一些实例中,作为用于机器学习模型的训练输入,可以基于所生成的输入是否在不同的代码位置和/或失败执行处导致安全性违反对它们进行聚类。可以基于所生成的输入是否到达代码中的某个感兴趣区域对它们进行聚类。
诸如图2的补丁生成器280的补丁生成器然后可以从程序元数据270自动地生成补丁,诸如候选补丁290。候选补丁可以包括补丁条件和补丁位置。至少一个候选补丁可以使与安全性违反相关联的违反输入舍弃执行和/或记录执行,以便允许操作员像在下面进一步讨论的那样实时地观察问题并进一步使用日志来调查。
例如,补丁生成器280可以通过计算崩溃不变量与非崩溃不变量之间的差异来生成候选补丁。换句话说,通过分析通过执行和失败执行,能够确定变量的值中的差异(即,动态不变量中的差异)。例如,如果已经在缓冲器溢出时在范围内的现有变量内跟踪到缓冲器的大小,则这可以允许补丁生成器280生成补丁。
可以使用所计算的差异来生成补丁,这些差异中的至少一些将与预定义模板相对应。例如,基于通过执行和失败执行的执行状态之间的差异以及所观察到的崩溃的类型,可以标识模板。这些模板可以包括各种类似“some_variable<some_other_variable”的条件。在前述示例中,所有大写值表示用于补丁的模板的否则不一定存在于代码中的“符号条件”。作为一个示例,模板可以是“BUFFER_INDEX<BUFFER_SIZE”。当存在缓冲器溢出时或者在代码试图在缓冲器的长度外的位置处读取缓冲器的情况下,可以标识此模板。如以上所指出的,BUFFER_INDEX和BUFFER_SIZE都可以是“符号条件”,即不一定在代码中的表示代码中使用的缓冲器的缓冲器索引和缓冲器大小的条件。
作为另一示例,模板可以是“ptr_arithmetic_expression<BASE_POINTER+BUFFER_SIZE”。可以在由指针算术错误引起的缓冲器溢出的情况下标识此模板。在此示例中,“ptr_arithmetic_expression”可以与代码为了索引到存储器中而执行的计算相对应,并且BASE_POINTER和BUFFER_SIZE都可以是不一定在代码中的表示代码中使用的缓冲器的基指针和缓冲器大小的“符号条件”。
图5是简单代码的示例。在图5的示例中,由于指针算术超出缓冲器末端的界限而发生缓冲器溢出安全性违反。如果通过dest指向的缓冲器是相同大小或小于dest缓冲器将溢出的函数的size参数,则在DuplicateLastValue内发生安全性违反。在此具体示例中,对函数的适当使用是在函数NonBuggyUser中:缓冲器str包含三个元素,新的缓冲器duplicated被创建成大小为4,并且`str`和`duplicated`都被传递给DuplicateLastValue。结果是`dest`包含最后项为duplicated的`str`的值,即duplicated=={‘a’,‘b’,‘c’,‘c’}。然而,在BuggyUser中`str`和`duplicated`的大小相同。当这些值被传递给DuplicateLastValue时,初始memcpy将源变元的内容复制到`dest`中而不溢出,但是随后对`dest+size`的写入即dest+3超出界限,因为`dest`的大小为3。在这种情况下,可以标识模板ptr_arithmetic_expression<BASE_POINTER+BUFFER_SIZE,并且在这里,`ptr_arithmetic_expression`是`dest+size`。BASE_POINTER和BUFFER_SIZE来自BuggyUser()或NonBuggyUser()。在此示例中,可以将所生成的补丁(在针对在下面进一步讨论的最弱前置条件进行调整之后)放置在NonBuggyUser中。
作为另一示例,模板可以是BUFFER_SIZE<STRLEN_SRC。当存在字符串缓冲器溢出时,可以标识此模板,其中STRLEN_SRC是指从中读取的字符串的长度。当C字符串库期望字符串缓冲器为以空结束的时,可能发生此类安全性违反。
图6是简单代码的示例。在此示例中,在BuggyStrCpy()函数中对`strcpy`的调用内发生缓冲器溢出。C标准strcpy函数从`src`复制到`dest`直到在`src`中读到空结束符为止。在这种情况下,可以标识模板BUFFER_SIZE>STRLEN_SRC。在这种情况下,BUFFER_SIZE是作为dest变元传递给`strcpy`的缓冲器的大小,并且STRLEN_SRC是`strcpy`的`src`变元的字符串长度。在该示例内,将用5取代BUFFER_SIZE并用strlen(src)取代STRLEN_src。注意,使用strlen函数要求src是以空结束的。这能够根据对“src”的内容的通过执行和失败执行两者的执行状态来确定。这种类型的模板能够用于对由在缓冲器上缺少空结束符所引起的错误打补丁。
可以使用捕获具体指针必须指向某个存储器位置的符号条件来动态地捕获别名关系。例如,这在确定代码内的指针仅指向在崩溃中使用的缓冲器时可能是有用的。这是有用的,因为指针变量可以指向多个存储位置,例如,在具有被传递了多个不同的存储器位置的指针变元的函数内。在其它示例中,不是使用显式模板,而是可以使用试探法或其它信息来生成补丁。例如,在空指针的情况下,当解除引用的指针指向始终在范围内的具体位置(nullptr)时发生解除引用。因此,如果在ptr(指针)上发生解除引用,则补丁能够包括检查ptr!=nullptr。
例如,在数值溢出的示例中,其中int value=(int)result并且int是指整数,由于所生成的补丁可以简单地查找类型,所以可能不要求模板。因此,针对数值溢出的补丁可以始终是(对于int溢出)result>=std::numeric_limits<int>::lowest()&&result<std::numeric_limits<int>::max()。
图7提供了简单代码的示例,其中在函数内的特定分支尽头发生错误。在此示例中,当`c`为false时代码读取未初始化存储器。由于读取未初始化存储器的一般构思将不适合模板,所以在此示例中,补丁生成器可能依赖于挖掘通过执行与失败执行之间的差异。在这种情况下,只有当读取`buffer`并且`c`为假时才发生错误。再次某些试探法在这些情况下将很可能是有用的,例如,将在崩溃内使用的变量限于被定义为“接近”发生崩溃的地方(例如,在同一函数内、在同一库/编译单元内、在错误堆栈跟踪的N调用帧内)。这可以防止虚假差异被包括在补丁中,例如全局变量的变化。
当已知或怀疑安全性违反是某种类型并且模板被标识时,可以首先设置针对安全性违反的模板的任何“符号条件”。例如,在许多情况下补丁所需要的变量实际上不存在于程序中,例如,实际上不在显式地跟踪缓冲器的大小。因此,这些符号条件允许将变量插入到程序(符号条件)中以便使用这些符号条件来简化补丁的生成。因此,符号条件表示导致发生(或不存在)安全性违反的条件或值并且能够被用作用于定义构成候选补丁的实际代码的基础。为了避免盲目地插入变量并且用任意值设置它们,在一些实例中,可以通过选择模板语言或表达式来生成补丁,然后对这些模板语言或表达式进行定制以通过引起(或防止)符号条件发生或在发生符号条件的情况下退出执行来触发或避免安全性违反。
例如,标识的模板可以包括BUFFER_INDEX<BUFFER_SIZE。因此使用此模板,可以将针对缓冲器溢出的符号条件设置为0≤BUFFER_INDEX<BUFFER_SIZE。例如,图3A提供了示例代码。在此示例中,`idx`是BUFFER_INDEX,并且`length`是BUFFER_SIZE。在执行buff[idx]之前,断言:0<=idx<length或在代码中:assert(0<=idx);可以将assert(0<=idx)作为如图3B中所示的补丁来添加。
然而,代码中的哪一个变量包含正在引起安全性违反的BUFFER_INDEX或BUFFER_SIZE可能并不直接,实际上,代码它本身可以没有包含BUFFER_INDEX或BUFFER_SIZE的实际变量。因此,必须通过在执行期间代入代码中的实际变量或实际值来具体化0≤BUFFER_INDEX<BUFFER_SIZE的符号条件。
返回到图4A的示例,针对TrimTrailingCharacter函数的非崩溃执行可以完全保证当进入该函数时str->length大于0,然而此行处的崩溃执行以将str->length设置为0进入。因此,潜在学习到的补丁将是在减小str->length以确保它不为0之前添加崩溃。所学习到的关系中的另一有趣的差异将是在存储器访问时。那时所有非崩溃执行保证str->content的字符串长度等于str->length的值。在崩溃执行中情况并非如此。因此,可以由补丁生成器在减量操作之后为此生成补丁,该补丁检查这种关系。
补丁生成器280可以以各种方式针对不同条件生成候选补丁。例如,在图4B的示例打补丁的代码中示出了两个竞争补丁(为了简单合并到单个示例中,但是当在使用中时,仅需要单个补丁)。通过生成打补丁的程序的多个补丁条件和不同版本,能够将这些相互比较。例如,这对防止补丁生成过程中的缺陷可能是有用的,缺陷否则可以引起坏的补丁提议。
代码、所生成的输入和执行状态也可以由补丁生成器分析以确定补丁条件很可能发生的对应补丁位置。例如,可以紧接在观察到安全性违反或不期望行为的代码位置之前插入补丁。
图8A是简单代码的示例。在此示例中,函数RoundedAngle返回[0,360)内的值,或者在参数angle为负的情况下则因错误代码而失败。可以假定此函数被用在某个代码或应用中,其中参数angle的值能够由程序设计员以某种方式提供。在使用所生成的输入来执行代码之后,发现了在执行此代码时引起未定义行为的输入。特别地,将大于最大可表示整数的浮点值(或非数值,也称为NaN)作为参数angle传入。利用诸如UndefinedBehaviorSanitizer(UBSAN)的计算机错误检测器运行此代码可以在标记为浮点至整数强制转换的代码位置或行处报告坏的强制转换(不期望行为)。特别地,此执行可以标识由于参数angle的值太大的事实而发生未定义行为。为了解决此未定义行为,可以生成补丁,诸如图8B的示例打补丁的代码的补丁。在此示例中,引入程序中止作为在发生了坏的强制转换的代码位置之前的检查。所引入的检查在此类场景中是非常符合句法的,并且能够容易地自动化。其它典型情况可以包括C字符串的处理,其中能将针对缓冲器溢出的补丁描述为缺失空结束字符或预期范围检查。检查也能包含针对某些类型的错误的正则表达式匹配。
可以将候选补丁中的每一个插入到候选补丁的位置处的代码中以创建候选打补丁的代码集。然后,可以使用生成的输入来执行候选打补丁的代码中的每一个以获得打补丁的执行状态。这可以允许针对相同生成的输入标识执行状态与打补丁的执行状态之间的变化。图8B的补丁在故障点引入程序中止。它检查来自浮点变量angle的即将到来的强制转换对于int类型来说太大(std::numeric_limits<int>::max()返回int类型的最大可表示数字)。如果该条件失败,则LOG_IF语句将记录错误消息“Auto generated path to avoidundefined behavior due to overflow(自动地生成的路径以避免由于溢出而导致的未定义行为)”。因此,执行将由于致命日志记录级别的使用而中止。
在此示例中,候选补丁是尤其有益的,因为它仅对不期望行为打补丁。不依靠实际执行的方法也可能已生成了对下溢行为的检查。也就是说,此类方法将很可能已设法引入也确保负角度绝对太大的检查。由于所生成的输入未产生,所以不会提议这种补丁。当然,不会发生这个的原因是由于程序中较早的检查,任何负角度值都不会到达强制转换。
此外或替换地,可以通过基于如以上所讨论的前述模板确定最弱前置条件来为安全性违反生成候选补丁。图9是利用最弱前置条件940来标识针对代码集210的候选补丁生成的各方面的示例功能图900。如图所示,也可以将最弱前置条件并入到程序元数据270中,该程序元数据被输入到补丁生成器280中以便生成候选补丁990。
最弱前置条件可以是描述展示某个公共行为的程序状态或程序输入集的公式。与不变量一样,也可以静态地或动态地或在代码的每一执行阶段执行最弱前置条件。在执行阶段针对安全性违反的最弱前置条件可以暗示如果最弱前置条件为真,则假定在重新执行中不更改诸如线程调度的所有不确定性选择,执行将导致安全性违反。
图10是为了进一步图示最弱条件的简单程序的示例。在此示例中,rand100()返回[0,100)之间的随机数。在此示例中,假定当x2为95且y2为80时发生崩溃CRASH()。出于此示例的目的,目标是为了确定对rand100()的调用的返回值而不是在实际崩溃的位置处的条件。
不是生成仅阻止此特定场景(x2=95且y2=80)的候选补丁或等效地阻止(x=93和y=8),而是归纳这些条件可以是更有用的。例如,能够将条件x2>y2表达为x>10*y-2。这种归纳条件可以是最弱前置条件并且表示更多情况,诸如例如,当且仅当y为0时x的任何值。由于观察到崩溃,所以存在使崩溃发生的至少一个输入;最弱前置条件将从不为空。至少,最弱前置条件将包含至少用于生成最弱条件的单个崩溃输入,但是这不太可能发生,因为来自单个崩溃输入的归纳将常常涵盖各种不同可能的条件。
能够在崩溃运行中沿着整个执行跟踪,或者更确切地在每一程序执行阶段计算最弱前置条件。在执行阶段的这种最弱前置条件可以暗示如果条件为真,则假定在重新执行中未更改诸如线程调度的所有不确定性选择,执行将再次肯定地陷入确切相同的崩溃。也就是说,在某个程序点的崩溃运行的最弱前置条件能够用于有效地预测安全性违反。
最弱前置条件在此上下文中提供优点,因为能够在崩溃位点(即在代码中执行崩溃的位置)本地计算最弱前置条件。能够将条件表达得越接近崩溃位点,最弱前置条件越可能不太复杂并因此越可读。作为示例,用户开发取决于另一库ABC的特征的库XYZ。在此示例中,库ABC也取决于库DEF。由于库XYZ被模糊化,所以在库DEF中观察到安全性违反。在此情形下,安全性违反现在是“两重依赖性深度”。用户最可能对标识库XYZ中的安全性违反感兴趣,因为用户正在开发该代码。然而,如果在库DEF内部发生安全性违反,则不清楚是在XYZ如何使用ABC、ABC如何使用DEF中还是在DEF它本身内发生安全性违反?因此,如果能够将补丁提升至在对所模糊化的东西而言为本地的库XYZ内,则这可能是优选的。
此外或替换地,补丁生成器可以基于通过由清理器日志收集的存储器状态跟踪数据流来生成候选补丁。图11是利用清理器日志1140来标识针对代码集210的候选补丁生成的各方面的示例功能图1100。如图所示,也可以将清理器日志并入到程序元数据270中,该程序元数据被输入到补丁生成器280中以便生成候选补丁1190。
可以将各种工具添加到代码以允许跟踪存储器分配、解除分配和访问以为与存储器相关安全性违反生成清理器日志。例如,可以使用ASAN来跟踪此类存储器数据。由于ASAN仅被用于补丁程序生成而不在生产期间,所以对生产性能的影响可能很小或没有影响。另外,即使在补丁生成期间,也可以使用选择性存储器跟踪。例如,可以仅针对某些代码位置或变量选择性地打开ASAN以使对性能的影响最小化。也可以使用其它运行时监视技术,诸如Valgrind或其它LLVM清理器。
此外或替换地,补丁生成器可以基于静态信息生成候选补丁。例如,可以将变量名称和变量类型用作用于生成补丁的附加信息。例如,在代码中具体化具有变量的符号条件可以基于这种静态信息。对于另一实例,也可以静态地计算一些最弱前置条件。对于又一个实例,也可以静态地计算一些不变量。图12是利用静态信息1240来识别针对代码集210的候选补丁生成的各方面的示例功能图1200。如图所示,也可以将静态信息并入到程序元数据270中,该程序元数据被输入到补丁生成器280中以便生成候选补丁1290。如以上所指出的,补丁生成器可以因此使用程序元数据来生成候选补丁。图13是示例功能图1300,其中程序元数据270包括崩溃不变量250、非崩溃不变量260、清理器日志1140、静态信息1240或这些的任何组合的组合。再次,此程序元数据被输入到补丁生成器280中以便生成候选补丁1390。
补丁生成过程可以是迭代过程。例如,在使用候选补丁中的一个来对代码打补丁之后,可以使用新生成的输入来为打补丁的代码生成新的违反输入和非违反输入集。与以上示例一样,可以使用模糊技术来生成这些生成的输入。可以使用新生成的输入来执行打补丁的代码。再次,对于每次执行,监视各个代码位置处的状态。例如,状态可以示出新的输入中的一些引起新的安全性违反。新的安全性违反可以是与在补丁之前相同的安全性违反、与补丁之前的安全性违反相关的不同安全性违反或不同的不相关安全性违反。此时,更多数据可用于分析,或者更确切地能够被添加到程序元数据270,这些程序元数据包括代码、打补丁的代码、针对代码生成的输入、针对打补丁的代码生成的输入、使用代码的执行状态以及使用打补丁的代码的执行状态。然后可以分析程序元数据270以确定很可能引起新的安全性违反的新的补丁条件以及很可能发生了新的补丁条件的对应补丁位置。基于这些分析,可以为新的安全性违反生成至少一个新的候选补丁。
另外,可以使用迭代过程来确定候选补丁的增量影响。例如,针对补丁之前的代码的非违反输入当被用在打补丁的代码的执行中时应该仍然是非违反输入。这样确保了补丁不使通过执行失败。如果针对补丁之前代码的非违反输入当被用在打补丁的代码的执行中时现在以某种方式引起违反,则这意味着候选补丁已对代码引入了执行失败,因此不是好的候选补丁。
为了为给定安全性违反选择“最好”或“获胜”候选补丁,可以使用迭代过程。过程可以通过使用具有不同输入集的相同方法和/或使用如上所述的不同方法来生成多个候选补丁而开始。如图14的示例功能图1400中所示,“补丁生成器1”可以使用基于模板的最弱前置条件来生成第一候选补丁,“补丁生成器2”可以使用基于模板的动态不变量来生成第二候选补丁,“补丁生成器N”可以使用同一代码挖掘器但是以一组不同生成的输入等来生成“第N个”候选补丁。在此示例中,图14的补丁生成器中的每一个均可以与补丁生成器280相对应,因为它是相同实例或同一实例。类似地,候选补丁1、2和N可以与候选补丁290、990、1190、1290或1390中的任一个相对应。
可以将候选补丁以及测试语料库220输入到诸如候选选择器1410的候选选择器中,该候选选择器从候选补丁中选择或确定获胜补丁。可以基于打补丁的执行状态确定获胜候选补丁1490,例如,合适的候选补丁可以是使与安全性违反相关联的违反输入舍弃执行但是仍然允许所有非违反输入通过执行的候选补丁。作为示例,一个候选补丁可以使性能慢下来不及其它候选补丁,并且因此可能是合适的候选补丁。
此外或替换地,也可以基于候选补丁的复杂度和/或候选补丁与安全性违反位点的接近度来选择获胜候选补丁。例如,如果候选补丁具有非常复杂的补丁条件,则操作员可能不愿接受该候选补丁,因为可能难以充分地理解候选补丁对代码的影响。对于另一实例,尽管由于对非常低级库的误用可能发生安全性违反,但是在这样的低级库处具有补丁位置的候选补丁可以引起许多其它代码共享同一库的问题,并且因此候选补丁是不合适的并且不应该是获胜补丁。
可以将获胜补丁插入到补丁的位置处的代码中以便使代码对于先前已导致了安全性违反的输入产生任何数目的期望结果。例如,获胜补丁可以是使代码的至少一部分在发生安全性违反之前中止执行的阻止补丁。此外或替换地,获胜补丁可以是使关于安全性违反的数据被收集或以其它方式记录以供立即或以后评审的诊断补丁。此外或替换地,获胜补丁可以使关于安全性违反的信息的显示被生成。这样的显示可以例如作为可视或可听警告出现在操作员或用户的计算设备上以提示适当的动作。
此类补丁也可以允许操作员实时地观察安全性违反的影响并且决定是否忽视安全性违反,允许插入阻止补丁或者开发完全修复。例如,不是简单地记录安全性违反或实时地显示通知,而是可以使用计数器来跟踪特定安全性违反已发生的频率。可以例如通过提供图形用户界面或这些数字的其它可视和/或可听表示以供操作员评审来实时地查看用于不同安全性违反的这些计数器。这继而可以帮助操作员对安全性违反进行优先级排序以供评审和/或修复以及帮助操作员确定哪些安全性违反是或很可能成为紧急问题。
图12是依照本公开的各方面的用于为安全性违反自动地生成补丁的示例流程图1200。该流程图的框可以由诸如一个或多个处理器112的一个或多个处理器来执行。在此示例中,在框1210处生成针对代码的多个输入。在框1220处使用多个输入来执行代码以获得多个代码位置阶段处的执行状态。这些执行状态包括针对多个输入中的至少一个的至少一个安全性违反。在框1230处,使用执行状态,确定引起至少一个安全性违反的一个或多个补丁条件。在框1240处,使用执行状态,基于多个代码位置中的一个或多个补丁条件中的每一个均发生了至少一个安全性违反的代码位置来确定发生一个或多个补丁条件中的每一个的一个或多个对应补丁位置。在框1250处自动地生成针对安全性违反的至少一个候选补丁。该至少一个候选补丁中的每一个均包括补丁条件中的一个和对应补丁位置中的一个。
能够将本文提供的方法和流程图实现为包括使处理器执行如所描述的方法和流程图的计算机可读指令的计算机程序。
再次,本文描述的技术是有利的,因为即使在完全修复可用之前,它也保护易受攻击的代码免于经由安全性违反的攻击。技术提供了在操作员不必等待完全修复的情况下针对安全性违反的补丁的自动生成。这些补丁虽然不完全修复程序的逻辑,但是可以使代码在发生安全性违反之前中止,从而强化或保护代码免于利用。这具有将减轻潜在利用的时间从数月减少到数小时的优点。此外,在一些实现方式中,使用试探法和机器学习来选择阻止安全性违反、但是仍然允许具有非违反输入的通过执行的自动地生成的补丁是有利的。技术进一步提供迭代过程来验证所生成的补丁,分析补丁的影响,并且产生更合适的补丁以供选择。另外,补丁可以具有替代或附加功能,诸如收集数据以进行更好的取证分析并且显示安全性违反以警告开发者和用户。
除非另外陈述,否则前述替代示例不是互斥的,而是可以被以各种组合实现以实现独特的优点。由于能够在不脱离由权利要求所限定的主题的情况下利用以上讨论的特征的这些及其它变化和组合,所以应该通过图示而不是通过限制由权利要求所限定的主题来进行实施例的前述描述。此外,本文描述的示例的提供以及用短语表示为“诸如”、“包括”等的从句不应该被解释为将权利要求的主题限于具体示例;相反,示例旨在图示许多可能的实施例中的仅一个。另外,不同附图中的相同的附图标记能够标识相同或类似的元件。
工业适用性声明
本文描述的特征例如在软件安全性和开发的领域中享有宽工业适用性。

Claims (20)

1.一种为安全性违反自动地生成补丁的方法,包括:
由一个或多个处理器为代码生成多个输入;
由所述一个或多个处理器使用所述多个输入来执行所述代码以获得多个代码位置处的执行状态,所述执行状态包括针对所述多个输入中的至少一个输入的至少一个安全性违反;
由所述一个或多个处理器使用所述执行状态来确定引起所述安全性违反的一个或多个补丁条件;
由所述一个或多个处理器使用所述执行状态来基于所述多个代码位置中的发生了所述至少一个安全性违反条件的代码位置来确定一个或多个对应补丁位置;以及
由所述一个或多个处理器为所述至少一个安全性违反自动地生成至少一个候选补丁,所述至少一个候选补丁包括所述补丁条件中的一个和所述一个或多个对应补丁位置中的一个。
2.根据权利要求1所述的方法,进一步包括由所述一个或多个处理器通过将所述至少一个候选补丁插入到所述代码中来生成打补丁的代码。
3.根据权利要求1所述的方法,其中,所述至少一个候选补丁被配置成使与所述至少一个安全性违反相关联的所述多个输入中的至少一些舍弃执行。
4.根据权利要求3所述的方法,其中,所述至少一个候选补丁使所述代码的至少一部分在可能发生安全性违反之前中止执行。
5.根据权利要求1所述的方法,其中,所述至少一个候选补丁被配置成为安全性违反生成诊断信息的日志。
6.根据权利要求1所述的方法,进一步包括:
由所述一个或多个处理器通过将所述一个或多个候选补丁中的每一个插入到所述代码中来生成候选打补丁的代码集;
由所述一个或多个处理器使用所述多个输入来执行所述候选打补丁的代码中的每一个以获得所述多个代码位置处的打补丁的执行状态;
由所述一个或多个处理器基于所述打补丁的执行状态在所述一个或多个候选补丁当中选择候选补丁;以及
由所述一个或多个处理器通过将所选择的候选补丁插入到所述代码中来生成第二打补丁的代码。
7.根据权利要求1所述的方法,进一步包括:
由所述一个或多个处理器基于复杂度、与所述至少一个安全性违反的位点的接近度或对所述代码的执行的影响中的至少一个从所述至少一个候选补丁中选择候选补丁;以及
由所述一个或多个处理器通过将所选择的候选补丁插入到所述代码中来生成打补丁的代码。
8.根据权利要求7所述的方法,进一步包括:
由所述一个或多个处理器为所述打补丁的代码生成新的多个输入;
由所述一个或多个处理器使用所述新的多个输入来执行所述打补丁的代码以获得所述多个代码位置处的新的执行状态,所述新的执行状态包括新的安全性违反;
由所述一个或多个处理器使用所述新的执行状态来计算引起与所述多个输入中的一个或多个输入相关联的所述新的安全性违反的一个或多个新的补丁条件;
由所述一个或多个处理器使用所述新的执行状态来确定发生所述一个或多个新的补丁条件中的每一个的一个或多个新的对应补丁位置;以及
由所述一个或多个处理器为所述新的安全性违反生成至少一个新的候选补丁,所述至少一个新的候选补丁中的每一个均包括所述新的补丁条件中的一个和所述新的对应补丁位置中的一个,其中,所述至少一个新的候选补丁被配置成使与所述新的安全性违反相关联的所述新的违反输入舍弃执行。
9.根据权利要求8所述的方法,其中,基于所述输入是否导致安全性违反对用于基于学习的模型的训练输入进行聚类。
10.根据权利要求1所述的方法,其中,使用机器学习模型来生成所述一个或多个补丁条件,并且所述方法进一步包括基于所述输入是否到达所述代码中的感兴趣区域对用于所述模型的输入进行聚类。
11.根据权利要求1所述的方法,其中,确定所述一个或多个补丁条件进一步包括确定与所述至少一个安全性违反有关的至少一个动态不变量。
12.根据权利要求11所述的方法,其中,所述动态不变量包括谓词模板。
13.根据权利要求11所述的方法,进一步包括将所述动态不变量中的两个或更多个联合以确定所述一个或多个补丁条件。
14.根据权利要求1所述的方法,其中,生成所述一个或多个补丁条件进一步包括确定与所述至少一个安全性违反有关的最弱前置条件。
15.根据权利要求1所述的方法,其中,生成所述一个或多个补丁条件进一步包括通过由日志收集的存储器状态来跟踪数据流。
16.根据权利要求15所述的方法,其中,通过存储器状态来跟踪数据流包括使用选择性存储器跟踪。
17.一种用于为安全性违反自动地生成补丁的系统,所述系统包括一个或多个处理器,所述一个或多个处理器被配置成:
为代码生成多个输入;
使用所述多个输入来执行所述代码以获得多个代码位置处的执行状态,所述执行状态包括针对所述多个输入中的至少一个的安全性违反;
使用所述执行状态来确定引起所述安全性违反的一个或多个补丁条件;
使用所述执行状态来基于所述多个代码位置中的所述一个或多个补丁条件中的每一个均发生了所述至少一个安全性违反的代码位置来确定一个或多个对应补丁位置;以及
为所述至少一个安全性违反自动地生成至少一个候选补丁,所述至少一个候选补丁包括所述补丁条件中的一个和所述一个或多个对应补丁位置中的一个。
18.根据权利要求17所述的系统,其中,所述一个或多个处理器被进一步配置成通过将所述至少一个候选补丁插入到所述代码中来生成打补丁的代码。
19.根据权利要求17所述的系统,其中,所述至少一个候选补丁被配置成使与所述至少一个安全性违反相关联的所述多个输入中的至少一些舍弃执行并且使所述代码的至少一部分在可能发生安全性违反之前中止执行。
20.根据权利要求17所述的系统,其中,所述至少一个候选补丁被配置成为安全性违反生成诊断信息的日志。
CN201880091955.9A 2018-05-21 2018-07-17 针对安全性违反的补丁的自动生成 Pending CN111919214A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US201862674133P 2018-05-21 2018-05-21
US62/674,133 2018-05-21
PCT/US2018/042448 WO2019226188A1 (en) 2018-05-21 2018-07-17 Automatic generation of patches for security violations

Publications (1)

Publication Number Publication Date
CN111919214A true CN111919214A (zh) 2020-11-10

Family

ID=63244967

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201880091955.9A Pending CN111919214A (zh) 2018-05-21 2018-07-17 针对安全性违反的补丁的自动生成

Country Status (4)

Country Link
US (1) US20210004470A1 (zh)
EP (1) EP3752945A1 (zh)
CN (1) CN111919214A (zh)
WO (1) WO2019226188A1 (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11575504B2 (en) 2019-06-29 2023-02-07 Intel Corporation Cryptographic computing engine for memory load and store units of a microarchitecture pipeline
US11580234B2 (en) 2019-06-29 2023-02-14 Intel Corporation Implicit integrity for cryptographic computing
US11580035B2 (en) 2020-12-26 2023-02-14 Intel Corporation Fine-grained stack protection using cryptographic computing
US11669625B2 (en) * 2020-12-26 2023-06-06 Intel Corporation Data type based cryptographic computing

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101154257A (zh) * 2007-08-14 2008-04-02 电子科技大学 基于漏洞特征的动态执行补丁方法
CN105787367A (zh) * 2016-02-23 2016-07-20 华中科技大学 一种软件更新的补丁安全性检测方法及系统
US9792443B1 (en) * 2015-03-12 2017-10-17 Whitehat Security, Inc. Position analysis of source code vulnerabilities

Family Cites Families (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1619572A1 (en) * 2004-07-23 2006-01-25 Texas Instruments Incorporated System and method of identifying and preventing security violations within a computing system
US8146072B2 (en) * 2004-07-30 2012-03-27 Hewlett-Packard Development Company, L.P. System and method for updating software on a computer
US7814473B2 (en) * 2004-10-27 2010-10-12 Oracle International Corporation Feature usage based target patching
US7765538B2 (en) * 2004-10-29 2010-07-27 Hewlett-Packard Development Company, L.P. Method and apparatus for determining which program patches to recommend for installation
US7512936B2 (en) * 2004-12-17 2009-03-31 Sap Aktiengesellschaft Code diversification
US8613096B2 (en) * 2007-11-30 2013-12-17 Microsoft Corporation Automatic data patch generation for unknown vulnerabilities
US8037529B1 (en) * 2008-03-19 2011-10-11 Symantec Corporation Buffer overflow vulnerability detection and patch generation system and method
US8108931B1 (en) * 2008-03-31 2012-01-31 Symantec Corporation Method and apparatus for identifying invariants to detect software tampering
US8296756B1 (en) * 2009-11-06 2012-10-23 Southern Company Services, Inc. Patch cycle master records management and server maintenance system
EP2513793B1 (en) * 2009-12-15 2018-11-14 Synopsys, Inc. Method and system of runtime analysis
US9063818B1 (en) * 2011-03-16 2015-06-23 Google Inc. Automated software updating based on prior activity
US9135405B2 (en) * 2011-05-26 2015-09-15 Carnegie Mellon University Automated exploit generation
US9032530B2 (en) * 2012-09-28 2015-05-12 International Business Machines Corporation Correcting workflow security vulnerabilities via static analysis and virtual patching
US10587641B2 (en) * 2014-05-20 2020-03-10 Micro Focus Llc Point-wise protection of application using runtime agent and dynamic security analysis
US9971671B2 (en) * 2014-09-26 2018-05-15 Oracle International Corporation System and method for dynamic debugging in a multitenant application server environment
US10282550B1 (en) * 2015-03-12 2019-05-07 Whitehat Security, Inc. Auto-remediation workflow for computer security testing
US10628764B1 (en) * 2015-09-15 2020-04-21 Synack, Inc. Method of automatically generating tasks using control computer
US10783241B2 (en) * 2015-10-28 2020-09-22 Qomplx, Inc. System and methods for sandboxed malware analysis and automated patch development, deployment and validation
US10033534B2 (en) * 2015-12-01 2018-07-24 Intel Corporation Methods and apparatus to provide for efficient and secure software updates
US20180129579A1 (en) * 2016-11-10 2018-05-10 Nec Laboratories America, Inc. Systems and Methods with a Realtime Log Analysis Framework
US20190102564A1 (en) * 2017-10-02 2019-04-04 Board Of Trustees Of The University Of Arkansas Automated Security Patch and Vulnerability Remediation Tool for Electric Utilities
US10708292B2 (en) * 2017-11-28 2020-07-07 Aetna Inc. Vulnerability contextualization

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101154257A (zh) * 2007-08-14 2008-04-02 电子科技大学 基于漏洞特征的动态执行补丁方法
US9792443B1 (en) * 2015-03-12 2017-10-17 Whitehat Security, Inc. Position analysis of source code vulnerabilities
CN105787367A (zh) * 2016-02-23 2016-07-20 华中科技大学 一种软件更新的补丁安全性检测方法及系统

Also Published As

Publication number Publication date
EP3752945A1 (en) 2020-12-23
WO2019226188A1 (en) 2019-11-28
US20210004470A1 (en) 2021-01-07

Similar Documents

Publication Publication Date Title
Whaley et al. Automatic extraction of object-oriented component interfaces
Chen et al. jPredictor: a predictive runtime analysis tool for Java
Wasylkowski et al. Detecting object usage anomalies
US7900193B1 (en) System and method for detecting defects in a computer program using data and control flow analysis
US8132156B2 (en) Methods and systems for testing tool with comparative testing
Le Goues et al. Specification mining with few false positives
Hammer et al. Dynamic detection of atomic-set-serializability violations
US20060143596A1 (en) Program analyzing apparatus and testing apparatus, and analyzing method and program therefor
Yang et al. Dynamically inferring temporal properties
JPWO2006087780A1 (ja) 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法
CN111919214A (zh) 针对安全性违反的补丁的自动生成
Dwyer et al. Residual dynamic typestate analysis exploiting static analysis: results to reformulate and reduce the cost of dynamic analysis
Palix et al. Tracking code patterns over multiple software versions with Herodotos
Reger Automata based monitoring and mining of execution traces
US7624304B2 (en) Defect detection for integers
Zhou et al. Minerva: browser API fuzzing with dynamic mod-ref analysis
Hua et al. Rupair: towards automatic buffer overflow detection and rectification for Rust
JP5077455B2 (ja) 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法
Olesen et al. Coccinelle: tool support for automated cert c secure coding standard certification
Daian et al. Runtime verification at work: A tutorial
Wang et al. JSTrace: Fast reproducing web application errors
Ahrendt et al. COST Action IC 1402 ArVI: Runtime Verification Beyond Monitoring--Activity Report of Working Group 1
Cui et al. Mining function call sequence patterns across different versions of the project for defect detection
JP5343840B2 (ja) プログラムの解析装置及び解析方法
Sosnytskyi Statical and Dynamical Software Analysis

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