ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《SoK: Eternal War in Memory》笔记

2021-07-02 18:01:16  阅读:399  来源: 互联网

标签:导致 代码 Eternal War 越界 内存 攻击者 SoK 指针


简介

该文针对Memory Corruption系统分析。主要贡献包括:

  1. 针对Memory Corruption攻击构建通用模型,基于模型定义了多种可实施的安全策略。
  2. 对比安全策略设计及漏洞利用各阶段特征,发现部分攻击向量未被现有防御机制保护。
  3. 从性能、兼容性和鲁棒性评估及比较现有防御方案。
  4. 讨论现有防御方案的缺点、未被实际应用的原因,讨论未来新防御方案设计所需满足的要求。

攻击模型(看图说话)

在这里插入图片描述

Memory Safety Corruption(①、②)

Invalid(out-of-bounds、dangling)指针(① )被解引用(读写)(②)导致内存安全破坏(数据破坏、信息泄露),内存安全破坏是各类攻击的根源。

解引用越界指针构成Spatial Error,解引用Dangling指针构成Temporal Error。

依据C/C++标准,越界写数组、解引用Null指针和读取未初始化变量导致未定义的行为。边界检查和内存管理需开发者自行维护。(译注:现有Sanitizer会从边界和内存操作进行检查)

Invalid指针成因(①)

指针越界源于数据指针被修改(③ → \rightarrow →①):

  • 未对allocation failure检查使得null pointer被使用
  • 数组指针递增递减导致buffer overflow/underflow
  • indexing bugs(常由integer overflow、truncation or signedness bug或incorrect pointer casting触发)。

Dangling指针源于:

  • 异常处理句柄中释放了指针但未对此重新初始化
  • 函数返回并且全局指针指向该函数内的局部变量

Invalid指针解引用后果(②)

后果包括内存破坏(代码数据被破坏)和信息泄露。

越界指针解引用(读、写)导致Spatial Error

使用指针从越界/攻击者控制区域读取内容,导致Value Corruption,例如:

  • 未检查从攻击者指定变量读取的值,导致Data Corruption(进而可能导致控制流劫持)
  • 攻击者指定读指针内容被输出,构成信息泄露

使用指针写内容到越界/攻击者控制区域,导致内存覆写,例如:

  • 缓冲区溢出覆写数组指针使其越界,指针越界导致虚表破坏,被篡改的虚表解引用导致控制流劫持
  • Free攻击者控制的指针导致任意地址写
  • 使用越界指针写操作导致信息泄露

Dangling指针解引用(读、写)导致Temporal Error

使用dangling指针读(dangling指针所指新旧对象不匹配),导致攻击者非法访问内存,例如:

  • 当旧对象dangling指针指向新对象(与dangling指针所指内容被修改略有不同),旧对象虚函数被调用时,会查询虚函数,使用新对象值,导致虚函数corruption。此处temporal read error与spatial write error一样导致vtable破坏。
  • 此外,新对象内容在读取旧对象dangling指针操作时泄露。

使用dangling指针写,如越界指针一样破坏新对象中的指针或数据,例如:

  • Dangling指针指向局部变量或栈,对其写操作可能导致(后续新栈帧)返回地址等敏感数据覆写
  • Double-free是use-after-free的特例,它的use操作是free,dangling指针free时,将所指新对象误解为堆的元数据并被free,导致任意地址写

Code corruption attack

内存安全破坏(①、②)能直接修改内存代码(③)为攻击者指定代码内容(④),执行此会导致code corruption attack。

代码完整性保护(③)旨在保护代码免于修改。但自修改代码和JIT场景等难以使用代码完整性保护进行完全保护。Instruction Set Randomization(ISR,指令集随机化,使用攻击者未知的密钥异或加密指令,攻击者伪造的代码无法被成功解密并被执行)(④)使攻击者代码无法被正确执行。

Control-flow hijack attack

内存安全破坏(①、②)能修改代码指针(③)指向(恶意的)shellcode/gadgets(④),并让跳转指令目标为被篡改的代码指针(⑤),成功执行shellcode/gadgets(⑥),从而成功劫持控制流。

代码指针完整性保护旨在保护代码指针不被破坏(③)。地址空间随机化技术让攻击者难以将代码指针指向shellcode/gadgets(④)。控制流完整性保护旨在检测间接跳转处的corruption(⑤)。Non-executable Data(不可执行数据,W⊕X,程序内容要么可写,要么可执行)和指令集随机化拒绝shellcode/gadgets被执行(⑥)。

但是Jump Oriented Programming(包括return oriented programming和return-to-libc)能够绕过W⊕X和ISR的保护(⑥),使用程序自身存在的代码构建代码链并展开攻击。

此外若要让攻击更具意义,攻击者通常需要进行系统调用、提权(例如文件访问)等。权限、强制访问控制、沙箱策略(SFI、 XFI、Native Client)能限制攻击者所攻陷程序的能力,但本文所关注的是如何保护程序不被攻陷。

Data-only attack

内存安全破坏(①、②)能篡改安全关键数据变量(包括代码、代码指针)(安全关键是语义定义,实则需要保护所有变量完整性)(③),让数据修改为攻击者指定值(④),当该数据被使用时(⑤),data-only attack成功。

数据完整性(包括代码、代码指针完整性保护)保护旨在保护数据不被篡改(③),数据空间随机化(包括地址空间随机化)对数据引入额外的熵值,使攻击者无法使用指定数据(无法正确验证)(④),数据流完整性保护(包括控制流完整性保护)检测数据流是否被破坏。

Information leak

内存安全破坏(①、②)能输出(③)攻击者指定的内存数据(④)。

信息泄露能被用来绕过ASLR等概率性防御技术。

全面的数据空间随机化旨在防止攻击者成功地将数据泄露(④)。

标签:导致,代码,Eternal,War,越界,内存,攻击者,SoK,指针
来源: https://blog.csdn.net/clh14281055/article/details/118371647

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有