CN113412483B - 具有针对地址探测的增加的阻力的计算设备 - Google Patents

具有针对地址探测的增加的阻力的计算设备 Download PDF

Info

Publication number
CN113412483B
CN113412483B CN201980091495.4A CN201980091495A CN113412483B CN 113412483 B CN113412483 B CN 113412483B CN 201980091495 A CN201980091495 A CN 201980091495A CN 113412483 B CN113412483 B CN 113412483B
Authority
CN
China
Prior art keywords
computer program
program code
address
code
replacement
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
CN201980091495.4A
Other languages
English (en)
Other versions
CN113412483A (zh
Inventor
K·巴特
H·J·博斯
C·朱弗里达
E·V·D·考维
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.)
Koninklijke Philips NV
Original Assignee
Koninklijke Philips NV
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
Priority claimed from EP18211711.9A external-priority patent/EP3667531A1/en
Application filed by Koninklijke Philips NV filed Critical Koninklijke Philips NV
Publication of CN113412483A publication Critical patent/CN113412483A/zh
Application granted granted Critical
Publication of CN113412483B publication Critical patent/CN113412483B/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/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
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/14Protection against unauthorised use of memory or access to memory
    • G06F12/1416Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights
    • G06F12/1425Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights the protection being physical, e.g. cell, word, block
    • G06F12/1433Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights the protection being physical, e.g. cell, word, block for a module or a part of a module
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/554Detecting local intrusion or implementing counter-measures involving event detection and direct action
    • 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/572Secure firmware programming, e.g. of basic input output system [BIOS]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/70Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer
    • G06F21/78Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure storage of data
    • G06F21/79Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure storage of data in semiconductor storage media, e.g. directly-addressable memories

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Storage Device Security (AREA)

Abstract

一些实施例涉及被配置用于防止地址探测的计算机程序的执行的计算设备(100)。所述设备被配置为运行用于检测所述计算机程序上的地址探测的至少一个异常检测器(140),并且利用在其中地址探测对策被添加的替换计算机程序代码部分选择性地替换起源计算机程序代码部分。

Description

