gcc CFI控制流完整性保护

一、CFI简介

GCC的CFI(Control Flow Integrity,控制流完整性)机制是一种用于防止针对函数指针和虚函数表的攻击的保护机制。它通过在编译时对程序进行加固,限制了程序中可能的跳转目标,以提高程序运行时的安全性。下面将全面深入介绍GCC CFI机制的工作原理和实现方式:

1. 工作原理:

   - 插入检查:GCC CFI机制通过在源代码的函数调用和间接跳转处插入检查来实现控制流完整性。这些检查用于验证函数指针和虚函数表的正确性,确保它们只会指向预期的目标函数。

   - 检查目标函数:GCC CFI对所有间接函数调用进行检查,以确保调用的目标函数是有效的。这意味着每次进行间接函数调用时,都会执行一些额外的代码来验证目标函数的有效性。

   - 限制跳转目标:GCC CFI限制了函数指针和虚函数表可以跳转的目标范围。每个函数指针和虚函数表都会被分配一个唯一的ID,跳转目标只能是具有相应ID的函数。

2. 实现方式:

   - 基于Type Metadata:GCC CFI利用类型元数据来实现控制流完整性。在编译过程中,它会生成类型元数据并将其嵌入到生成的可执行文件中。类型元数据包含函数指针和虚函数表的类型信息,包括函数签名和返回类型等。在运行时,通过对比函数指针和虚函数表中的类型元数据,可以验证它们指向的目标是否是正确的。

   - 插入检查:GCC CFI插入了一些额外的代码来进行控制流完整性的检查。在函数调用和间接跳转的代码中,会插入检查代码,用于验证目标函数的有效性。如果目标函数无效,将触发一个安全异常并采取相应的防护措施。

   - 在链接时优化(Link-Time Optimization,LTO)下使用:GCC CFI需要在链接时优化(LTO)模式下使用,以便在整个程序的编译过程中进行全局优化和分析。在这种模式下,所有的源代码文件将被链接在一起,从而可以进行全局的控制流完整性检查和加固。

   - 引入安全指示符(Safe Indirections):GCC CFI引入了安全指示符来标记受到控制流完整性保护的指针。这些指针通过安全指示符与函数类型元数据进行关联,并使用指针警戒(Pointer Guards)来防止指针被篡改。

3. 优点和局限性:

   - 优点:GCC CFI提供了一种有效的方式来保护程序中的函数指针和虚函数表免受恶意攻击。它可以防止对程序的控制流进行篡改,从而提高程序的安全性。由于在编译时进行加固,它不依赖于运行时的额外开销,并且可应用于现有的软件代码。

   - 局限性:GCC CFI虽然提供了一些保护措施,但仍然无法解决所有的攻击场景。某些高级攻击技术,如ROP(Return-Oriented Programming)和JOP(Jump-Oriented Programming)可能会绕过控制流完整性保护。另外,GCC CFI可能会带来一定的性能开销,特别是在具有大量间接函数调用的程序中。

总的来说,GCC的CFI机制是一种很有潜力的控制流完整性保护机制,可以提高程序的抗攻击能力。然而,它仍然需要结合其他安全措施来全面提高系统的防护能力。

二、开启方式

要开启GCC的CFI(Control Flow Integrity)机制,需要使用特定的编译选项来确保在编译过程中应用CFI保护。下面是一些启用GCC CFI机制的步骤:

1. 确保使用支持CFI特性的GCC版本:GCC的CFI机制要求使用GCC 8版本或以上版本。如果您的GCC版本过低,建议升级到支持CFI的最新版本。

2. 在编译代码时启用CFI选项:在编译命令中添加适当的选项来启用CFI机制。

   - 对于单个源文件:可以使用以下选项启用CFI机制:`-flto -fvisibility=hidden -fsanitize=cfi`

   - 对于使用了动态链接库(DLL)或共享对象(SO)的程序:需要在链接时进行CFI检查。可以使用以下选项:`-flto -fvisibility=hidden -fsanitize=cfi -fvisibility-inlines-hidden`

3. 进行链接时优化(Link-Time Optimization):为了使CFI特性全部生效,建议使用链接时优化(LTO)。可以在编译选项中添加`-flto`选项来启用链接时优化。

4. 编译和链接其他源文件和库:如果您的程序涉及多个源文件或使用了外部库,需要确保所有的代码都启用了CFI机制,并且通过`-flto`选项进行链接时优化。

5. 编译并运行程序:使用上述选项重新编译和链接程序,并运行生成的可执行文件。在程序执行过程中,CFI机制将对函数指针和虚函数表进行检查,以保护程序免受针对这些目标的恶意攻击。

请注意,启用CFI机制可能会对程序的性能产生一定影响,因为额外的检查代码会引入一些运行时开销。因此,在进行性能敏感的应用程序时,需要对安全性和性能做出权衡。

三、支持版本

GCC的控制流完整性保护功能在不同版本中有所差异。下面是一些主要版本中的控制流完整性保护支持情况:

1. GCC 4.9版本及以后:GCC 4.9引入了控制流完整性保护功能。该版本中引入了选项`-fcf-protection`,用于开启控制流完整性保护。默认情况下,该选项为`none`,需要手动设置为`branch`或`full`来启用相应级别的控制流完整性保护。`branch`级别提供轻量级的保护,`full`级别提供更强的保护,但可能会导致应用程序的性能下降。

2. GCC 8版本及以后:GCC 8版本引入了CFI(Control Flow Integrity)特性,该特性为程序提供了更强大的控制流完整性保护。CFI可以检测和拦截针对函数指针和虚函数表的恶意攻击。使用选项`-flto`(链接时优化)和`-fvisibility=hidden`(隐藏符号)来启用CFI。此外,还可以使用选项`-fsanitize=cfi`来开启CFI的运行时检查。

请注意,控制流完整性保护的功能支持取决于具体版本的GCC和编译器的配置选项。建议使用最新版本的GCC,并仔细查阅相关文档以了解具体版本的支持情况和使用方法。

四、潜在风险

开启GCC的CFI(Control Flow Integrity)机制可以提高程序的安全性,但也存在一些潜在的风险需要注意。以下是一些可能的风险和注意事项:

1. 兼容性问题:某些代码可能与CFI机制不兼容,可能导致编译错误或运行时异常。这些问题可能需要进行代码修改或调整编译选项来解决。

2. 性能开销:CFI机制可能会引入一定的性能开销,尤其是在对函数调用进行完整性检查的情况下。这可能导致程序运行速度略有下降。因此,在性能敏感的应用程序中需要在安全性和性能之间权衡。

3. 外部库和函数的依赖:CFI机制可能无法保护通过外部库或函数调用的代码。如果这些库或函数存在漏洞或被攻击,可能会绕过CFI机制,从而对整个系统的安全性构成威胁。因此,除了开启CFI机制外,还需要综合考虑整个系统的安全性措施。

4. 增加开发和调试复杂性:CFI机制的引入可能增加了代码的复杂性,包括类型和跳转目标的限制。这可能增加了开发和调试的难度,并对相关的工具和流程造成影响。

5. 误报和漏报:虽然CFI机制可以提供较高的控制流完整性保护,但仍可能存在一些误报和漏报的情况。误报是指合法的控制流被错误地拦截,而漏报是指恶意控制流没有被检测到。这些情况需要综合考虑并进行调查和解决。

综上所述,开启GCC的CFI机制可以提高程序的安全性,但开发者需要仔细权衡使用CFI的风险和利益,并确保进行适当的测试和验证,以确保应用程序的稳定性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebGL笔记:矩阵缩放的数学原理和实现

矩阵缩放的数学原理 和平移一样,以同样的原理,也可以理解缩放矩阵让向量OA基于原点进行缩放 x方向上缩放:sxy方向上缩放:syz方向上缩放:sz 最终得到向量OB 矩阵缩放的应用 比如我要让顶点在x轴向缩放2,y轴…

1.1、Autosar_CP软件集群设计与集成指南说明

目录 前言 1、介绍 1.1、目标 1.2、范围 2、缩略语 3、相关文档

SpringBoot整合Druid数据库连接池

1. 引入依赖 <!-- 阿里数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency><!-- Mysql驱动包 --><depen…

python爬虫AES魔改案例:某音乐素材下载网

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly93d3cuYWlnZWkuY29tL3NvdW5kL2NsYXNzLw’) 拿到网址&#xff0c;F12打开调…

html动漫网页设计分享 紫罗兰永恒花园网页作业成品带视频,注册登录,表格,表单

html5静态网页设计要是用HTML DIVCSS JS等来完成页面的排版设计,一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点&#xff0c;学生网页作业源码可以…

数据挖掘实战-基于word2vec的短文本情感分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

鸿蒙基础入门与高频知识点梳理

介绍鸿蒙高频知识点&#xff0c;持续更新中 一、鸿蒙代码结构 ├──entry/src/main/ets // 代码区 │ ├──common │ │ └──Constant.ets // 常量类 │ ├──entryability │ │ └──EntryAbility.ts // 程序入口类 │ ├──p…