具有针对地址探测的增加的阻力的计算设备
技术领域
本发明涉及计算设备、编译器设备、计算方法、编译方法、计算机可读介质。
背景技术
针对代码复用的许多现代防御依赖于将敏感数据(诸如影子堆栈)隐藏在巨大的存储器地址空间中。尽管比常规基于完整性的防御更加高效,但是这些解决方案易受迅速地定位隐藏数据并且损害安全性的探测攻击的侵害。
现今的存储器损坏攻击通常借助于复用已经在程序[42]中的代码绕过防御,诸如数据执行保护(DEP)。这样做,攻击者需要用于将程序的控制流朝向它们转移的应用的地址空间中的可识别代码片段的位置的知识。
贯穿应用严格施行软件完整性措施,诸如对访问缓冲器和存储器中的数据结构的边界检查,确保应用行为保持在程序的预期控制流内的控制流完整性检查,阻碍这样的攻击,但是具有性能中的高昂代价[9、19、37-39、45、48]。为了说明,我们可以预期应用引起近似至少9%的平均减速以施行保护对函数的调用的前向边缘控制流完整性(CFI)[48],然后针对影子堆栈的3.5-10%以保护向后边缘[18](保护来自函数的返回),另外4%以防止信息泄露和19.6%以通过软件故障隔离(SFI)[32、50]限制应用中的存储器读取和写入阻碍数据损坏攻击。组合多个防御以抵抗不同类的攻击引起非平凡的累积开销。
施行软件完整性的这样的方案的备选方案是首先使定位代码和数据困难。该方法的范例在从地址空间布局随机化(ASLR)到将敏感信息隐藏在大地址空间中的随机位置处的高级防御的范围内[16、33、36]。例如,代码指针完整性[33]将所有敏感数据(诸如代码指针)移动到存储器中的隐藏位置处的“安全”区域。作为防御,这样的信息隐藏是比基于完整性的防御更高效的[8]。特别地,由于甚至对代码复用攻击的复杂防御(诸如代码指针完整性(CPI))添加适度的2.9%性能开销,因此随机化是几乎“自由的”。
遗憾的是,最新研究证明攻击者绕过甚至最高级的信息隐藏防御[13、14、23、25、29、41]。它们示出,通过要么直接要么借助于侧信道重复探测地址空间,破坏下层随机化并且揭示敏感数据是可能的。利用这一点,甚至鲁棒的基于信息隐藏的防御也被击败。
因此,为了防止现代攻击,开发者面对尴尬困境:他们应当采用强大但是非常昂贵(也许因此禁止)的软件完整性措施,或者快速但是提供弱保护的基于信息隐藏的防御?
为了破坏随机化,攻击者利用多个去随机化基元。范例包括崩溃读取和跳跃[13]、其较少崩溃的配对[23、25]和采用分配数据库[41]等等。由于单次泄漏在现代防御中少见,当防御移动所有敏感信息(例如,代码指针)使攻击者无法够到时,现有技术去随机化基元通常通过重复执行操作(例如,存储器读取)以排出熵来探测。由于不缺少基元,因此认为信息隐藏注定并且完整性方案是未来是吸引人的。
US9754112B1通常涉及表征、检测和修复计算机代码中的易受攻击性。US9754112B1中所描述的范例检测过程可以利用地址空间布局随机化(ASLR),并且由于ASLR可以由知道技术存在的攻击者克服,可以将ASLR与如更改的调用者-被调用者约定的更细粒度的技术组合。
以下参考文献通过参考包括为背景技术,并且出于该原因在本文中详细阐述:
1.2006.Proftpd CVE 2006-5815.https://www.exploit-db.com/exploits/2856/.(2006)。
2.2014.BROP Nginx exploit.http://www.scs.stanford.edu/brop
3.2014.perf:Add infrastructure and support for Intel PT.https://lwn.net/Articles/609010/.(2014)。
4.2015.Intel Processor Trace decoder library.https://github.com/01org/processor-trace(2015)。
5.2016.Poking Holes.https://github.com/vusec/poking-holes.(2016)。
6.2018.ApacheBench.(2018).http://httpd.apache.org/docs/2.4/programs/ab.html
7.2018.‘libdwarf’library.https://www.prevanders.net/dwarf.html.(2018)。
8.Martin Abadi、Mihai Budiu、Ulfar Erlingsson、和JayLigatti.2005.Control-flow Integrity.In CCS。
9.Martin Abadi、Mihai Budiu、Ulfar Erlingsson、和Jay Ligatti.Control-flow integrity principles,implementations,and applications.ACM Transactionson Information and System Security(TISSEC)13,1(2009)。
10.Michael Backes、Thorsten Holz、Benjamin Kollenda、Philipp Koppe、Stefan Nurn-berger、和Jannik Pewny.2014.You can run but you can’t read:Preventing disclosure exploits in executable code.In CCS。
11.Michael Backes和Stefan Nurnberger.2014.Oxymoron:Making fine-grained memory randomization practical by allowing code sharing.In USENIXSecurity。
12.David Bigelow、Thomas Hobson、Robert Rudd、William Streilein、和HamedOkhravi.2015.Timely rerandomization for mitigating memory disclosures.In CCS。
13.Andrea Bittau、Adam Belay、Ali Mashtizadeh、David Mazieres、和DanBoneh.2014.Hacking blind.In S&P。
14.Erik Bosman、Kaveh Razavi、Herbert Bos、和CristianoGiuffrida.2016.Dedup Est Machina:Memory Deduplication as an AdvancedExploitation Vector.In S&P。
15.Kjell Braden、Lucas Davi、Christopher Liebchen、Ahmad-Reza Sadeghi、Stephen Cranee、Michael Franz、和Per Larsen.2016.Leakage-Resilient LayoutRandomization for Mobile Devices.In NDSS。
16.Xi Chen、Asia Slowinska、Dennis Andriesse、Herbert Bos、和CristianoGiuffrida.2015.StackArmor:Comprehensive Protection from Stack-based MemoryError Vulnerabilities for Binaries.In NDSS。
17.Stephen Crane、Christopher Liebchen、Andrei Homescu、Lucas Davi、PerLarsen、Ahmad-Reza Sadeghi、Stefan Brunthaler、和Michael Franz.2015.Readactor:Practical code randomization resilient to memory disclosure.In Security andPrivacy(SP),2015IEEE Symposium on.IEEE,763-780。
18.Thurston HY Dang、Petros Maniatis、和David Wagner.2015.Theperformance cost of shadow stacks and stack canaries.In Proceedings ofthe10th ACM Symposium on Information,Computer and CommunicationsSecurity.ACM,555-566。
19.Lucas Davi、Patrick Koeberl、和Ahmad-Reza Sadeghi.2014.Hardware-assisted fine-grained control-flow integrity:Towards efficient protection ofembedded systems against software exploitation.In ACM DAC。
20.Lucas Davi、Christopher Liebchen、Ahmad-Reza Sadeghi、Kevin ZSnow、和Fabian Monrose.2015.Isomeron:Code Randomization Resilient to(Just-In-Time)Return-Oriented Programming..In NDSS。
21.Gregory J Duck和Roland HC Yap.2016.Heap bounds protection with lowfat pointers.In ACM CC
22.Isaac Evans、Sam Fingeret、Julian Gonzalez、Ulziibayar Otgonbaatar、Tiffany Tang、Howard Shrobe、Stelios Sidiroglou-Douskos、Martin Rinard、和HamedOkhravi.2015.Missing the point(er):On the effectiveness of code pointerintegrity.In S&P
23.Robert Gawlik、Benjamin Kollenda、Philipp Koppe、Behrad Garmany、和Thorsten Holz.2016.Enabling Client-Side Crash-Resistance to OvercomeDiversification and Information Hiding.In NDSS。
24.Enes Goktas、Elias Athanasopoulos、Herbert Bos、和GeorgiosPortokalidis.2014.Out of control:Overcoming control-flow integrity.In S&P。
25.E Goktas、R Gawlik、B Kollenda、E Athanasopoulos、G Portokalidis、CGiuffrida、和H Bos.2016.Undermining information hiding(and what to do aboutit).In USENIX Security。
26.Ben Gras、Kaveh Razavi、Erik Bosman、Herbert Bos、和ChristianoGiuffrida.ASLR on the line:Practical cache attacks on the MMU.NDSS(Feb.2017)(2017)。
27.Hong Hu、Shweta Shinde、Sendroiu Adrian、Zheng Leong Chua、PrateekSaxena、和Zhenkai Liang.2016.Data-oriented programming:On the expressivenessof non-control data attacks.In Security and Privacy(SP),2016IEEE Symposiumon.IEEE,969-986。
28.Intel.Processor Tracing.https://software.intel.com/en-us/blogs/2013/09/18/processor-tracing
29.Yeongjin Jang、Sangho Lee、和Taesoo Kim.2016.Breaking Kernel AddressSpace Layout Randomization with Intel TSX.In ACM CCS。
30.Andi Kleen.https://lwn.net/Articles/648154/
31.Benjamin Kollenda、Enes Goktas、Tim Blazytko、Philipp Koppe、RobertGawlik、Radhesh Krishnan Konoth、Cristiano Giuffrida、Herbert Bos、和ThorstenHolz.2017.Towards Automated Discovery of Crash-Resistant Primitives inBinaries.In DSN。
32.Koen Koning、Xi Chen、Herbert Bos、Cristiano Giuffrida、和EliasAthanasopou-los.2017.No Need to Hide:Protecting Safe Regions on CommodityHardware.In Proceedings of the Twelfth European Conference on ComputerSystems.ACM,437-452。
33.Volodymyr Kuznetsov、Laszlo Szekeres、Mathias Payer、George Candea、RSekar、和Dawn Song.2014.Code-pointer integrity.In OSDI。
34.Volodymyr Kuznetsov、Laszlo Szekeres、Mathias Payer、George Candea、和Dawn Song.2015.Poster:Getting the point(er):On the feasibility of attacks oncode-pointer integrity.In S&P。
35.Chris Lattner和Vikram Adve.2004.LLVM:A Compilation Framework forLifelong Program Analysis&Transformation.In CGO。
36.Kangjie Lu、Chengyu Song、Byoungyoung Lee、Simon P Chung、Taesoo Kim、和Wenke Lee.2015.ASLR-Guard:Stopping address space leakage for code reuseattacks.In ACM CCS。
37.Ali Jose Mashtizadeh、Andrea Bittau、David Mazieres、和DanBoneh.2015.Cryptographically enforced control flow integrity.In ACM CCS。
38.Vishwath Mohan、Per Larsen、Stefan Brunthaler、Kevin W Hamlen、和Michael Franz.2015.Opaque Control-Flow Integrity.In NDSS。
39.Santosh Nagarakatte、Jianzhou Zhao、Milo MK Martin、和SteveZdancewic.2009.SoftBound:Highly compatible and complete spatial memory safetyfor C.PLDI。
40.Santosh Nagarakatte、Jianzhou Zhao、Milo M.K.Martin、和SteveZdancewic.2010.CETS:Compiler Enforced Temporal Safety for C.In ISMM。
41.Angelos Oikonomopoulos、Elias Athanasopoulos、Herbert Bos、和Cristiano Giuffrida.2016.Poking holes in information hiding.In USENIXSecurity。
42.Marco Prandini和Marco Ramilli.Return-oriented programming.IEEESecurity&Privacy(2012)。
43.Robert Rudd、Richard Skowyra、David Bigelow、Veer Dedhia、ThomasHobson、Stephen Crane、Christopher Liebchen、Per Larsen、Lucas Davi、Michael Franz等人。Address-Oblivious Code Reuse:On the Effectiveness of Leakage-ResilientDiversity.(2017)。
44.Jeff Seibert、Hamed Okhravi、和Eric Soderstrom.2014.Informationleaks without memory disclosures:Remote side channel attacks on diversifiedcode.In CCS。
45.Konstantin Serebryany、Derek Bruening、Alexander Potapenko、和DmitriyVyukov.2012.AddressSanitizer:a fast address sanity checker.In USENIX ATC。
46.Kevin Z Snow、Fabian Monrose、Lucas Davi、Alexandra Dmitrienko、Christopher Liebchen、和Ahmad-Reza Sadeghi.2013.Just-in-time code reuse:On theeffectiveness of fine-grained address space layout randomization.In Securityand Privacy(SP),2013IEEE Symposium on.IEEE,574-588。
47.Adrian Tang、Simha Sethumadhavan、和SalvatoreStolfo.2015.Heisenbyte:Thwarting memory disclosure attacks using destructivecode reads.In Proceedings of the 22nd ACM SIGSAC Conference on Computer andCommunications Security.ACM,256-267。
48.Caroline Tice、Tom Roeder、Peter Collingbourne、Stephen Checkoway、Ulfar Erlingsson、Luis Lozano、和Geoff Pike.2014.Enforcing forward-edgecontrol-flow integrity in GCC&LLVM.In USENIX Security。
49.Victor van der Veen、Dennis Andriesse、Enes Goktas、Ben Gras、LionelSambuc、Asia Slowinska、Herbert Bos、和Cristiano Giuffrida.2015.PracticalContext-Sensitive CFI.In CCS。
50.Robert Wahbe、Steven Lucco、Thomas E Anderson、和Susan LGraham.1993.Efficient software-based fault isolation.In SOSP。
51.Chao Zhang、Tao Wei、Zhaofeng Chen、Lei Duan、Laszlo Szekeres、StephenMcCamant、Dawn Song、和Wei Zou.2013.Practical control flow integrity andrandomization for binary executables.In S&P。
52.Mingwei Zhang和R Sekar.2013.Control flow integrity for COTSbinaries.In USENIX Security。
发明内容
提供了一种被配置用于防止地址探测的计算机程序的执行的计算设备。所述计算设备可以包括存储器和处理器。所述存储器可以存储计算机程序代码和计算机程序数据,所述计算机程序代码包括多个计算机程序代码部分并且被配置为在所述计算机程序数据上操作。计算机程序代码和/或计算机程序数据的地址可能已经在地址空间中随机化。所述处理器可以被配置为:
-执行所述随机化地址空间内的计算机程序代码,
-通过运行用于检测所述计算机程序上的地址探测的至少一个异常检测器监测所述计算机程序代码的执行,
-在检测到所述地址探测的情况下定位所述地址探测起源于的计算机程序代码部分,
-利用在其中添加地址探测对策的替换计算机程序代码部分选择性地替换所述起源计算机程序代码部分。
许多研究员现今相信,基于随机化的防御是注定的,并且更重量级的方案是必要的。上述计算设备使用反应性防御并且汇集两全其美的优点,并且其在受到攻击时从廉价的被动防御转换为更强大但更昂贵的主动防御,在正常情况下产生低开销,同时接近强大的主动防御的安全保证。评价示出,这样的针对通用Linux程序的方案在平衡性能和安全性方面是有效的。
本发明的方面是用于编译源代码以获得防止地址探测的计算机程序的编译器设备。例如,所述编译器设备可以编译源代码以获得计算机程序代码部分和获得多个替换计算机程序代码部分。
所述计算设备和所述编译设备是电子设备。例如,其可以是计算机。例如,所述计算设备可以是服务器、网络服务器、文件服务器、服务提供商、机顶盒、智能电话等。本文所描述的设备和方法可以应用在各种各样的实际应用中。这样的实际应用包括防止计算机软件受攻击。例如,这样的计算机程序可以包括服务器应用、用户应用、操作系统、驱动器等。
方法的实施例可以在计算机上被实施为计算机实施的方法或在专用硬件或在两者的组合中。方法的实施例的可执行代码可以被存储在计算机程序产品上。计算机程序产品的范例包括存储器设备、光学存储设备、集成电路、服务器、在线软件等。优选地,所述计算机程序产品包括被存储在用于当所述程序产品在计算机上运行时执行方法的实施例的计算机可读介质上的非瞬态程序代码。
在实施例中,所述计算机程序包括适于当所述计算机程序在计算机上运行时执行方法的实施例的步骤的全部或一部分的计算机程序代码。优选地,所述计算机程序被实现在计算机可读介质上。
附图说明
将仅通过范例参考附图描述本发明的其他细节、方面和实施例。附图中的元素为了简单和清晰而图示而不一定按比例绘制。在附图中,对应于已经描述的元素的元素可以具有相同附图标记。在附图中,
图1示意性地示出了计算设备的实施例的范例,
图2a示意性示出了计算设备的实施例的范例,
图2b示意性示出了计算设备的实施例的范例,
图2c示意性地示出了编译设备的实施例的范例,
图3示意性地示出了计算设备的实施例的范例并且示意性地示出了计算方法的实施例的范例,
图4示意性地示出了计算设备的实施例的范例,
图5a和5b示意性地示出了替换计算机程序部分的实施例的范例,
图6a示出了针对本发明的实施例的SPEC CPU2006的归一化性能开销和若干全覆盖完整性防御,
图6b示出了针对具有从1到1199的函数标识符的Nginx函数的实施例的吞吐量降低,
图6c示出了每秒的请求对连续探针之间的以秒为单位的间隔以图示针对不同探测间隔的Nginx上的实施例的吞吐量降低,
图7a示意性地示出了计算方法的实施例的范例,
图7b示意性地示出了编译方法的实施例的范例,
图8a示意性地示出了根据实施例的具有包括计算机程序的可写部分的计算机可读介质,
图8b示意性地示出了根据实施例的处理器系统的表示。
附图标记列表
100、101 计算设备
110 存储器
111 计算机程序代码
115 计算机程序数据
120 多个计算机程序代码部分
121-123 计算机程序代码部分
125 多个强化计算机程序代码部分
126-128 强化计算机程序代码部分
130 执行单元
135 替换数据
140 异常检测器
150 定位器
152 轨迹单元
160 替换单元
170 处理器
180 通信接口
200 计算设备
201 探测
202 异常检测
203 易受攻击点识别
204利用强化代码部分替换代码部分
242-244 异常检测单元
220 计算机程序
222 具有识别的易受攻击点的计算机程序
224 强化计算机程序
250 探针分析单元
252 运行时间执行轨迹
254 LLVM IR
260 热补丁单元
262 安全强化代码高速缓存
300 计算设备
301 用户空间
302 内核空间
310 基于信息隐藏的防御
320 反应性防御服务器
330 PT库
340 操作系统
345 PT记录
350 硬件
435、435’ 替换数据
401-407 代码部分
405’ 替换代码部分
500 编译设备
512 源代码
510 源输入
522 解析器
524 第一编译部分
526 第二编译部分
528 额外代码部分
530 代码输出
1000 计算机可读介质
1010 可写部分
1020 计算机程序
1100 设备
1110 系统总线
1120 处理器
1130 存储器
1140 用户接口
1150 通信接口
1160 存储设备
1161 操作系统
1162、1163 指令
具体实施方式
尽管本发明容许许多不同形式的实施例,但是在附图中示出并且在本文中将详细描述一个或多个特定实施例,其中,理解本公开要被认为是本发明的示范性原理并且不旨在将本发明限于所示和所描述的特定实施例。
在以下中,出于理解的缘故,在操作中描述了实施例的元素。然而,将显而易见的是,相应元素被布置为执行被描述为由其执行的功能。
另外,本发明不限于实施例,并且本发明位于本文所描述或在互不相同的从属权利要求中记载的每个和每一个新颖特征或特征的组合中。
图1示意性地示出了计算设备100的实施例的范例。计算设备100包括存储器110和处理器170。存储器包括计算机程序代码和计算机程序数据的形式的计算机程序。处理器170被配置为执行计算机程序代码。执行代码可以部分使得处理器对还存储在存储器110中的计算机程序数据起作用。计算设备100可以包括任选的通信接口180。
计算机程序已经通过随机化地址空间中的计算机程序代码和/或计算机程序数据的地址来保护。例如,常规地址随机数发生器可能已经用于该目的;例如,人们可以采用针对堆栈的位置和/或针对影子堆栈的随机化地址。例如,计算设备100可以使用地址空间布局随机化(ASLR)。例如,计算设备100可以使用将敏感信息隐藏在大的地址空间中的随机位置处的更高级防御。例如,可以使用随机化解决方案,诸如[16、33、36]中的任一个中所描述的。
计算设备100可以与其他电子设备通信,例如,通过计算机网络180。计算机网络可以是因特网、内联网、LAN、WLAN等。计算机网络可以是因特网。例如,计算设备100可以被配置为在需要时请求和接收计算机程序代码部分的强化版本,例如,从被配置为提供计算机程序代码部分的强化版本的服务器。
计算设备100的执行被实施在处理器电路中,其范例被示出在本文中。图2a-5b是除其他外示出可以作为处理器电路的功能单元的功能单元的示意性图示。例如,图2a或2b可以被用作处理器电路的可能功能组织的蓝图。处理器电路未与这些图中的单元分离示出。例如,图2a或图2b所示的功能单元可以全部或部分地被实施在计算机指令中,所述计算机指令被存储在设备100处(例如,在设备100的电子存储器中)并且可由设备100的微处理器执行。在混合实施例中,功能单元部分实施在硬件中,例如,作为协处理器,例如,代码执行协处理器,例如,其被配置为存储执行历史,例如,代码从其最新执行的地址,例如,轨迹,例如,分支轨迹。处理器电路可以包括多个子电路。
即使地址至少部分地随机化在计算设备100上,并且攻击者可以试图至少部分地恢复敏感信息的地址。这些可以然后在计算设备上的后续攻击中使用。例如,攻击者可以与计算机程序代码交互,例如,经由计算机程序代码的API、经由通信接口等等。基于响应,例如基于诸如崩溃的无意识响应,攻击者可能能够收集关于所述随机化地址的信息。因此,计算设备100根据实施例防止这样。本文描述了这样的实施例。
图2a示意性示出了计算设备100的实施例的范例。计算设备100包括存储计算机程序的存储器110。计算机程序可以包括计算机程序代码111和计算机程序数据115。计算机程序代码可以包括多个计算机程序代码部分120。图2a中示出的是计算机程序代码部分121、122和123。可以存在超过3个部分。例如,计算机程序代码部分可以对应于所述计算机程序代码的基本块和/或函数。例如,计算机程序代码部分可以是基本块、扩展基本块、函数、代码单元等。
存储器110还可以存储计算机程序数据115,当计算机程序代码由设备100执行时,计算机程序代码可以对其起作用。例如,数据可以包括常数,例如,其可以是实施在计算机代码中的计算的部分。数据115还可以包括由设备100的用户提供的数据。针对一些通常先验未知的数据,代码部分可以给出未预期到的结果,其被称为异常。例如,代码可能崩溃,生成错误信号,非预期地终止或执行与指定行为偏离并且能够由用户(例如,由攻击者)检测的行为。在现代,攻击很大程度上依赖于攻击者的引起受到攻击的代码中的异常的能力。
为了防止对攻击者有用的代码上的攻击,例如,使得代码执行未经授权的功能,至少不是针对攻击者的,例如,特权提升、未经授权的解密等,计算机程序代码和/或计算机程序数据的地址在地址空间中随机化。这意指即使攻击者设法找到针对计算机程序的成功攻击,有时被称为漏洞利用,攻击可能不是轻便的。当攻击在不同机器上被尝试时,攻击依赖于的地址可能由于随机化而是不同的。针对这种情况,攻击者依赖于专业化攻击。在尝试充分漏洞利用之前,攻击者将迭代执行多个攻击以试图与代码作用于的数据和非预期的输出导出,攻击者可能能够导出关于代码或数据的地址的信息。被配置为获得代码部分和/或数据部分(特别地堆栈)的地址的这样的小的初步攻击被称为地址探针。通过执行多个地址探针(被称为地址探测),攻击者可以获得地址上的足够信息以定制对计算设备100的漏洞利用。
在实施例中,计算机程序111可以是应用,例如,在用户空间中运行的应用。这是不必要的,在实施例中,计算机程序是操作系统、驱动器等。除了计算机程序111之外,存储器110可以存储其他数据和计算机程序代码,例如,表示操作系统、驱动器、其他应用等的代码。
计算设备100可以包括执行单元130。执行单元130被配置为使得以适当的次序执行计算机程序代码部分120。执行单元130可以实施在硬件中,例如,在处理器电路的部分中,例如,作为由处理器电路对计算机程序的常规执行的部分。然而,执行单元130也可以全部或部分地实施在软件中。例如,执行单元130可以被配置为访问计算机程序代码部分120的地址的列表,选择要被执行的下一计算机程序代码部分的地址并且使得处理器电路的执行在所选择的地址处继续。软件实施的执行单元使热补丁更容易。执行单元130可以是集中式或局部的。
如上文指出的,计算机程序和/或计算机程序数据的地址中的一些或全部是随机化的。随机化可以在编译时间处执行,而且可以在运行时间处完成:例如,地址随机化的全部或部分可能在编译计算机程序(例如,计算机程序源代码)以获得计算机程序代码和/或数据时受影响。后者具有以下优点:地址探测必须在相同运行内执行,因为后续运行已经以不同的方式随机化。前者具有以下优点:针对计算机程序代码的每次新启动不需要新随机化。随机化可以由执行单元130、或者由特定随机化单元(未分离地示出)执行。许多随机化解决方案存在并且可以使用在实施例中。例如,随机化可以被用于堆栈的地址和/或影子堆栈。例如,可以使用ASLR。
执行单元130被配置为执行随机化地址空间中的计算机程序代码。这意指计算机程序要作用于并且被创建以使得计算机程序执行未经授权的功能的攻击数据需要被定制到随机化地址。在本文所描述的实施例中,已经使攻击者可以执行以实现这一点的地址探测更难。
计算设备100可以包括异常检测器140,其被配置为通过运行用于检测计算机程序上的地址探测的至少一个异常检测器监测计算机程序代码111的执行。异常检测器可以是由设备100为计算机程序代码的执行提供的执行环境的服务。例如,异常检测可以在操作系统、运行时间库等中完成。利用异常检测扩展特定计算机程序的便利方式是将异常检测器140嵌入计算机程序代码自身中。例如,异常检测器可以包括信号处理程序,例如,其可以被配置为在计算机程序的启动时注册。例如,信号处理程序可以检测对存储器的非法引用,例如,对未映射存储器或计算机程序代码不具有权限或例如当前不具有权限的存储器的非法引用。权限的缺少可能是存储器是不可执行的,而程序代码试图执行它。
计算机程序源代码和/或异常检测器源代码等可以以多个已知计算机编程语言编写,包括例如,C、C++、C#、Java等。计算机程序源代码和/或异常检测器源代码等可以以机器语言编写,例如,汇编语言。混合也是可能的,例如,部分高级源代码和部分低级源代码。计算机程序代码可以通过编译和/或链接源代码来获得。例如,计算机程序代码和其计算机程序代码部分可以包括计算机可执行指令。
在实施例中,异常检测器可以包括与计算机程序链接的静态库。例如,信号处理程序可以以这种方式与计算机代码链接。例如,异常检测器可以独立于计算机程序的编译从源代码编译。
异常检测器可以被配置用于用信号指示计算机程序代码正在指定行为外部被执行的各种异常。例如,异常检测器140可以包括多个子异常检测器。例如,子异常检测器可以被配置为检测一个或多个专门异常,而如果多个子异常检测器中的任何检测到异常,则异常检测器140检测到异常。
例如,异常检测器可以被配置用于以下各项中的一项或多项或全部以检测异常:
-检测对无效地址的读取或写入操作,
-截获系统调用并且检查针对一个或多个特定错误的截获系统调用的返回值,
-检测来自不可执行存储器的尝试执行,
-检测非法指令的尝试执行,
-截获被布置为分配存储器的系统调用,检查分配大小,并且确定分配大小是否高于阈值。
在异常检测器的实施例中,以上的任何组合是可能的。以上对策中的任一个是选项;例如,在实施例中,异常检测器可能未检查分配大小。例如,这样的风险可以被认为是太小的,或者对应对策可以被认为是足够便宜以在任何情况下安装。例如,在实施例中,异常检测器可以被配置为仅检测可以由信号处理程序检测的那些异常,例如,生成故障信号的那些异常,其可以由信号处理程序接收并且如本文所指示地处理。这样的异常检测器具有以下优点:不需要代码插装来检测异常;这样的异常检测器可以甚至被添加到现有计算机程序代码。更高级的异常检测器可以使用插装,例如,以截获函数调用的调用和/或返回值。
例如,在实施例中,异常检测器可以被配置用于检测对无效地址的读取或写入操作,检测来自不可执行存储器的尝试执行,以及检测非法指令(例如,坏操作码)的尝试执行。例如,异常检测器可以包括捕获对存储器的未对齐访问(例如,unix sigbus信号)、对未映射页面的访问(例如,unix sigsegv信号)、非法指令(例如,坏操作码)(例如,unixsigill信号)的信号处理程序。不需要异常检测器捕获所有可能异常,尽管一般来说捕获更多异常可以进一步改进安全性。例如,异常检测器可以被配置为仅检测针对其强化代码可用的那些异常。
异常检测器可以包括正常代码流的改变。例如,系统调用可以被截获和检查。例如,一个或多个截获系统调用可以针对一个或多个特定错误来验证。可以包括的特定系统调用是被布置为分配存储器的系统调用。如果系统调用将导致分配超过分配阈值,那么尝试可以用信号指示为异常。任何特定可检测异常是任选的,包括大分配检测。
对无效地址的读取或写入操作可以是对未映射地址或者没有权限的地址的读取或写入。例如,检测对未映射虚拟存储器地址的访问可能导致分段错误或崩溃。例如,在基于unix的系统上,例如,操作系统发送sigsegv信号。使用sigsegv处理程序,可以截获非法读取或写入操作。其是读取或写入未映射地址的异常。这样的行为未针对计算机程序代码指定,因为其导致软件的崩溃和/或未定义行为。崩溃可以由执行环境检测。
在实施例中,一些类型的强化可以包含在正常代码部分中,例如,作为基线安全性的部分,例如,除地址随机化之外。例如,在实施例中,分配存储器的系统调用可以被插装以限制其最大大小,或者可以以其他方式配置为使得来自尝试不同分配大小的地址探测是不可能的,例如,通过限制可以完成的大的分配的数目,例如,可以以时间单位(例如,每分钟)完成的数目。用于替换的强化代码部分可以另外具有额外对策。例如,强化代码部分可以包括用于检测对无效地址的读取或写入操作的对策等。
计算设备100可以包括定位器150。定位器150可以被配置为在检测地址探测时,定位地址探测起源于的计算机程序代码部分。如指出的,计算机程序代码可以包括多个部分120。例如,定位器150可以识别多个部分的哪个计算机程序代码部分引起异常。例如,定位器150可以检查计算机程序的堆栈和/或影子堆栈。
在实施例中,定位器150被配置为检索计算机程序代码部分中的最新执行的地址。从最新执行的地址,定位器150可以然后查找最新计算机代码部分。
例如,定位器150可以检索已经最新执行的一个或多个地址。地址可以从操作系统、从执行环境等获得。地址可以从硬件支持的地址历史设备检索,其保持最新执行的地址;或最新执行的地址的至少部分,例如,仅分支。检索的地址包括计算机程序代码部分的地址,但是可以包含额外地址。例如,最新执行的地址可以包括系统库代码或内核代码等中的地址。在该情况下,定位器150可以取得不在系统库代码或内核代码中的最新地址。
在实施例中,计算机代码可以插装以向定位器提供关于最新执行的代码部分的信息。例如,一个或多个或所有代码部分可以被配置为在其被执行时发送信号。例如,代码部分可以被配置为写入特定于代码部分的标识符,比如说,在存储器的部分中。通过检索代码部分标识符,或至少其最新代码部分标识符,定位器可以确定哪个代码部分最后被执行。例如,代码标识符可以写入环形缓冲器,使得历史的量是可用的,例如,最后10、20、100次执行、或更多。然而,缓冲器也可以仅支持一个单个代码部分标识符。例如,每个下一代码部分可以利用其代码部分标识符覆写代码部分标识符存储器。这可以使用在其中下一代码部分被执行之前检测到异常(例如,使用信号处理程序等)的系统中。
例如,代码部分可以被配置为将标识符写入历史中,例如,标识符可以识别代码部分。标识符可以是独特数,例如,随机数。标识符可以是代码部分的地址。地址可以稍后被用于地址替换。例如,标识符可以被用于查找替换代码部分。替换代码部分可以覆写代码部分。备选地,正常代码部分可以利用被配置为降低对强化代码部分的控制的代码等覆写。
在实施例中,定位器被配置为在异常之前确定哪个代码部分最后被执行。注意,从计算机科学观点,异常的最终原因可能已经发生在源代码中的更高得多的位置。例如,如果代码部分解引用空指针,则异常可以产生,例如,以截获信号的形式。其可以是指针在代码的执行的历史中更早得多地无意地被设定为零,然而,如果至少执行实际解引用的代码部分被识别,出于代码强化目的,其是足够的。
设备100可以包括替换单元160。替换单元160可以被配置为利用其中添加地址探测对策的替换计算机程序代码部分选择性地替换异常(例如,地址探测)起源于其的计算机程序代码部分。换句话说,不需要利用强化版本替换整个计算机程序代码。相反,仅引起异常的违规部分被替换。例如,替换代码可以包括地址探测对策,例如,避免一个或多个异常的对策。在利用强化版本替换之后,攻击者不能继续迭代地址探测以关于程序了解更多。相反,强化代码使得地址探测失败。对策可以额外地改进用户体验,例如,通过避免崩溃,例如,通过平稳失败,例如,通过跳跃到恢复例程而不是引起异常。但是异常例程的这样的平稳分辨率是不必要的;例如,对策可以仅停止地址探测揭示程序中的随机化地址上的信息。
换句话说,在异常已经检测并且已经确定哪个计算机程序代码部分引起异常之后,该特定计算机程序代码部分可以利用强化版本替换。强化版本可以比原始代码部分更慢,或使用更多资源;但是这一点的影响是有限的,因为并非全部程序代码利用较慢版本替换,而是仅其部分,例如,仅违规计算机程序代码部分。
在实施例中,定位的计算机程序代码部分,例如,异常起源于其的计算机程序代码部分,可以由热补丁替换。热补丁,也称为实况补丁或动态软件更新,是在不关闭应用的情况下应用补丁。这具有以下优点:即使计算机程序从此被保护,计算机程序也可以继续运行。热补丁是不必要的;例如,在实施例中,人们可以在其未运行时对计算机程序进行补丁,例如,如存储在存储介质上,例如,如存储在硬盘上等。这具有以下优点:下一次程序被执行时,易受地址探测攻击的代码部分被保护。在实施例中,仅热补丁被使用,或仅冷补丁,例如,在存储介质上,或两者。
例如,在实施例中,计算机代码部分可以对应于源代码部分,例如,功能相关单元、函数、基本块、扩展基本块等。强化代码部分可以通过从数据库选择强化代码来获得。例如,数据库可以是针对计算机程序代码部分中的每个的强化版本。数据库可以是本地数据库,例如,在计算设备100处,例如,在存储器110中。强化代码部分可以通过从在线服务器(例如,从在线数据库)下载强化代码部分来获得。强化代码部分可以通过将对应源代码连同额外对策源代码一起重新编译来获得。例如,编译器可以被配置为将地址探测对策添加到源代码部分,并且利用添加的对策编译源代码部分,因此获得用于替换异常起源于的计算机程序代码部分的强化计算机程序代码部分。编译可以本地完成,例如,在其上计算机程序运行的相同设备上,或其可以外部完成,例如,在不同设备上,例如,在云中。接收的强化代码部分可以密码保护,例如,利用数字签名。签名可以由计算设备的替换单元检查。
在实施例中,多个替换计算机程序代码部分被包括在计算机代码中以在需要时替换多个计算机程序代码部分。替换计算机程序代码部分未使用,例如未被执行,直到替换计算机程序代码替换起源计算机程序代码部分。该布置具有以下优点:用于执行的代码部分和用于替换的代码部分一起可用于立即执行和/或替换。
在实施例中,替换代码部分可以通过利用强化版本覆写多个部分120的代码部分来完成。例如,可以确定例如在编译时间期间每个部分的正常和强化版本是多么大。正常版本可以然后利用假数据(例如,nop指令)扩展,以为强化版本保留空间。相反,正常版本可以利用对强化版本的跳跃替换。在强化版本完成之后,其可以将控制返回到正常版本,其然后照常分支到下一部分;备选地,强化版本自身可以分支到下一部分。然后正常代码的未使用可执行代码可以或可以不根据期望覆写,例如,利用假数据。掉入替换的备选方案是开关板。下面描述了该结构。
在实施例中,维持分支地址的列表。列表可以利用分支标识符索引。针对每个分支标识符,分支地址被包括。当代码部分需要分支时,例如,如利用分支标识符所识别的。分支标识符可以是地址,例如,正常代码部分地址。代码部分从列表检索分支地址,例如,查找分支标识符。初始地,分支地址指向正常代码部分。如果正常代码部分被替换,则正常代码部分地址在列表中利用强化代码部分的地址替换;这可以通过替换单元完成。代替于具有地址的中心列表,两个地址可以相反保持在代码部分中:针对正常代码部分的分支的地址和针对强化代码部分的地址。在该情况下,列表仅需要保持哪个地址必须被使用。后者将信息的大小降低到一位每分支目标,或甚至到指向代码部分的一位每分支目标;位指示哪个地址要被使用。针对代码部分内的分支目标,不需要特殊护理,并且仅一个分支目标地址需要被保持。各种其他解决方案可以被用于实施代码的替换,并且特别地,热补丁。
在实施例中,替换起源代码部分的强化代码部分适于避免异常,或者至少避免触发异常揭示关于随机化地址的信息。例如,一个或多个对策可以被包括在强化计算机代码部分中。对策可以被配置用于以下各项中的一项或多项:
-验证存储器负载并且将操作存储在替换计算机程序代码部分中,
-防止替换计算机程序代码部分中的控制流转移,
-在转移替换计算机程序代码部分中的控制流之前验证堆栈上的返回地址,
-隔离替换计算机程序代码部分中的故障,并且
-限制替换计算机程序代码部分中的存储器分配操作。
例如,验证存储器负载和存储操作可以使用例如代码指针完整性(CPI)(包括SafeStack)[33]或泄露抗性变型(诸如Readactor[17]或TASR[12])验证。许多信息泄露防御添加存储器访问上的边界检查。范例包括软装[39]、CETS[40]、低脂肪指针[21]、和地址消毒剂[45]。
例如,防止替换计算机程序代码部分中的控制流转移可以使用控制流完整性[8](CFI)完成,例如,以检查每个间接控制流转移以看其是否遵守应用的静态控制流图。
例如,在转移替换计算机程序代码部分中的控制流之前验证堆栈上的返回地址可以完成,例如,通过将返回地址保存在影子堆栈的函数入口处,并且在函数出口之前验证返回地址。
针对一些对策,不仅违规计算机代码部分可以替换,而且可以调用违规代码部分的那些代码部分可以替换,例如,以确保返回地址被放置在影子堆栈上。
在实施例中,替换代码部分包括针对检测异常中的每个的对策。这具有以下缺点:代码部分负有针对其实际上不易受攻击的问题的对策。在另一方面,其具有以下优点:替换部分的数目是小的,例如,一个。具有针对一个或多个或所有代码部分的多个替换代码部分也是可能的。多个替换代码部分可以利用不同对策布置。这具有以下优点:替换代码部分较少负有保护代码,并且可以因此是更小和/或更快的。例如,多个替换代码部分可以对应于多个异常检测器;每个异常检测器检测一个或多个异常,并且对应的替换代码部分包括针对所述一个或多个异常的对策。
例如,多个替换代码部分的一个集合可以具有针对非法存储器访问的对策,例如,sigsegv或sigbus,而其他可以具有针对非法操作码的执行的对策,例如,sigill。
非法存储器访问可以针对有效或无效地址。什么是非法存储器访问可以通过静态分析来确定。异常也可以通过试图执行不可执行存储器引起。
存在实施对策的若干方式。在实施例中,对策可以被配置为使得计算机程序者针对对映射存储器区和未映射存储器区的非法存储器访问两者崩溃或重新启动。这不应当使用户感到不便太多,因为异常将通常仅与特别精心制作的输入数据一起发生。然而,其可以严重地使攻击者感到不便,特别地如果崩溃或重新启动引起地址的重复随机化。
在替换之后,如果程序继续运行,则其是便利的。可以添加恢复代码,或者现有恢复代码可以被用于适应这一点。例如,在实施例中,计算机程序代码包括恢复代码,处理器被配置为在选择性替换之后将控制流转移到恢复代码以恢复计算机程序的操作。例如,恢复代码可以在最后成功交易之后到主屏幕或程序状态等。对策也可以使用恢复功能。
图2b示意性示出了计算设备101的实施例的范例。除多个改进之外,计算设备可以类似于计算设备100。
例如,在实施例中,计算设备100(例如,定位器150)可以被配置为从计算机程序执行的轨迹定位地址探测起源于的计算机程序代码部分。例如,轨迹可以由轨迹单元152维持,该轨迹单元152被配置为存储计算机程序的一个或多个最新执行的地址的历史、轨迹,例如,分支轨迹。轨迹可以示出多个最新执行的地址。例如,计算设备100,例如,定位器150,可以被配置为:
-检索计算机程序执行的轨迹,所述轨迹包括地址空间中的地址,
-确定对应于计算机程序代码的轨迹中的最新地址,
-确定对应于最新地址的计算机程序代码。
检索的轨迹地址可以是随机化地址,并且可以与应用中使用的地址相比较。例如,这可以使用查找表,例如,将地址映射到计算机代码部分的表。例如,这样的表可以在运行时间处创建,例如,在启动处、或在编译时间处。例如,在实施例中,使用产生矮化型调试信息的编译器。在实施例中,使用矮化版本4.0,但是其他版本也起作用。例如,确定对应于最新地址的计算机程序代码可以包括确定对应于最新地址的计算机程序代码的基本块和/或函数。
例如,确定对应于计算机程序代码的轨迹中的最新地址可以包括确定不在系统库代码或内核代码中的最新地址。
补充或者代替于轨迹单元152,计算单元101可以包括替换数据135。例如,如图2b所示,代码11a可以包括计算机程序代码部分120以及强化计算机程序代码部分125。示出的是强化计算机程序代码部分126、127和128。例如,对于多个120中的每个计算机程序代码部分,可以存在对应的一个或多个强化代码部分。例如,强化代码部分126可以对应于代码部分121,强化代码部分127可以对应于代码部分122等。因此,在实施例中,代码111包含用于每个代码部分的至少两个版本:正常版本和一个或多个强化版本。强化版本具有以下优点:它们是更安全的。正常版本具有以下优点:其具有较少开销,例如,是更小的、更快的,使用更少资源等。初始地,替换数据135指示仅正常版本要被使用。例如,执行单元130可以被配置为与替换数据135协作。例如,当下一代码部分将被执行时,执行单元130查找正常版本或强化版本是否要被执行。执行单元的这样的方式可以被称为开关板,并且替换数据135可以被称为开关板数据。用于替换的该解决方案具有以下优点:热补丁是不复杂的,仅在替换数据135中需要指示强化版本要被用于一个或多个特定代码部分。下次需要该代码部分时,执行器130将查找要使用在替换数据135中的代码部分并且继续执行多个120中的正常部分或130中的强化部分。替换数据135还可以包括实际信息,诸如正常或强化替换代码部分的地址。
不需要多个部分120中的每个代码部分具有强化版本。例如,其中特定异常不能发生(例如,正常代码部分可以与强化代码部分相同)的基本块不需要强化版本。因此,多个125可以小于多个120。这实际上不应当引起问题,因为其中异常不能发生的正常代码部分将不被替换。
替换代码部分本地可用的开关板解决方案工作正常。开关板解决方案也可以在替换代码部分动态获得时被使用,例如,在需要时下载或编译。在这种情况下,替换代码将指示替换代码部分是可用的并且应当使用。
例如,在实施例中,计算机程序代码包括用于从其中引起异常的计算机程序代码部分切换到替换计算机程序代码部分的替换数据135。例如,替换数据135可以针对多个计算机程序代码部分控制替换计算机程序代码部分是否要被使用。
决定控制流是否应当转移到强化代码部分或正常代码部分可以中心完成,例如,在执行器单元130中,或者可以本地完成,例如,在代码部分自身中。例如,如果需要分支,则分支地址可以在替换数据135中查找。注意,替换数据135自身的位置可以随机化,仅作为例如堆栈等。
图2c示意性地示出了编译设备500的实施例的范例。
编译设备500可以包括用于接收源代码512的源输入。例如,源代码可以是C源代码等。源代码输入512可以包括通信接口,其被配置为接收源代码。例如,源代码输入可以包括存储介质(诸如硬盘或存储器)的API或接口。
编译设备500可以包括解析器522。解析器522可以被配置为生成多个计算机程序源部分。例如,解析器522可以在源代码、基本块、扩展基本块、函数等中识别。
编译设备500包括第一编译部分524和第二编译部分526,其两者被配置为编译由解析器522识别的计算机程序源部分。例如,第一编译部分524可以在没有或有仅轻微对策的情况下编译各部分。例如,第二编译部分526可以利用添加的对策编译各部分。如果针对随机化的支持在编译时间处添加,则这可以通过第一编译器部分524和第二编译器部分526两者来添加。
例如,第一编译部分524可以被配置为编译源代码以获得计算机程序代码,计算机程序代码包括对应于多个源代码部分的多个计算机程序代码部分。例如,第二编译部分526可以被配置为利用添加的地址探测对策编译多个源代码部分,因此获得多个替换计算机程序代码部分。
第一和第二编译部分524和526可以使用设备500的相同功能,例如,第二编译部分526可以添加对策并且然后调用第一编译部分524以将源代码连同额外对策一起编译。
编译设备500可以包括额外代码部分528,其被配置为在计算机程序代码中包括至少一个异常检测器和切换代码。至少一个异常检测器可以被配置为检测执行期间的计算机程序上的地址探测。切换代码或替换代码可以被配置为:
-在检测地址探测时,定位地址探测起源于的计算机程序代码部分,并且
-利用对应的替换计算机程序代码部分选择性地替换所述起源计算机程序代码部分。
例如,(一个或多个)异常检测器和替换代码可以是如本文所描述的。(一个或多个)异常检测器和替换代码可以被添加作为编译的部分或链接的部分。
编译设备500可以包括输出到编译代码的代码输出530。例如,代码输出530可以包括通信接口。例如,代码输出530可以将编译代码存储在存储介质上,例如,在硬盘上、在存储器中等。
在计算设备和编译设备的各种实施例中,通信接口可以根据需要添加。例如,接口可以是局域网或者广域网(例如,因特网)的网络接口、内部或者外部数据存储的存储接口、键盘、应用接口(API)等。
计算和/或编译设备可以具有用户接口,其可以包括众所周知的元件,诸如一个或多个按钮、键盘、显示器、触摸屏等。用户接口可以被布置用于容纳用于执行计算和/或编译动作的用户交互。例如,计算设备可以被配置为用户应用,例如,媒体播放器、网络浏览器、或操作系统或驱动器等。例如,用户可以发起媒体播放、网络浏览、用户操作系统功能、驱动器功能等,例如,通过用户接口。可以隐藏在这些交互中的攻击,例如,特别精心制作的媒体文件、网页等,可以由异常检测器检测并且通过利用强化版本替换引起异常的代码部分来接种。
计算设备和编译设备两者可以包括存储设备,例如,以存储代码部分、源代码、代码输出等。存储设备可以被实施为电子存储器,比如说闪存,或者磁性存储器,比如说硬盘等,或者光学存储器,例如,DVD。多个分立存储器可以一起组成更大的存储器,例如,存储设备、存储器110等。
通常,计算设备和编译设备,例如,设备100、101、500各自包括微处理器,其执行被存储在设备处的适当的软件;例如,该软件可能已经被下载和/或被存储在对应的存储器(例如,易失性存储器(诸如RAM)或者非易失性存储器(诸如闪存))中。备选地,设备可以全部或者部分地以可编程逻辑实施,例如,作为现场可编程门阵列(FPGA)。设备可以全部或者部分地被实施为所谓的专用集成电路(ASIC),例如,针对其特定用途定制的集成电路(IC)。例如,电路可以以CMOS实施,例如,使用硬件描述语言,诸如Verilog、VHDL等。
在实施例中,设备可以包括被配置为实施本文所描述的对应单元的一个或多个电路。电路可以是处理器电路和存储电路,处理器电路运行电子地表示在存储电路中的指令。处理器电路可以以分布式方式实施,例如,作为多个子处理器电路。存储设备可以被分布在多个分布式子存储设备上。存储器的部分或者全部可以是电子存储器、磁性存储器等。例如,存储设备可以具有易失性和非易失性部分。存储设备的部分可以是只读的。
图7a示意性地示出了计算方法600的实施例的范例。计算设备600包括防止地址探测的计算机程序的执行。方法600包括:
-存储610计算机程序代码120和计算机程序数据115。计算机程序代码包括多个计算机程序代码部分并且被配置为在计算机程序数据上操作。计算机程序代码和/或计算机程序数据的地址已经在地址空间中随机化。所述随机化可以是方法600的部分,例如,作为计算机程序代码的启动阶段的部分。
-执行620所述随机化地址空间内的计算机程序代码,
-通过运行用于检测计算机程序上的地址探测的至少一个异常检测器140来监测630计算机程序代码的执行,
-在检测640地址探测时,定位642地址探测起源于的计算机程序代码部分,
-利用其中添加地址探测对策的替换计算机程序代码部分选择性地替换644所述起源计算机程序代码部分。
图7b示意性地示出了编译方法650的实施例的范例。编译方法650被配置为编译源代码以获得防止地址探测的计算机程序。编译方法650包括:
-编译660源代码以获得计算机程序代码,计算机程序代码包括对应于多个源代码部分的多个计算机程序代码部分,计算机程序代码被布置用于在随机化地址空间中执行,
-利用添加的地址探测对策编译670多个源代码部分,因此获得多个替换计算机程序代码部分,
-在计算机程序代码中包括680被配置用于检测执行期间的计算机程序上的地址探测的至少一个异常检测器,
-在计算机程序代码中包括690切换代码,切换代码被配置为:
-在检测地址探测时,定位地址探测起源于的计算机程序代码部分,并且
-利用对应的替换计算机程序代码部分选择性地替换所述起源计算机程序代码部分。
执行方法的许多不同方式是可能的,如对于本领域技术人员将显而易见的。例如,步骤可以以所示的次序执行,但是步骤的次序也可以变化或者一些步骤可以并行执行。此外,在步骤之间,可以插入其他方法步骤。插入步骤可以表示诸如本文所描述的方法的细化,或者可以与方法无关。例如,步骤620和630、660和670、680和690等可以至少部分地执行。此外,给定步骤可能在下一步骤开始之前尚未完全完成。
方法的实施例可以使用软件执行,所述软件包括用于使得处理器系统执行方法600和/或650的指令。软件可以仅包括由系统的特定子实体采取的那些步骤。软件可以被存储在适合的存储介质(诸如硬盘、软盘、存储器、光盘等)中。软件可以沿着线或者无线或者使用数据网络(例如,因特网)发送。可以使软件可用于下载和/或用于服务器上的远程使用。方法的实施例可以使用被布置为将可编程逻辑(例如,现场可编程门阵列(FPGA))配置为执行方法的位流来执行。
将意识到,本发明还扩展到计算机程序,特别地适于将本发明付诸实践的载体上或中的计算机程序。程序可以采取源代码、目标代码、代码中间源和目标代码的形式,诸如部分编译形式或采取适于使用在方法的实施例的实施方式中的任何其他形式。与计算机程序产品有关的实施例包括对应于所阐述的方法中的至少一个的处理步骤中的每个处理步骤的计算机可执行指令。这些指令可以细分成子例程和/或被存储在可以静态或者动态地链接的一个或多个文件中。与计算机程序产品有关的另一实施例包括对应于所阐述的系统和/或产品中的至少一个中的模块中的每个的计算机可执行指令。
下面描述了另外的增强、实施方式细节和/或另外的实施例。特别地,描述的原型实施方式被称为ProbeGuard。ProbeGuard通过反应程序变换减轻地址探测攻击。
针对代码复用的许多现代防御依赖于将敏感数据(诸如影子堆栈)隐藏在大存储器地址空间中。尽管比常规基于完整性的防御更高效,但是这些解决方案易受可以定位隐藏数据并且损害安全性的探测攻击。这已经引导研究员询问隐藏在现实世界软件安全中的信息的值。相反,实施例示出这样的限制不是基本的,并且该信息隐藏和基于完整性的防御是解决方案的连续谱的两个极端。提出了通过部署现有的基于信息隐藏的基线防御并且然后在探测攻击发生时增量地移动到更强大的基于完整性的防御自动平衡性能和安全性的解决方案。ProbeGuard是高效的,提供强安全性,并且在遭遇更多探测基元时平稳折中。
发明人的洞察力在于,本身易受探测攻击不是基本限制。发明人的洞察力在于,信息隐藏和完整性检查防御是针对代码复用攻击的防御的连续谱的两个极端,其中,其在效率与安全之间进行折中。如果系统可以检测探测过程并且在其打破防御之前停止它,则信息隐藏可以仍然坚守阵地。
在实施例中,快速基线防御被提供用于程序,例如,信息隐藏。实施例连续地监测针对探测尝试的发生的运行程序。当遭遇这样的尝试时,其原点自动定位,并且违规代码块在运行时间利用更强并且更昂贵的一个或多个基于完整性的防御进行补丁。换句话说,强的防御根据需要选择性应用-导致具有较低开销的强保护。
在实施例(例如,ProbeGuard)的第一阶段中,可以使用一种形式的异常检测。检测表征去随机化基元的探测尝试。有趣的是,不同于常规异常检测,假阳性不太具有问题。其仅仅导致程序的部分的更多强化以使其更安全,即使稍微更慢。针对大多数探测攻击,异常检测自身是简单并且非侵入式的;例如,异常检测重复例外或其他异常。
实施例的第二阶段(即,探测分析)发现攻击者针对探测滥用的特定代码位点,或者简而言之,探测基元。特别高效的实施方式利用在现代处理器中可用的快速控制流跟踪特征,例如,诸如Intel处理器轨迹(Intel PT)[28]。这允许以安全方式保守精确定位违规代码段。
最后,在第三阶段中,程序通过利用强化变体选择性地替换违规代码段打补丁,特别地热补丁。尽管该代码块可以运行更慢,但是插装和因此减速限于易受攻击的片段。原则上,实施例对于热补丁技术自身是不可知的。简洁的方式是创建已经包含甚至所有代码段中的多个的多个版本的二进制,其中,每个版本提供不同水平的保护。初始地,二进制仅运行高效的免插装的片段。然而,随着和当探针分析暴露用作探测基元的代码段时,实施例(例如,ProbeGuard)将对应的代码段切换到适当的强化版本。
有趣的是,实施例提供自动平衡性能和安全性的代码复用防御的设计空间中的新点。设计可以初始使用快但弱的信息隐藏保护系统,并且在需要处和时选择性地转换到更强但更慢的完整性预防。低开销控制流跟踪能力(例如,诸如在现代处理器(诸如Intel PT)中所提供的)允许高效精确定位受探测尝试影响的代码段。异常检测可以然后触发选择性安全强化。实验评价示出,实施方式ProbeGuard在抵抗针对大范围的去随机化基元的探测尝试时是安全、高效并且有效的。
定义了与最新过去[23、25、32、41、43](表1)中的相关研究一致的威胁模型。所确定的远程攻击者被认为是旨在通过网络将代码复用攻击安装在由任何理想现有技术的基于信息隐藏的防御强化的服务器应用上。例如,人们可以通过部署现代防御(诸如代码指针完整性(CPI)(包括SafeStack)[33])或泄露抗性变体(诸如Readactor[17]或TASR[12])使服务器应用针对代码复用安全。ProbeGuard的目标是解决实际(基于信息隐藏的)代码复用防御的基本弱点,使其对去随机化隐藏存储器区域(此处,分别安全区域和弹床代码区域)并且绕过防御的攻击有抵抗力。
例如,人们可以考虑具有安装远程代码复用攻击的意图的攻击者。攻击目标可以是例如具有自动崩溃恢复的服务器应用。假定攻击者已经进入去随机化基元[25、29、41]以探测受害者的地址空间,找到敏感的防御特异性信息,并且绕过防御。尽管偶然使用单个探针找到64位地址空间中的敏感数据的概率是可以忽略的,但是假定攻击者具有无限的探测尝试,因为应用在任何崩溃时自动恢复。这是现实的,因为即使探测尝试可以各自导致崩溃,现实世界服务器应用通常也具有工作者过程,其具有内置崩溃恢复功能以处理非预期的运行时间错误[41]。
ProbeGuard实施例在提供高效的控制流跟踪(诸如自Broadwell在Intel CPU上可用的Intel处理器轨迹)的现代处理器系统上实施。除了远程应用水平攻击者的到达之外,轨迹是经由操作系统内核可访问的。在实施例中,易受攻击代码的自动化检测和后续加强也可以适用于操作系统软件、或驱动器等。
如指出的,现有防御可以分类为基于软件完整性检查和基于信息隐藏的防御。洞察力在于,不管其弱点,后者针对实际部署保持优选的选择。
软件完整性
无论目标是信息泄露还是代码复用漏洞利用,存储器损坏攻击通常违反软件完整性。为了防止这一点,软件完整性贯穿应用应用完整性检查。
许多信息泄露防御添加存储器访问上的边界检查。范例包括软装[39]、CETS[40]、低脂肪指针[21]和地址消毒剂[45]。模优化,这样的解决方案验证所有程序的负载和存储,以及其存储器分配操作。它们在效率和其如何管理(可信的)元数据方面不同。其常常依赖于静态程序分析(诸如指针别名分析和指针跟踪)并且倾向于在其提供的安全性保证中是鲁棒的—除这样的分析技术的公知(和基本)限制之外。为了抵抗修改应用的控制流的代码复用攻击,如控制流完整性[8](CFI)的解决方案检查每个间接控制流转移以看其是否遵守应用的静态控制流图。遗憾的是,细粒度的CFI[19、37、38、48]引起显著性能成本并且稍后变体[51、52]因此试图平衡安全性和性能保证。然而,先前研究已经示出,这样做常常显著地弱化安全性[24]。如果前向边[48]的有限保护,则细粒度的CFI的开销可以与21%[9]一样高或与9%一样少。最后,防止任意存储器访问或损坏的SFI(软件故障隔离)[32,50](沙箱技术)引起针对读取和写入的大约17-19.6%开销。
基于信息隐藏的防御
基于信息隐藏的防御当其消除昂贵的运行时间检查时引起小得多的开销,并且隐藏敏感信息的完整性仅仅依赖于攻击者不能够定位其。ASLR特别地用作针对许多当前系统中的代码复用攻击的第一道防线。然而,当各种信息公开易受攻击性允许攻击者泄露指针以最终破坏随机化时,单独依赖于ASLR不再足够。代替于仅仅隐藏整个应用的位置,现代防御因此将应用分离为敏感和非敏感区域并且使用基于ASLR的概率技术来隐藏敏感区域。
范例包括CPI[33]、ASLR-Guard[36]、Oxymoron[11]、Isomeron[20]、TASR[12]、和许多其他[15、17、47]。CPI[33]隐藏其中其存储所有代码指针的安全区域和安全堆栈。ASLR-Guard[36]隐藏其用于代码指针的基于xor的加密的预分配密钥。Isomeron[20]和Oxymoron[11]隐藏运行时间查找表以实施代码随机化,而TASR[12]重复随机化过程的存储器布局并且隐藏激活代码指针的列表。其通过隐藏这些敏感数据使代码复用不可行,从而消除了针对普遍完整性检查的需要。在其当中,泄露弹性变体[12、15、17、36]通过防止攻击者读取存储器中的可执行代码区域提供针对JIT ROP[20、46]攻击的保护。
所有这些技术具有非常低的运行时间开销。CPI-SafeStack报告小于2%、ASLR-Guard小于1%、Oxymoron 2.5%、和TASR 2%。即使安全性保证不比基于完整性的解决方案强大,就性能而言,借助于随机化的信息隐藏几乎免费。
信息隐藏上的攻击
遗憾的是,信息隐藏易受信息公开攻击。例如,Evans等人[22]通过漏洞利用数据指针覆写易受攻击性攻击CPI的安全区域,通过基于错误和定时的侧信道泄露安全区域的位置。
在较粗水平上,盲ROP(BROP)[13]利用堆栈易受攻击性盲目伸出到地址空间中并且使程序跳跃到无意识位置。通过观察产生的崩溃、悬挂和其他行为,攻击者最终找到感兴趣的小工具—尽管在许多崩溃之后。另一方面,CROP[23]通过滥用可靠性特征(诸如例外处理),在探测不可访问存储器时防止崩溃,使探针更隐蔽。
分配数据库[41]间接扫描地址空间。不是试图访问分配的隐藏区域,其通过探测未分配孔来推断其位置。通过尝试许多大的分配并且观察其是否成功,攻击者最终找到随机大小孔的大小并且因此隐藏区域的(一个或多个)位置。
来自另一去随机化基元类的基于高速缓存的定时侧信道。AnC[26]例如最近说明使用基于本地高速缓存访问的探针以绕过ASLR保护。这样的攻击要求对为攻击者的代码(例如,Javascript引擎)提供执行环境的本地系统的访问权。然而,基于随机化的防御被设计为防止远程攻击而非本地攻击。由于对其本地系统的访问权的缺少,因此以服务器应用为目标的远程攻击者不能使用这样的去随机化基元。
防御 任意读取 任意写入 任意跳跃 分配数据库
CCFIR X X
O-CFI X
影子堆栈 X X
StackArmor X X X
Oxymoron X X X
Isomeron X X X X
CPI X X X
ASLR X X X X
LR2 X X
Readactor X X
上表示出了针对远程攻击者的现有去随机化基元类,即,任意读取、写入和跳跃易受攻击性以及基于存储器分配的基元,并且图示了适于攻击列出的基于信息隐藏的现代防御的去随机化基元。针对所有这些类,ProbeGuard当前实施异常检测器和反应性强化。尽管这捕获基本基元的宽集合,但是不主张当研究员一直查找新基元时表是详尽的。应注意到,去随机化技术通常在其最终破坏随机化之前要求多个探测尝试,并且由于其必须向攻击者提供有用信号,因此其全部倾向于具有一些异常特性。ProbeGuard通过将针对给定基元可用于攻击者的探测尝试的数目降低到仅一个可检测探针来减轻这样的攻击。
图3示意性地示出了计算设备200的实施例的范例并且示意性地示出了计算方法的实施例的范例。计算设备200可以包括一个或多个异常检测单元,示出的是异常检测单元242、243、244。异常检测单元监测计算机程序220。计算设备200还可以包括探针分析单元250,其可以使用运行时间执行轨迹252和/或LLVM IR 254。在工作流期间的某一点处,易受攻击点由代码部分foo()中的探针分析单元250识别。这被图示为具有识别的易受攻击点222的计算机程序。计算设备200还可以包括热补丁单元260和/或安全强化代码高速缓存262。在易受攻击点寻址之后,在这种情况下,通过利用强化sec_foo()替换代码部分foo(),获得强化计算机程序224。可能的工作流包括201)攻击者做出探测尝试;202)异常检测器中的一个感测和触发反应性强化;203)探针分析器识别违规点;204)热补丁器在运行中利用其强化变体替换违规点。
在实施例中,在首先利用任何现有技术基于信息隐藏的防御保护应用之后,例如,作为基线防御,改进针对去随机化的保护应用;例如,这可以使用根据实施例的编译方法。产生的二进制可以然后在生产中运行。图3示出了诸如ProbeGuard的实施例可以在运行时间处如何在强化应用上操作。攻击者可以使用去随机化基元探测201应用以试图破坏信息隐藏并且绕过基线防御。比如说,攻击者使用缓冲器溢出易受攻击性以损坏应用从其读取的数据指针。原则上,她可以使用该任意存储器读取基元[22]以探测随机存储器地址,寻找隐藏区域。然而,随机探针最可能命中大64位地址空间中的无效地址,触发segfault。在实施例中,包括检测这个并且触发反应性强化的异常检测。
检测的异常事件可以暂时停止应用并且调用探测分析,其分析当前执行背景以通过利用例如从高效和抗干扰的分支跟踪设施(诸如Intel PT)获得的轨迹找到违规代码段。在实施例中,例如,经由内核获得的轨迹通过将二进制指令地址映射回到其源信息提高以定位攻击者用作探测基元的代码段-甚至当用户存储器可以不再可信时在攻击下。
热补丁部件260可以现在在飞行中仅利用语义等效但强化版本(例如,图3中的函数sec_foo())替换精确定位代码段(例如,图中的函数foo())。新代码段可以包括停止攻击者使用违规基元的能力的目标完整性检查,但是可能以减慢仅该片段的执行为代价。在以上范例中,诸如ProbeGuard的实施例可以将软件故障隔离(SFI)[50]检查插入该代码段中,从而限制探针基元的对远离隐藏区域的区域的访问,因此使隐藏区域免于恶意访问。实施例可以然后通过依附于目标应用的恢复功能激活新代码段。例如,恢复功能分叉以替换崩溃孩子,例如,如可以在Nginx服务器上完成的。使用相同基元进一步探测尝试,无论其是否导致崩溃,停止以产生针对攻击者的期望信号。
以下章节详述特定实施例(被称为ProbeGuard)的架构和设计。针对ProbeGuard的设计目标包括(i)通过反应性强化减轻保护应用上的探测尝试,以及(ii)平衡安全性和性能。应用采用基于信息隐藏的现有技术防御,而ProbeGuard使什么被隐藏保持隐藏更可能。
图4示意性地示出了计算设备300的实施例的范例。图4示出的是热补丁单元260、安全强化代码高速缓存262、计算机程序220和一个或多个异常检测单元,示出的是异常检测单元242-244。这些部件由基于信息隐藏的防御310保护。图4还示出了反应性防御服务器320,以及PT库330。在实施例中,这些部分可以在用户空间301中运行。
图4还示出了操作系统340,其包括PT记录单元345。这些部件可以在内核空间302中运行。图4还示出了硬件350。
图4示出了ProbeGuard实施例的主要部件。异常检测器可以嵌入在感测探测攻击的应用和包括通过应用基于LLVM[35]的完整性检查插装强化的代码段的集合的代码高速缓存内。分离的反应性防御服务器320解码Intel PT轨迹并且执行快速探针分析。ProbeGuard可以在受到攻击时通过热补丁反应地激活强化代码段。在以下中,讨论了组成ProbeGuard的该实施例的部件;解释了其如何实现其设计目标。
异常检测
攻击者可以使用若干去随机化基元类。ProbeGuard实施例采用专用异常检测器有效并且立即检测任何探测尝试。
任意读取和写入:攻击者可以以去随机化隐藏区域为目标利用应用中的任意存储器读取或写入易受攻击性。通常,仅应用的虚拟地址空间的非常小部分实际上被映射。因此,当攻击者使用这样的易受攻击性访问随机地址时,很可能命中导致分段故障(或崩溃)的未映射虚拟存储器地址。在基于UNIX的系统上,例如,操作系统发送SIGSEGV信号,其通常导致应用崩溃(和恢复)。这样的探测攻击通过使用自定义SIGSEGV处理程序简单地处理和代理信号来检测。甚至在多虫或异常SIGSEGV知道的应用的情况下,这将不影响(或中断)应用行为,但是因此,仅增加应用的强化表面。
内核读取和写入:攻击者偏好悄悄探测并且避免检测。因此,为了避免崩溃,其还可以试图通过经由内核探测存储器将受害者应用的地址空间去随机化。某些系统调用(例如,读取)接受其参量列表中的存储器地址并且返回特定错误代码(例如,EFAULT),如果增量是指向不可访问或未分配存储器位置的指针。在这样的参量上使用任意读取/写入基元,其可以尝试CROP[23]攻击以使能消除应用崩溃的探针(从而不生成SIGSEGV信号)。这样的探测攻击通过要么在glibc中要么直接地在内核中截获系统调用并且检查其结果来检测。再次由于这些事件是非常异常的,因此其被识别为异常并且触发反应性强化。在我们的原型中,系统调用在库水平处截获,因为这样做使内核中的复杂性最小化并且直接调用系统调用的良性应用是罕见的。
任意跳跃:一些易受攻击性允许攻击者控制指令指针,有效地给定其任意跳跃基元。例如,抵御JIT-ROP攻击[46](诸如XnR[10]和Readactor[17])的泄露弹性技术易受到任意跳跃基元攻击。但是,这些基元可能不适于以其他防御为目标-例如,提供前向和后向边缘CFT保护两者的那些防御。任意跳跃基元允许扫描地址空间寻找有效代码指针,并且然后定位代码小工具。BROP[13]例如将堆栈写入易受攻击性转变成任意跳跃基元。如在任意读取和写入易受攻击性的情况下,执行未映射或不可执行存储器的尝试导致分段故障(唤起SIGSEGV信号)或非法指令例外(唤起SIGILL信号),因为存储器区域可能不包含有效机器指令。为了检测这些探测攻击,自定义信号处理程序扩展以处理信号并且触发如先前所解释的反应性强化。
分配数据库:Oikonomopoulos等人示出了基于信息隐藏的防御易受使用分配数据库[41]的攻击敏影响。这样的探针通过试图分配大存储器区利用目标应用中的存储器分配功能。分配的成功或者失败泄露关于地址空间中的孔的大小的信息,其继而帮助定位隐藏区域。这些探针通过寻找异常大存储器分配尝试来检测;例如,通过接入glibc中以截获用于分配存储器的系统调用(例如,mmap()和brk())。更广泛使用的分配调用(例如,malloc())间接得到截获,因为其内部依赖于这些系统调用以从操作系统获得大存储器区。可配置阈值在分配大小上提供,在其上我们的检测器触发反应性强化(默认地址空间的一半)。
其他基元:尽管所有广泛使用的去随机化基元被覆盖,但是研究员可以在未来很好地找到新基元。因此,抢先确保所有种类的探针的检测是不可能的。然而,任何有用探针很可能:(i)向攻击者提供清楚和不同的信号—同样也应当帮助检测,以及(ii)探针存储器,因此,应用水平检测应当保持可行,因为远程攻击者尚未进入使用外部或如先前讨论的基于硬件的侧信道的其他方式。在实施例中,计算设备是通过每当新基元表面时包括新检测器可扩展的。
探针分析
在异常检测器标记潜在攻击时,ProbeGuard可以确定使用的探测基元,或者,换句话说,定位违规代码段—其被称为“探针分析”。去随机化基元也可以利用可以写入到有效映射存储器区内的一些其他指针的不可检测的缓冲器过度读取和过度写入,其最终在应用的执行期间在其他地方得到解除引用。注意,基元的最后效应,在这种情况下,其中损坏指针解除引用的点,和其代码位置关系超过用于抑制攻击的对应易受攻击性的位置。这是因为易受攻击性的最后表示给定攻击者去随机化存储器地址空间的能力,其是什么被称为探测基元。为了定位探测基元,硬件辅助分支跟踪可以被用于在异常被检测到时之前获取控制流。反向映射被建立以从轨迹获取源级信息。这被用于ProbeGuard中的基于程序变换的热补丁。
过去执行的控制流可以使用提供低开销和安全分支跟踪的Intel PT获得。CPU的模型特异性寄存器(MSR)中的控制位允许操作系统内核接通或关断该硬件特征。Intel PT将高度压缩的轨迹分组存储在内核的存储器空间中的环形缓冲器中,超过用户区中的攻击者的到达。缓冲器大小是可配置的;典型的值在从2MB到4MB或更多范围内。ProbeGuard不需要很深入了解过去。缓冲器需要仅保持足以指向库/外部函数中的任何执行之外。例如,类似执行跟踪特征、来自Intel的过去分支记录(LBR)保存执行的过去16个分支。这将起作用,尽管在一些情况下,可能不足以向过去提供足够的可见性。尽管解码轨迹数据比快速记录慢得多,但是其仅很少被需要(在被探测时)。此外,处理时间保持可接受用于我们的目的,因为向后轨迹分析可以将自身仅限于相关最近控制流历史并且避免解码其整体中的所有轨迹。
在Linux上,性能记录接口允许用户在目标应用中的每过程和甚至每线程基础上跟踪Intel PT事件(使用每线程选项)。在实施例中,快照模式使用[3、30],其在要求时转储轨迹;例如,当异常得到检测时。尽管解码轨迹提供正确执行的代码地址的序列直到检测到的异常,但是将其映射回到源代码和确定违规代码段仍然是困难的。
探针分析器被配置为定位源代码中的影响点。在实施例中,LLVM的调试元数据中的字段改换意图通常携带源代码位置的列数以相反放置相应基本块标识符。这仅简化我们的原型实施方式以让LLVM的默认代码发生器,通过DWARF 4.0符号在元数据上传递到得到的应用二进制,而不是必须使用新元数据流和写入支持代码。利用这一点,设施可以针对从轨迹中的代码地址到二进制上的反向映射建立,一直到其中其属于应用的LLVM中间表示(LLVM IR或“位码”)。尽管ProbeGuard可以识别基本块水平处的违规片段,但是该实施例标记包括探测基元并且将此用于强化的整个父函数,因为该策略简化热补丁并提供更好的安全性。
热补丁
探针分析提供以下信息:(1)在攻击下的特定代码段(探测基元),以及(2)去随机化基元的类型,如由触发反应性强化的异常检测器所指示的。使用这些,ProbeGuard的热补丁器可以选择适当的安全性强化以阻碍使用相同基元的任何进一步的探测尝试。
为了促进热补丁,程序首先使用LLVM编译器通过来变换。目标是能够在运行时间处迅速并高效地利用相同函数的不同(强化)变体替换函数的每个平常变体。在目标应用的LLVM IR中找到的所有函数被克隆并且在编译时间处选择性地调用特定函数克隆上的安全强化插装通过。程序默认执行未插装变体,从而导致好的性能,但是具有代码高速缓存中可用的插装变体的集合以在异常事件需要更好的安全性时在运行时间处立即切换到适当的插装变体。
图5a和5b示意性地示出了替换计算机程序部分的实施例的范例。例如,ProbeGuard可以使用图5a和5b中所描绘的热补丁策略。图5a示出了替换数据435、或开关板数据、以及代码部分401-407。初始地,替换数据435填充有指示代码部分的正常(例如,未强化)版本要被使用的数据。这用数据“0”指示。图5a所示的流程图还示出了多个0以指示初始地每个代码部分以正常形式执行。在某一时刻,在代码部分405中找到易受攻击性。代码部分405可以通过在替换数据435中指示强化版本要被用于代码部分405来替换。这在具有数据“1”的更新替换数据435’中指示。其在流程图中还已经指示强化版本405’要被使用而不是代码部分405。
可以插入在应用中的全局开关板(诸如替换数据435)允许在运行时间处在每个函数变体之间切换。其可以包含用于程序中的每个函数的入口,控制变体中的哪一个以在执行期间使用。在实施例中,应用中的每个函数咨询开关板并且切换到其适当的变体。在实施例中,仅使用两个变体:一个用于平常版本,并且一个用于强化版本;后者利用所有支持的强化技术插装。另一实施例支持更多变体并且利用针对违规基元类型强化的变体补丁每个影响函数。尽管仅使用两个版本是更简单的并且提供更好的存储器利用率和正常执行期间的更好的性能,但是在强化变体执行期间可能更差。
为了阻止针对ProbeGuard的攻击,开关板可以在正常执行期间被标记为只读。给定ProbeGuard避免针对任意隐藏区域的探测攻击,人们也可以依赖于信息隐藏自身以保护根据需要如针对我们的强化技术完成的开关板。
选择性安全强化
已经看到ProbeGuard的实施例中的可能探针检测、探针分析和热补丁,现在描述可以被用于反应性强化的可能插装,优选地,覆盖所有基本探针抑制完整性防御的集合。例如,防御可以包括:限制读取和写入访问,设置数据值上的阈值并且防止目标控制流转移。阻碍探测基元隐含阻止其产生用于去随机化的可用信号。例如,探测基元在热补丁时产生针对任何非法存储器访问的崩溃—无论在映射存储器区还是未映射存储器区内。因此,基元不再保持可用于探测,因为其停止向攻击者提供可感知的信号。针对每个攻击应用的防御的选择可以基于上表中呈现的选项。
任意读取和写入:软件故障隔离(SFI)[50]减轻使用任意读取和写入的探测尝试。其通过利用位掩码屏蔽目标存储器位置插装应用中的每个加载或存储操作。例如,在原型中,在64位虚拟地址空间的可用48位内,确保在目标应用内使用的存储器指针的第47位在将其解除引用之前总是零(仅部署的代码复用防御插装继续访问如其应当的隐藏区域)。因此,通过将隐藏区域限于具有设定的第47位的虚拟地址(隐藏地址空间),攻击者可以不再使用用于探测的SFI插装函数。尽管这失去熵的一位,但是这通过保护剩余位使其安全得多。
内核读取和写入:尽管人们不能在内核自身内选择性地应用SFI,但是人们可以在应用中应用变体以抵抗基于内核的读取和写入。库调用的所有指针参量可以以与针对任意读取和写入的加载和存储被屏蔽相同的方式被屏蔽。这确保攻击者不能执行访问隐藏区域的系统调用。检查考虑可以以其他方式帮助绕过防御的任何大小参量。
任意跳跃:目标控制流完整性(CFI)检查可以减轻任意跳跃基元。CFI将程序限于其控制流转移[8]的已知和预期集合。其最严格形式实际上很少使用,因为其引起大量的性能开销。过去的许多CFI变体已经寻求平衡安全性和性能,但是研究[24]示出通过任何裕度缓和安全性保证使CFI暴露于实际攻击。然而,我们的目标不是防止整个应用免受代码复用攻击(基线防御已经那样做),而是防止攻击者再次使用相同探测基元以揭示隐藏区域。出于该目的,人们可以甚至在没有许多开销的情况下使用甚至最强CFI保护。在我们当前原型中,以下检查被实施以抵销转移控制流的探针。
前向边保护:攻击者可以损坏由特定间接调用指令使用的代码指针用于探测目的。如果某人标记间接调用的每个潜在目标(已经取得其地址的任何函数的地址)并且插装间接调用以验证调用目标具有匹配标签,则人们可以防止该攻击。编译时间处的静态分析可以被用于确定哪些标签是用于每个间接调用的潜在目标。可能目标标签的集合受越多限制,CFI保护变得越好。由于我们的焦点更多在评价选择性强化的总体影响上,类似于IFCC[48]的基于类型的CFI策略在我们的当前原型中实施。然而,在选择性强化情形中,通常在全覆盖处低效的更复杂的策略(例如,依附于在ProbeGuard中可用的全部Intel PT轨迹的背景敏感的CFI[49])也是可行的。
向后边缘保护:备选地,攻击者可以损坏堆栈上的返回地址以转移控制流并且探测应用的地址空间。实施存储返回地址以能够防止这样的控制流转移的每线程影子堆栈。函数入口点静态插装以将返回地址推送到影子堆栈上并且在函数返回点处以检查返回地址仍然与影子堆栈中的返回地址相同。影子堆栈自身通过随机将其放置在隐藏地址空间中使用信息隐藏保护。任何尝试被防止以通过根据需要反应地部署我们的其他防御(例如,SFI)检测其位置。由影子堆栈的目标函数知道保护针对探测足够,因为在没有代码基站中其他地方可检测探测尝试的情况下,攻击者不能影响调用堆栈的未保护部分,特别地用于侦察。
分配数据库:为了减轻旨在通过存储器分配基元执行存储器扫描的探测攻击,阈值被应用在提供存储器分配实用程序的库函数的大小参量上,诸如通过插装其调用位点的函数的分配内存族。但是,应注意到,应用可以在其初始化阶段期间执行非常大的分配。完全不可知的基于阈值的异常检测器将防止甚至这样的非法存储器分配。白名单方案被用于这样的情况,通过大小参量的性质对其进行区分。如果该参量起源于应用中的常量(例如,攻击者不能通过构建控制的值),或甚至如CPI[33]的防御-其初始地为基于影子存储器的元数据管理保留巨大的常量大小的缓冲器,然后其被认为是无害的。
实施方式范例
上表示出了针对ProbeGuard实施例中的模块的SLOC计数。该ProbeGuard实施方式包括:
(1)与应用链接的静态库;其安置在启动时注册的信号处理程序。信号处理程序取决于异常的类型而采取动作,唤起感兴趣信号(例如,SIGSEGV);其还插入在应用定义的信号处理程序注册(例如,sigaction调用)上以保留和连锁启用。最后,其帮助热补丁以支持在运行时间处函数变体之间的切换。
(2)截获检测巨大的分配基元的mmap()样系统调用和导致检测CROP样基元的EFAULT的系统调用的glibc修改。
(3)LLVM编译器传递,以经由DWARF 4.0符号(建立反向映射需要的)和函数克隆将函数识别标记生成并且传播到二进制上以促进热补丁;以及
(4)通过使用libipt[4]获取Intel PT轨迹以通过使用libdwarf[7]读取标记将其映射到二进制上进行探针分析的分离的反应性防御服务器。
注意,使用不同的模块、不同数目的模块、不同的实施语言等,用于实施的许多其他选择是可能的。此外,我们实施了以函数颗粒度选择性地插入SFI、CFI和分配大小检查的用于强化的其他LLVM插装通过。
该表示出了ProbeGuard实施方式中的源代码行(SLOC)的数目,如由SLOCCount报告的。异常检测部件经由常规过程间通信(例如,UNIX域套接字)与反应性防御服务器相互作用。这是请求探针分析并且接收最终操作热补丁的结果。后者通过更新全局开关板以将违规代码段切换到其强化变体来完成。原则上,ProbeGuard的仅二进制实施方式也是可能的。探针分析已经使用基于DWARF 4.0的标记将Intel PT轨迹中的代码位置映射转储到其二进制中的对应部分,其在实施例中甚至扩展到LLVM IR。二进制重写技术可以支持实施函数变体的基于全局开关板的控制。我们选择源水平实施方式,因为我们旨在保护的许多基于信息隐藏的防御也碰巧依赖于基于源代码的分析和变换技术。
我们在具有4.00GHz的4个CPU核心和16GB的DDR4存储器的Intel i7-6700K机器上评价ProbeGuard,运行64位Ubuntu 16.04LTS Linux发布。我们将由ProbeGuard插装的程序与在没有任何插装的情况下的基线相比较。我们使用未插装基线来模拟类似理想的基于信息隐藏的防御的配置(并且因此尽可能高效的)。我们注意,这是现实设置,因为许多基于信息隐藏的防御报告接近于该理想基线的性能图。例如,Safe-stack在所有标准基准[33]中几乎根本不报告任何开销。在实施例中,所有多个基于完整性的防御一起组合为针对程序中的每个函数的单个强化变体。
我们在SPEC CPU2006基准上以及在Nginx网络服务器上评价ProbeGuard,其已经由探测攻击重复作为目标。我们使用ApacheBench[6]以网络服务器为基准,利用10个并发连接发出25000个请求并且每连接10个请求,其足以使服务器饱和。我们的程序、基准和配置的集合反映文献中先前采用的选择。
我们的评价集中于ProbeGuard的五个关键方面:(i)ProbeGuard的性能开销(在正常执行期间程序的ProbeGuard插装版本多么快?),(ii)服务中断(对各自触发轨迹解码和热补丁的重复探测攻击尝试期间的执行的影响是什么?),(iii)ProbeGuard的存储器开销(程序的ProbeGuard插装版本使用多少更多存储器?)(iv)安全性(残余攻击表面是什么?)(v)有效性(ProbeGuard可以停止现有基于探测的漏洞利用?)
性能开销
我们首先在整组SPEC CPU2006基准上评价ProbeGuard在正常(无攻击)执行期间单独添加的开销。这将我们的运行时间部件的开销连同Intel PT分支跟踪一起测量。图6a示出了针对本发明的实施例的SPEC CPU2006的归一化性能开销和若干全覆盖完整性防御。如图6a所示,我们的解决方案的平均(几何平均)是仅1.4%。图6a还示出了当在正常执行—SFI、CFI(前向和向后边缘保护两者)和AllocGuard(分配大小阈值化)期间贯穿应用来应用时的个体完整性防御的归一化性能开销,其中,这样的防御的平均(几何平均)开销分别是22.9%、11.5%和1.3%,以及具有47.9%的开销的所有组合变体,其比解决方案高得多。这是预期的,因为ProbeGuard的基本插装是轻量的,其具有基本上零开销异常检测。残余开销源自Intel PT的分支跟踪活动(其也可以被用于支持其他防御)和归因于更大的函数序言(利用NOP雪橇填充)的稍微更差的指令高速缓存效率。后者开销在包含关键路径(例如,lbm、povray和perlbench)中的非常频繁的函数调用的基准中是更主导的。
另外,我们通过运行Apache基准测量Nginx服务器中的吞吐量降低。服务器的无攻击ProbeGuard插装版本报告针对基线的仅2.4%的降低。这证明ProbeGuard在显著地降低基于全覆盖完整性的方案的开销同时保持大部分其安全性益处方面是有效的。
为了评估开销在理想攻击者定位若干探测基元时如何变化,我们分离地测量Nginx中的每个函数在强化时添加的开销。图6b示出了针对具有从1到1199的函数标识符的Nginx函数的实施例的吞吐量降低。图6b。其示出了频繁执行的函数具有更大的影响并且如我们看到的,最坏情况函数(例如,在关键路径上)具有对吞吐量的36%的影响。
服务中断
为了模拟最坏情况攻击状况,我们还使ProbeGuard插装Nginx服务器经受增加间隔内的重复探测尝试。尽管实际上探测攻击的重流入是非常不可能的,但是给定其将要求发现大量的独特探测基元(各自在不同函数中),这用作依赖于服务器的固有崩溃恢复功能(贯穿其服务器保持暂时冻结)的运行中探测分析和热补丁的应力基准。图6c示出了图示了每秒请求对连续探针之间的以秒为单位的间隔以图示针对不同探测间隔的Nginx上的实施例的吞吐量降低。图6c描绘了针对不同探测间隔的由Nginx网络服务器引起的吞吐量降低。针对10、15、直到25秒的探测间隔,吞吐量降低在60%-78%之间。然而,利用探针之间的更大间隔(即,向前30秒),我们没有看到对吞吐量的可观察的影响。这清楚示出,探针分析和热补丁仅花费几秒并且甚至在侵略性攻击之下(即使这样的攻击速率实际上是不可行的)不不利地影响服务可用性。
存储器开销
我们测量了SPEC CPU2006基准上的ProbeGuard的存储器开销。计算的驻留集大小(RSS)在正常执行期间保持边际(平均1.2%,几何平均)。在Nginx上,在运行相同Apache基准时,我们看到近似350KB的RSS存储器利用率的平均增加,其将包括额外地由开关板占用的恒定大小。这示出ProbeGuard可以现实地应用到具有低开销的现实世界应用。
安全性
我们评价ProbeGuard的针对基于信息隐藏的防御上的一致探测攻击的安全性保证并且然后讨论围绕ProbeGuard的攻击者的潜在策略。
探测攻击遵循攻击和观察(strike-and-observe)模式,通常涉及在泄露受害者应用上的宝贵信息之前的若干尝试。表4描绘了ProbeGuard提供从公共基于信息隐藏的防御提取的多个代表性隐藏区域大小的安全性保证(使用Nginx作为参考)。如所示,这样的大小可以在从单个存储器页面(4KB)的理想情况到几GB的虚拟存储器CPI使用范围内,其中,其熵分别在从34位到14位范围内。注意,我们基于针对1GB驻留集大小(RSS)[34]由作者报告的保守估计计算针对CPI的散列表和查找表(CPI的推荐信息隐藏配置)的熵。
与常规信息隐藏相比较,ProbeGuard牺牲从47位用户可寻址存储器地址空间开始的熵的一位(SFI实施)。这加倍在第一次尝试时利用给定基元定位隐藏区域的概率P(region\#p=1)(除分配基元之外,其中,在任何情况下ProbeGuard抢先停止任何探测尝试)。然而,这样的概率保持极其低(在最坏情况下2-14—CPI的查找表)以安装实际攻击。此外,在第一次尝试之后,常规信息隐藏不施加对攻击者的限制,而ProbeGuard触发停止相同探测基元的任何进一步的使用的反应性强化。攻击者具有的仅有选项是定位不同函数中的任何其他基元以再次尝试探测。例如,攻击者可以使用任意读取或写入基元以跟随指针并且遍历所有有效数据存储器。此后,其可以修改将沿着可以远程调用以探测存储器的任何执行路径(可能在若干不同函数中)解除引用的任何指针。尽管由于这要求发现若干探测基元,这已经是不实际的,但是下层熵指示定位多达大约214=16384个基元,在最好情况下(CPI的查找表),每个基元在不同函数中,以使攻击完全可靠。给定其总计仅包含1199个函数,这通常并且特别地针对Nginx样服务器程序是困难的。甚至在其中攻击者已经发现针对程序中的每个函数的一个基元的理想的非现实场景中,定位隐藏区域的概率P(区域\#p=MAX)仍然不足以安装针对考虑的所有隐藏区域大小的实际攻击。然而,表4示出了隐藏区域大小对由ProbeGuard保证的安全性上限具有巨大影响。
我们现在考虑攻击者可以用于攻击ProbeGuard的其他策略。第一,攻击者可能试图精细制作尚未由ProbeGuard支持的新的未知探测基元。尽管这是可能性,但是ProbeGuard也可扩展以支持新基元的检测。然而,我们不能低估将难以在现有框架中足够支持的新基元的可能性(例如,如果异常检测不能以轻量的低开销方式容易实现)。注意,然而,ProbeGuard当前覆盖针对基本基元的所有集合的支持并且许多新基元可以最终诉诸使用这些现有基元以安装端到端攻击。例如,我们的当前原型不能检测线程喷涂基元[25](尽管我们可以扩展其以这样做)。然而,端到端线程喷涂攻击仍然要求ProbeGuard可以检测和热补丁的任意存储器读取/写入探测基元。
第二,攻击者可能试图定位尽可能多的函数中的基元,不一定揭露隐藏区域,而是故意地使受害者应用减速。尽管这是理论上可能的,但是我们预期现实世界应用中的基元(不同函数中的可用基元)的数目足够限于制止这样的攻击。类似地,人们可以安装表面扩张攻击,例如,如果攻击者获悉我们的反应性强化技术之一具有实施错误,则其可以诱使ProbeGuard热补丁注入应用中的先前不存在的易受攻击性的一些函数。更一般地,攻击者可以以基线防御或我们的基础设施中的实施错误为目标以绕过ProbeGuard。尽管我们不能低估基线防御中的这样的错误的可能性,但是ProbeGuard自身具有大约5000SLOC的相对小的可信计算基(TCB)以使攻击表面最小化。
最终,攻击者可以在没有去随机化并且揭露隐藏敏感数据的情况下围绕代码复用防御。例如,使用任意读取/写入基元,攻击者可以在不接触未映射存储器的情况下保守走过存储器并且避免检测。即使这将这样的探针限于应用的规律非隐藏存储器区域,攻击者也可以选择利用存储器公开以以针对JIT ROP[46]攻击的防御为目标,例如,其建立并且依赖于泄露弹性[10、12、15、17]。我们聚焦于强化针对已经示出平凡绕过甚至高级防御的信息隐藏攻击的任意代码复用防御。我们没有尝试解决这样的防御的其他设计弱点,诸如易受复杂数据驱动攻击[43]攻击的防泄露随机化。
有效性
我们测试了我们的原型的停止针对信息隐藏的所有现有的基于探测的漏洞利用(即,Blind ROP(BROP)[13]、远程任意存储器读取/写入基元[44]、服务器端面向防崩溃编程(CROP)[31]和分配数据库[41])方面的有效性。
为了评价ProbeGuard的停止BROP(任意跳跃)探测攻击的有效性,我们下载并运行BROP漏洞利用[2]。其重复使用nginx 1.4.0(CVE-2013-2028)中的函数ngx_http_parse_chunked中的基于堆栈的缓冲器溢出以损坏返回地址并且在函数返回时转移控制流以基于崩溃或非崩溃信号来探测其地址空间。在没有ProbeGuard的情况下,漏洞利用成功运行。利用ProbeGuard,漏洞利用不再成功;在第一(失败的)基于跳跃的探测尝试处,ProbeGuard检测事件并且反应性强化(仅)具有影子堆栈的违规函数。所有后续控制流转移通过不变地导致崩溃的该函数尝试,阻碍探测基元。
为了评价ProbeGuard是否可以停止CROP(内核存储器读取/写入)探测攻击,我们使用由Kollenda等人[31]描述的攻击。在发送部分HTTP GET请求之前经由ngx_cycle->free_connection定位下一客户端连接,攻击者利用内核存储器写入基元以通过控制连接缓冲器(ngx_buf_t)参数探测所选择的存储器区域。如果所选择的区域既不是映射存储器也不是可写存储器,则recv()系统调用返回EFAULT,迫使服务器关闭连接。否则,如果所选择的存储器是可写的,则服务器成功返回所请求的页面。在没有ProbeGuard的情况下,攻击成功完成。利用ProbeGuard,我们的glibc EFAULT截获器检测异常事件,反应性强化(仅)具有SFI的违规函数。后者通过该函数不加区别地防止所有后续内核存储器写入尝试,这阻碍该探测基元。
为了针对分配数据库攻击评价ProbeGuard,我们下载并且运行Nginx1.9.6上的公开可用的漏洞利用[5](在其上攻击最初测试的版本)。在没有ProbeGuard的情况下,漏洞利用成功去随机化地址空间,揭露敏感存储器区域。在ProbeGuard的情况下,甚至第一探针失败,因为glibc中的我们的拦截器实施分配大小阈值并且触发反应性强化。
为了评价ProbeGuard在停止任意基于存储器读取/写入的探测基元方面的有效性,我们使用公开可用的漏洞利用[1]再现proftpd 1.3.0(CVE-2006-5815)中的sreplace()函数中的基于堆栈的缓冲器溢出易受攻击性。通过控制堆栈上的参量,攻击者可以使用对sstrncpy()的调用以写入到任意存储器位置[27]。在没有ProbeGuard的情况下,攻击可以探测针对映射(可写的)存储器区域的地址空间并且定位敏感目标。在ProbeGuard的情况下,首先对未映射存储器区的这样的写入触发具有SFI的违规函数的反应性强化。这不加区别地防止所有后续任意存储器写入尝试,这阻碍该探测基元。
图8a示出了根据实施例的具有包括计算机程序1020的可写部件1010的计算机可读介质1000,计算机程序1020包括用于使处理器系统执行计算和/或编译方法的指令。计算机程序1020可以根据物理标记或者借助于计算机可读介质1000的磁化被实现在计算机可读介质1000上。然而,任何其他适合的实施例也是可以想象的。此外,将意识到,尽管计算机可读介质1000在此处被示出为光盘,但是计算机可读介质1000可以是任何适合的计算机可读介质(诸如硬盘、固态存储器、闪存等),并且可以是非可记录或可记录的。计算机程序1020包括用于使得处理器系统执行所述计算和/或编译方法的指令。
图8b图示了根据实施例的用于实现设备的示范性硬件图1100。如所示,设备1100包括经由一个或多个系统总线1110互连的处理器1120、存储器1130、用户接口1140、通信接口1150和存储设备1160。将理解,在一些方面中该图构成抽象并且设备1100的部件的实际组织可以是比所图示的更复杂的。
处理器1120可以是能够运行存储在存储器1130或存储设备1160中的指令或以其他方式处理数据的任何硬件设备。这样一来,处理器可以包括微处理器、现场可编程门阵列(FPGA)、专用集成电路(ASIC)或者其他类似设备。例如,处理器可以是Inter Core i7处理器、ARM Cortex-R8等。在实施例中,处理器可以是ARM Cortex M0。
存储器1130可以包括各种存储器,诸如例如L1、L2或L3高速缓存或系统存储器。这样一来,存储器1130可以包括静态随机存取存储器(SRAM)、动态RAM(DRAM)、闪存、只读存储器(ROM)或者其他类似存储器设备。将显而易见的是,在处理器包括以硬件实现本文所描述的功能中的一个或多个的一个或多个ASIC(或其他处理设备)的实施例中,可以省略被描述为对应于其他实施例中的这样的功能的软件。
用户接口1140可以包括用于使能与用户(诸如管理员)通信的一个或多个设备。例如,用户接口1140可以包括显示器、鼠标和用于接收用户命令的键盘。在一些实施例中,用户接口1140可以包括可以经由通信接口1150呈现给远程终端的命令行接口或者图形用户接口。
通信接口1150可以包括用于使能与其他硬件设备通信的一个或多个设备。例如,通信接口1150可以包括被配置为根据以太网协议通信的网络接口卡(NIC)。例如,通信接口1150可以包括天线、连接器或两者等。此外,通信接口1150可以实现用于根据TCP/IP协议通信的TCP/IP栈。对于通信接口1150的各种备选或者额外硬件或者配置将是显而易见的。
存储设备1160可以包括一个或多个机器可读存储介质,诸如只读存储器(ROM)、随机存取存储器(RAM)、磁盘存储介质、光学存储介质、闪存设备或者类似存储介质。在各种实施例中,存储设备1160可以存储用于由处理器1120运行的指令或者处理器1120可以操作的数据。例如,存储设备1160可以存储用于控制硬件1100的各种基本操作的基本操作系统1161。例如,存储设备可以存储用于检测地址探测的指令1162,定位地址探测起源于的计算机程序代码部分,并且利用替换计算机程序代码部分选择性地替换所述起源计算机程序代码部分。例如,存储设备可以存储用于在有和没有地址探测对策的情况下编译计算机程序的指令,并且包括检测和替换计算机程序代码中的代码。
将显而易见的是,被描述为被存储在存储设备1160中的各种信息可以额外地或者备选地存储在存储器1130中。在该方面中,存储器1130还可以被认为是构成“存储设备”并且存储设备1160可以被认为是“存储器”。各种其他布置将是显而易见的。另外,存储器1130和存储设备1160可以被认为是“非瞬态机器可读介质”。如本文所使用的,术语“非瞬态”将被理解为排除瞬态信号但是包括所有形式的存储设备,包括易失性存储器和非易失性存储器两者。
尽管设备1100被示出为包括每个所描述的部件之一,但是在各种实施例中,可以复制各种部件。例如,处理器1120可以包括多个微处理器,其被配置为独立地执行本文所描述的方法或者被配置为执行本文所描述的方法的步骤或子例程,使得多个处理器协作来实现本文所描述的功能。另外,在设备1100被实现在云计算系统中的情况下,各种硬件部件可以属于不同的物理系统。例如,处理器1120可以包括第一服务器中的第一处理器和第二服务器中的第二处理器。
应当注意,上文所提到实施例图示而不是限制本发明,并且本领域的技术人员将能够设计许多备选实施例。
在权利要求中,被放置在圆括号之间的任何附图标记不应当被解释为对权利要求的限制。动词“包括”和其词形变化的使用不排除除权利要求中陈述的那些外的元件或步骤的存在。在元件前面的量词“一”或“一个”不排除多个这样的元件的存在。当在元件的列表前面时诸如“……中的至少一个”的表达表示来自列表的元件的全部或任何子集的选择。例如,表达“A、B、和C中的至少一个”应当被理解为包括仅A、仅B、仅C、A和B两者、A和C两者、B和C两者、或全部A、B、和C。本发明可以借助于包括若干不同的元件的硬件并且借助于适合地编程的计算机来实现。在列举了若干模块的设备权利要求中,可以通过硬件的同一项实现这些模块中的若干模块。尽管在互不相同的从属权利要求中记载了特定措施,但是这并不指示不能有利地使用这些措施的组合。
在权利要求中,圆括号中的附图标记指代例证实施例的附图或者实施例的公式中的附图标记,因此增加权利要求的可理解性。这些附图标记不应当被解释为限制权利要求。

Claims (19)

1.一种计算设备(100),被配置用于对防止地址探测的计算机程序的执行,其中,
地址探测被定义为对多个地址探针的执行,
其中,地址探针被定义为初步攻击,所述初步攻击被配置为:
获得代码部分和/或数据部分的地址,
所述设备包括:
-存储器(110),其存储计算机程序代码(120)和计算机程序数据(115),所述计算机程序代码包括多个计算机程序代码部分(120、121、122、123)并且被配置为在所述计算机程序数据上操作,所述计算机程序代码和/或所述计算机程序数据的地址已经在地址空间中随机化,
-处理器,其被配置为:
-执行所述随机化地址空间内的所述计算机程序代码,
-通过运行用于检测所述计算机程序上的地址探测的至少一个异常检测器(140)来监测对所述计算机程序代码的所述执行,
-在检测到所述地址探测的情况下在所述多个计算机程序代码部分中定位所述地址探测起源于的起源计算机程序代码部分,
-利用替换计算机程序代码部分来选择性地替换所述起源计算机程序代码部分,所述替换计算机程序代码部分通过将地址探测对策添加到所述起源计算机程序代码部分来获得;
其中,所添加的对策被配置用于以下各项中的一项或多项:
-在所述替换计算机程序代码部分中验证存储器负载和存储操作,并且
-在所述替换计算机程序代码部分中在转移控制流之前验证堆栈上的返回地址。
2.根据权利要求1所述的计算设备,其中,所述异常检测器被嵌入在所述计算机程序代码中。
3.根据前述权利要求中的任一项所述的计算设备,其中,所述异常检测器被配置用于进行以下各项中的一项或多项:
-检测对无效地址的读取或写入操作,
-截获系统调用并且检查针对一个或多个特定错误的截获系统调用的返回值,
-检测来自不可执行存储器的尝试执行,
-检测非法指令的尝试执行,
-截获被布置为分配存储器的系统调用,检查分配大小,并且确定所述分配大小是否高于阈值。
4.根据权利要求1或2所述的计算设备,其中,所述多个计算机程序代码部分对应于所述计算机程序代码的基本块和/或函数。
5.根据权利要求1或2所述的计算设备,其中,定位所述地址探测起源于的所述计算机程序代码部分包括:
-检索所述计算机程序执行的轨迹,所述轨迹包括所述地址空间中的地址,
-确定对应于所述计算机程序代码的所述轨迹中的最新地址,
-确定对应于所述最新地址的所述计算机程序代码。
6.根据权利要求5所述的计算设备,其中,对应于所述计算机程序代码的所述轨迹中的所述最新地址是不在系统库代码或内核代码中的最新地址。
7.根据权利要求1或2所述的计算设备,其中,选择性地替换所述起源计算机程序代码部分包括对所述计算机程序代码进行热补丁。
8.根据权利要求1或2所述的计算设备,其中,所述计算机程序代码包括针对所述多个计算机程序代码部分的多个替换计算机程序代码部分,替换计算机程序代码部分不被执行,直到所述替换计算机程序代码替换所述起源计算机程序代码部分。
9.根据权利要求1或2所述的计算设备,其中,所述处理器被配置为将所述地址探测对策添加到源代码部分,所述源代码部分对应于所述起源计算机程序代码部分,并且在检测到所述地址探测之后利用所添加的对策来编译所述源代码部分,因此获得所述替换计算机程序代码部分。
10.根据权利要求1或2所述的计算设备,其中,所述计算机程序代码包括开关板数据,所述开关板数据用于从所述起源计算机程序代码部分切换到所述替换计算机程序代码部分,其中,
-所述开关板数据针对所述多个计算机程序代码部分控制所述替换计算机程序代码部分是否要被使用,所述多个计算机程序代码部分被配置为通过所述开关板数据验证所述计算机程序代码部分是否被替换,并且如果这样的话,则将控制切换到所述替换计算机程序部分。
11.根据权利要求1或2所述的计算设备,其中,所添加的对策还被配置用于在所述替换计算机程序代码部分中限制存储器分配操作。
12.根据权利要求1或2所述的计算设备,其中,额外对策被配置为产生计算机程序崩溃或者针对对映射存储器区和未映射存储器区的非法存储器访问两者重新启动。
13.根据权利要求1或2所述的计算设备,其中,所述计算机程序代码包括恢复代码,所述处理器被配置为在所述选择性替换之后将控制流转移到所述恢复代码以恢复所述计算机程序的操作。
14.根据权利要求1或2所述的计算设备,其中,多个替换代码部分被布置为替换起源计算机程序代码部分,所述多个替换代码部分包括不同地址探测对策,所述替换代码部分是根据由所述异常检测器检测的地址探测的类型从所述多个替换代码部分中选择的。
15.根据权利要求1或2所述的计算设备,其中,所述异常检测器包括与所述计算机程序链接的静态库,所述静态库包括信号处理程序,所述信号处理程序被配置为在所述计算机程序的启动处注册。
16.一种用于编译源代码以获得防止地址探测的计算机程序的编译器设备,其中,
地址探测被定义为对多个地址探针的执行,
其中,地址探针被定义为初步攻击,所述初步攻击被配置为:
获得代码部分和/或数据部分的地址,
所述编译器设备包括:
-通信接口,其被配置为接收所述源代码,
-处理器,其被配置为:
-编译所述源代码以获得计算机程序代码,所述计算机程序代码包括对应于多个源代码部分的多个计算机程序代码部分,所述计算机程序代码被布置用于随机化地址空间中的执行,
-利用添加的地址探测对策来编译所述多个源代码部分,因此获得多个替换计算机程序代码部分,
-在所述计算机程序代码中包括被配置用于检测执行期间的所述计算机程序上的地址探测的至少一个异常检测器,
-在所述计算机程序代码中包括切换代码,所述切换代码被配置为:
-在检测到所述地址探测的情况下定位所述地址探测起源于的所述计算机程序代码部分,并且
-利用对应的替换计算机程序代码部分选择性地替换所述起源计算机程序代码部分;
其中,所添加的对策被配置用于进行以下各项中的一项或多项:
-在所述替换计算机程序代码部分中验证存储器负载和存储操作,并且
-在所述替换计算机程序代码部分中在转移控制流之前验证堆栈上的返回地址。
17.一种被配置用于对防止地址探测的计算机程序的执行的计算方法(600),其中,
地址探测被定义为对多个地址探针的执行,
其中,地址探针被定义为初步攻击,所述初步攻击被配置为:
获得代码部分和/或数据部分的地址,
所述方法包括:
-存储(610)计算机程序代码(120)和计算机程序数据(115),所述计算机程序代码包括多个计算机程序代码部分(120、121、122、123)并且被配置为在所述计算机程序数据上操作,所述计算机程序代码和/或所述计算机程序数据的地址已经在地址空间中随机化,
-执行(620)所述随机化地址空间内的所述计算机程序代码,
-通过运行用于检测所述计算机程序上的地址探测的至少一个异常检测器(140)来监测(630)对所述计算机程序代码的所述执行,
-在检测到(640)所述地址探测的情况下定位(642)所述多个计算机程序代码部分中所述地址探测起源于的起源计算机程序代码部分,
-利用替换计算机程序代码部分来选择性地替换(644)所述起源计算机程序代码部分,所述替换计算机程序代码部分通过将地址探测对策添加到所述起源计算机程序代码部分来获得;
其中,所添加的对策被配置用于进行以下各项中的一项或多项:
-在所述替换计算机程序代码部分中验证存储器负载和存储操作,并且
-在所述替换计算机程序代码部分中转移控制流之前验证堆栈上的返回地址。
18.一种用于编译源代码以获得防止地址探测的计算机程序的编译方法(650),其中,
地址探测被定义为对多个地址探针的执行,
其中,地址探针被定义为初步攻击,所述初步攻击被配置为:
获得代码部分和/或数据部分的地址,
所述编译方法包括:
-编译(660)所述源代码以获得计算机程序代码,所述计算机程序代码包括对应于多个源代码部分的多个计算机程序代码部分,所述计算机程序代码被布置用于随机化地址空间中的执行,
-利用添加的地址探测对策来编译(670)所述多个源代码部分,因此获得多个替换计算机程序代码部分,
-在所述计算机程序代码中包括(680)被配置用于检测执行期间的所述计算机程序上的地址探测的至少一个异常检测器,
-在所述计算机程序代码中包括(690)切换代码,所述切换代码被配置为:
-在检测到所述地址探测的情况下定位所述地址探测起源于的计算机程序代码部分,并且
-利用对应的替换计算机程序代码部分选择性地替换所述起源计算机程序代码部分,
其中,所添加的对策被配置用于以下各项中的一项或多项:
-在所述替换计算机程序代码部分中验证存储器负载和存储操作,并且
-在所述替换计算机程序代码部分中在转移控制流之前验证堆栈上的返回地址。
19.一种瞬态或非瞬态计算机可读介质(1000),包括表示指令的数据(1020),所述指令用于使处理器系统执行根据权利要求17或18所述的方法。
CN201980091495.4A 2018-12-07 2019-12-02 具有针对地址探测的增加的阻力的计算设备 Active CN113412483B (zh)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
EP18211144.3 2018-12-07
EP18211144 2018-12-07
EP18211711.9 2018-12-11
EP18211711.9A EP3667531A1 (en) 2018-12-11 2018-12-11 A computing device with increased resistance against address probing
PCT/EP2019/083235 WO2020114937A1 (en) 2018-12-07 2019-12-02 A computing device with increased resistance against address probing

Publications (2)

Publication Number Publication Date
CN113412483A CN113412483A (zh) 2021-09-17
CN113412483B true CN113412483B (zh) 2024-05-14

Family

ID=68655558

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201980091495.4A Active CN113412483B (zh) 2018-12-07 2019-12-02 具有针对地址探测的增加的阻力的计算设备

Country Status (4)

Country Link
US (1) US11853413B2 (zh)
EP (1) EP3891634A1 (zh)
CN (1) CN113412483B (zh)
WO (1) WO2020114937A1 (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11921849B2 (en) * 2020-02-20 2024-03-05 The George Washington University Reuse-trap: re-purposing cache reuse distance to defend against side channel leakage
KR102514257B1 (ko) * 2021-02-19 2023-03-29 한국전자통신연구원 제어 흐름 무결성 위반 탐지 장치 및 방법
CN113673002B (zh) * 2021-08-09 2023-05-16 中国科学院软件研究所 一种基于指针加密机制和risc-v协处理器的内存溢出防御方法
CN116028338A (zh) * 2021-10-26 2023-04-28 上海华为技术有限公司 一种不友好访存检测方法及相关设备
CN114780323A (zh) * 2022-06-17 2022-07-22 新华三信息技术有限公司 一种服务器中内存的故障检测方法、装置及设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101542441A (zh) * 2006-11-22 2009-09-23 可递有限公司 多处理器计算系统中的存储器一致性保护
CN105612525A (zh) * 2013-08-12 2016-05-25 思科技术公司 针对应用安全性的二进制转换和随机化系统
US9754112B1 (en) * 2014-11-24 2017-09-05 Bluerisc, Inc. Detection and healing of vulnerabilities in computer code
CN108712522A (zh) * 2018-07-20 2018-10-26 新华三技术有限公司 Ip地址分配方法和装置

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7386886B1 (en) * 2000-11-08 2008-06-10 International Business Machines Corporation System and method for prevention of buffer overflow intrusions
CA2372034A1 (en) * 2002-02-14 2003-08-14 Cloakware Corporation Foiling buffer-overflow and alien-code attacks by encoding
FR2857473B1 (fr) * 2003-07-11 2005-09-16 Oberthur Card Syst Sa Procede de securisation de l'execution d'un programme informatique, notamment dans une carte a microcircuit
US8302210B2 (en) * 2009-08-24 2012-10-30 Apple Inc. System and method for call path enforcement
US8601584B1 (en) * 2011-09-21 2013-12-03 Trend Micro Incorporated Protection of computers against argument switch attacks
US9734333B2 (en) * 2012-04-17 2017-08-15 Heat Software Usa Inc. Information security techniques including detection, interdiction and/or mitigation of memory injection attacks
EP3195178B1 (en) * 2014-07-23 2019-02-20 GrammaTech, Inc. Systems and/or methods for automatically protecting against memory corruption vulnerabilities
US10311227B2 (en) 2014-09-30 2019-06-04 Apple Inc. Obfuscation of an address space layout randomization mapping in a data processing system
US9576138B1 (en) 2015-09-30 2017-02-21 International Business Machines Corporation Mitigating ROP attacks
US10628589B2 (en) 2016-01-22 2020-04-21 The University Of North Carolina At Chapel Hill Methods, systems, and computer readable media for preventing code reuse attacks
US10310991B2 (en) * 2016-08-11 2019-06-04 Massachusetts Institute Of Technology Timely address space randomization

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101542441A (zh) * 2006-11-22 2009-09-23 可递有限公司 多处理器计算系统中的存储器一致性保护
CN105612525A (zh) * 2013-08-12 2016-05-25 思科技术公司 针对应用安全性的二进制转换和随机化系统
US9754112B1 (en) * 2014-11-24 2017-09-05 Bluerisc, Inc. Detection and healing of vulnerabilities in computer code
CN108712522A (zh) * 2018-07-20 2018-10-26 新华三技术有限公司 Ip地址分配方法和装置

Also Published As

Publication number Publication date
CN113412483A (zh) 2021-09-17
EP3891634A1 (en) 2021-10-13
US11853413B2 (en) 2023-12-26
WO2020114937A1 (en) 2020-06-11
US20220027461A1 (en) 2022-01-27

Similar Documents

Publication Publication Date Title
CN113412483B (zh) 具有针对地址探测的增加的阻力的计算设备
Sun et al. OAT: Attesting operation integrity of embedded devices
Davi et al. PT-Rand: Practical Mitigation of Data-only Attacks against Page Tables.
Ward et al. Survey of cyber moving targets second edition
EP3667531A1 (en) A computing device with increased resistance against address probing
Kong et al. Improving software security via runtime instruction-level taint checking
Yoo et al. {In-Kernel}{Control-Flow} integrity on commodity {OSes} using {ARM} pointer authentication
Park et al. Nojitsu: Locking down javascript engines
Rajasekaran et al. CoDaRR: Continuous data space randomization against data-only attacks
Yim The rowhammer attack injection methodology
Bhat et al. Probeguard: Mitigating probing attacks through reactive program transformations
Kollenda et al. Towards automated discovery of crash-resistant primitives in binary executables
Zhang et al. Recfa: Resilient control-flow attestation
Cheng et al. Exploitation techniques for data-oriented attacks with existing and potential defense approaches
Canella et al. SFIP: Coarse-Grained Syscall-Flow-Integrity Protection in Modern Systems
Lou et al. Understanding Rowhammer attacks through the lens of a unified reference framework
Liu et al. Binary exploitation in industrial control systems: Past, present and future
Van Acker et al. ValueGuard: Protection of native applications against data-only buffer overflows
Moon et al. Architectural supports to protect OS kernels from code-injection attacks and their applications
Salamat Multi-Variant Execution: Run-Time Defense against Malicious Code Injection Attacks DISSERTATION
Brohet et al. A Survey on Thwarting Memory Corruption in RISC-V
González Taxi: Defeating code reuse attacks with tagged memory
Bhat et al. VU Research Portal
Fingeret Defeating code reuse attacks with minimal tagged architecture
Dautenhahn Protection in commodity monolithic operating systems

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