solidity案例详解(五)能源电力竞拍合约

使用智能合约对电力公司和用户拍拍进行一个管理与上链&#xff0c;确保安全性&#xff0c;合约完整代码私信或加裙851453227 a)现有系统架构和功能&#xff0c;服务提供方是谁&#xff0c;用户是谁&#xff1b; 系统架构&#xff1a; 电力拍卖系统&#xff0c;由能源公司部署。…

【算法】单调队列 滑动窗口最大值

文章目录 例题——239. 滑动窗口最大值相关练习1438. 绝对差不超过限制的最长连续子数组解法1——两个单调队列分别维护最大值和最小值解法2——有序集合TreeMap 2398. 预算内的最多机器人数目解法1——二分答案 单调队列解法2——双指针 单调队列 &#xff08;不固定大小的滑…

并发编程1:线程的基本概念

一、进程、线程、用户线程&原生线程、优先级、守护线程 什么是进程 是程序一次执行的过程&#xff0c;是系统运行程序的基本单位。系统运行一次程序&#xff0c;就是一个进程从创建到关闭的过程。Java 项目从 main 方法启动&#xff0c;就是启动了一个 JVM 进程&#xff…

JS中闭包

相信JS的开发者&#xff0c;对闭包这个知识都比较熟悉&#xff0c;在熟悉的同时可能会有些模糊的不真切感&#xff0c;下面咱们从三个方面来具体加深一下对闭包的理解。 什么是闭包 咱们先看两个比较抽象的理解&#xff0c;闭包是一个函数和其关联环境组成的结构体&#xff1b…

C++面试宝典第1题:爬楼梯

题目 小乐爬楼梯&#xff0c;一次只能上1级或者2级台阶。楼梯一共有n级台阶&#xff0c;请问总共有多少种方法可以爬上楼&#xff1f; 解析 这道题虽然是一道编程题&#xff0c;但实际上更是一道数学题&#xff0c;着重考察应聘者的逻辑思维能力和分析解决问题的能力。 当楼梯只…

理解Zookeper

一、什么是Zookeper Zookeper是一个可以作为注册中心、配置中心、分布式锁的分布式解决方案 二、数据一致性 一致性分为强一致性、弱一致性、最终一致性 Zookeper可以保持数据的强一致性&#xff08;CP&#xff09; 主要是解决写、集群节点的同步、读之间的关系 强一致性&a…

nodejs微信小程序+python+PHP问卷调查系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

This详细用法

this的指向 this有5种指向&#xff0c;在普通函数中&#xff0c;this指向window&#xff1b;在构造函数中&#xff0c;this指向创建的对象&#xff1b;在方法声明中&#xff0c;this指向调用者&#xff1b;在定时器中&#xff0c; this指向window&#xff1b;在事件中&#xff…

超大规模集成电路设计----MOS器件原理(二)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----MOS器件原理&#xff08;二&#xff09; 半导体物理知识补充介绍1. 半导体材料2. 固体类型…

如何做性能优化?

性能优化是一个复杂的过程&#xff0c;它涉及到对软件或网站的结构、代码、数据库和硬件的深入理解和改进。以下是一些通用的性能优化建议&#xff1a; 代码优化&#xff1a; 减少数据库查询&#xff1a;尽量避免N1查询问题&#xff0c;使用索引优化&#xff0c;或者考虑使用内…

如何查看JDK动态代理自动生成的类

JDK提供了一种强大且灵活的机制,可以在运行时生成代理类。这种动态生成的代理类可以在不修改原始类的情况下,对其方法进行拦截和增强。然而,对于初学者来说,了解生成的代理类的内部结构和工作原理可能会很有帮助。 本文将介绍如何查看JDK动态代理生成的代理类。我们将探索一…

RK3568平台开发系列讲解(Linux系统篇)通过OF函数获取属性

🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过OF函数获取属性。 一、获取获取属性 ① of_find_property 函数 of_find_property 函数用于在设备树中查找节点 下具有指定名称的属性。 如果找到了该属性, 可以通过返回的属性结构体…

Shell循环:expect(二)

expect实战&#xff1a;公钥推送 一、准备工作&#xff1a;安装expect&#xff0c;装备公钥 二、通过shell循环判断主机在线 #!/bin/bash #脚本编写 #创建一个IP地址文件 >ip.txt #使用for循环ping测试主机是否在线 for i in {3..254} do{ip192.168.151.$iping -c1 -W…