Linux基础 -- 运行安全之ASLR的作用与实现方式

Linux ARM ASLR 的作用与实现方式

简介

ASLR(Address Space Layout Randomization,地址空间布局随机化)是一种安全技术,用于防止攻击者通过利用已知的内存地址来进行攻击。它通过随机化进程的内存地址空间布局,使得内存地址难以预测,从而增加了攻击的难度。

ASLR 的作用

ASLR 的主要作用是增加系统的安全性,防止以下几种攻击:

  1. 缓冲区溢出攻击:攻击者通过向程序写入超出缓冲区大小的数据,覆盖关键数据结构,如返回地址等。ASLR使得这些地址难以预测。
  2. 返回导向编程(ROP)攻击:攻击者利用程序已有的代码片段,通过改变程序的控制流来执行恶意代码。ASLR使得这些代码片段的地址难以预测。
  3. 格式化字符串攻击:攻击者利用格式化字符串漏洞读取或写入任意地址。ASLR使得这些地址难以预测。

ASLR 的实现方式

ASLR 在 Linux 系统中的实现方式包括以下几个方面:

  1. 堆栈地址随机化:每次程序运行时,堆栈的起始地址是随机的。这样攻击者无法预测堆栈的确切地址。
  2. 堆地址随机化:堆的起始地址和堆中分配的内存块地址是随机的。这样攻击者无法预测堆的确切地址。
  3. 动态链接库地址随机化:每次程序运行时,动态链接库的加载地址是随机的。这样攻击者无法预测动态链接库的确切地址。
  4. 可执行映像地址随机化:可执行文件的加载地址是随机的。这样攻击者无法预测可执行文件的确切地址。

示例代码

我们可以通过编写简单的 C 程序来观察 ASLR 的效果。

程序示例 1:简单的堆栈地址随机化观察

#include <stdio.h>
#include <stdlib.h>void print_stack_address() {int stack_var;printf("Stack address: %p\n", (void*)&stack_var);
}int main() {print_stack_address();return 0;
}

程序示例 2:简单的堆地址随机化观察

#include <stdio.h>
#include <stdlib.h>void print_heap_address() {int *heap_var = (int*)malloc(sizeof(int));printf("Heap address: %p\n", (void*)heap_var);free(heap_var);
}int main() {print_heap_address();return 0;
}

运行示例

在启用了 ASLR 的系统上多次运行上述程序,我们可以看到每次运行时堆栈地址和堆地址都会发生变化。

$ ./stack_example
Stack address: 0x7ffc58c9b6fc$ ./stack_example
Stack address: 0x7ffe3f8e96fc$ ./heap_example
Heap address: 0x55dbe7f7b260$ ./heap_example
Heap address: 0x561aabf9b290

检查 ASLR 是否启用

可以通过检查 /proc/sys/kernel/randomize_va_space 文件的值来确定系统是否启用了 ASLR:

$ cat /proc/sys/kernel/randomize_va_space
2

其中,值 2 表示完全启用 ASLR,值 1 表示部分启用,值 0 表示禁用。

内核实现部分

ASLR 的内核实现主要集中在内存管理和进程创建的代码中。以下是几个关键的部分:

1. 内存映射布局的选择

主要在 mm 目录下的代码文件中,如 mm/mmap.cmm/arch_pick_mmap_layout.c

// mm/mmap.c
void arch_pick_mmap_layout(struct mm_struct *mm) {// 选择地址空间布局
}// arch/x86/mm/mmap.c
unsigned long randomize_va_space(unsigned long base) {// 随机化地址空间
}

2. 进程创建和执行新程序

在执行新程序时,内核会随机化堆栈、堆和其他内存区域的地址。相关代码在 fs/exec.c 中。

// fs/exec.c
int setup_arg_pages(struct linux_binprm *bprm,unsigned long stack_top,int executable_stack) {// 设置参数页面,随机化堆栈地址
}

3. 内核配置和控制

内核通过 /proc/sys/kernel/randomize_va_space 文件来控制 ASLR 的行为。相关代码在 kernel/sysctl.c 中。

// kernel/sysctl.c
static struct ctl_table kern_table[] = {{.procname    = "randomize_va_space",.data        = &randomize_va_space,.maxlen      = sizeof(int),.mode        = 0644,.proc_handler= proc_dointvec_minmax,.extra1      = SYSCTL_ZERO,.extra2      = SYSCTL_TWO,},
};

具体代码实现

以下是一些具体的内核代码片段,展示了 ASLR 的实现细节:

地址空间随机化

arch/x86/mm/mmap.c 中的 arch_pick_mmap_layout 函数负责选择进程的内存映射布局。

// arch/x86/mm/mmap.c
void arch_pick_mmap_layout(struct mm_struct *mm) {if (current->flags & PF_RANDOMIZE) {mm->mmap_base = randomize_stack_top(mm);mm->get_unmapped_area = arch_get_unmapped_area;} else {mm->mmap_base = mmap_base;mm->get_unmapped_area = arch_get_unmapped_area_no_randomization;}
}

堆栈随机化

fs/exec.c 中的 setup_arg_pages 函数设置参数页面并随机化堆栈地址。

// fs/exec.c
int setup_arg_pages(struct linux_binprm *bprm,unsigned long stack_top,int executable_stack) {unsigned long random_variable;...if (current->flags & PF_RANDOMIZE) {random_variable = get_random_bytes() % STACK_RND_MASK;stack_top -= random_variable;}...
}

通过以上代码片段可以看出,ASLR 的实现涉及到多个内核模块,通过在进程创建和内存分配时引入随机化,来提高系统的安全性。详细了解具体的实现细节,可以查阅 Linux 内核源代码中的这些文件。

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

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

相关文章

docker-cli nerdctl ctr crictl容器命令比较

一、docker-cli、nerdctl 和 ctr 以及 crictl 介绍 docker, nerdctl 和 ctr 和 crictl 都是用于容器管理的命令行工具&#xff0c;但它们在设计目的、使用场景和技术栈上有所不同。下面分别对这四个工具进行介绍&#xff0c;并指出它们之间的主要差异。 1.1、Docker CLI Doc…

Ionic 安装指南

Ionic 安装指南 Ionic 是一个强大的开源框架,用于开发跨平台的移动应用程序。它结合了 Angular、React 或 Vue 的强大功能,允许开发者使用网页技术构建高性能的移动应用。本指南将详细介绍如何在不同操作系统上安装 Ionic,并开始您的第一个 Ionic 项目。 系统要求 在开始…

【CPO-TCN-BiGRU-Attention回归预测】基于冠豪猪算法CPO优化时间卷积双向门控循环单元融合注意力机制

基于冠豪猪算法CPO&#xff08;Correlation-Preservation Optimization&#xff09;优化的时间卷积双向门控循环单元&#xff08;Bidirectional Gated Recurrent Unit&#xff0c;BiGRU&#xff09;融合注意力机制&#xff08;Attention&#xff09;的回归预测需要详细的实现和…

微调 Florence-2 - 微软的尖端视觉语言模型

Florence-2 是微软于 2024 年 6 月发布的一个基础视觉语言模型。该模型极具吸引力&#xff0c;因为它尺寸很小 (0.2B 及 0.7B) 且在各种计算机视觉和视觉语言任务上表现出色。 Florence 开箱即用支持多种类型的任务&#xff0c;包括: 看图说话、目标检测、OCR 等等。虽然覆盖面…

Elasticsearch索引管理和生命周期管理

在大数据和搜索引擎技术日益成熟的今天&#xff0c;Elasticsearch作为一款基于Lucene构建的开源搜索引擎&#xff0c;凭借其强大的全文搜索能力、分布式架构以及可扩展性&#xff0c;在日志分析、实时监控、应用搜索等多个领域得到了广泛应用。然而&#xff0c;随着数据量的不断…

前缀和算法——部分OJ题详解

&#xff08;文章的题目解释可能存在一些问题&#xff0c;欢迎各位小伙伴私信或评论指点&#xff08;双手合十&#xff09;&#xff09; 关于前缀和算法 前缀和算法解决的是“快速得出一个连续区间的和”&#xff0c;以前求区间和的时间复杂度是O(N)&#xff0c;使用前缀和可…

【精品资料】大数据可视化平台数据治理方案(626页WORD)

引言&#xff1a;大数据可视化平台的数据治理方案是一个综合性的策略&#xff0c;旨在确保大数据的质量、安全性、可访问性和合规性&#xff0c;从而支持高效的数据分析和可视化过程。 方案介绍&#xff1a; 大数据可视化平台的数据治理方案是一个综合性的策略&#xff0c;旨在…

Netty HTTP

Netty 是一个高性能的异步事件驱动的网络应用程序框架&#xff0c;支持快速开发可维护的高性能协议服务器和客户端。它广泛应用于开发网络应用程序&#xff0c;如服务器和客户端协议的实现。Netty 提供了对多种传输类型的抽象&#xff0c;如 TCP/IP 和 UDP/IP 等&#xff0c;使…

微软的vscode和vs2022快捷键官网链接

vscode官方文档:https://code.visualstudio.com/docs/ vscode快捷键官方文档:https://code.visualstudio.com/docs/getstarted/keybindings vs2022官方文档:https://learn.microsoft.com/zh-cn/visualstudio/ide/?viewvs-2022 vscode快捷键官方文档:https://learn.microsoft.c…

Qt Style Sheets

样式表语法 Qt 样式表术语和语法规则几乎与 HTML CSS 的相同。如果您已经了解 CSS&#xff0c;您可能可以快速浏览此部分。 样式规则 样式表由一系列样式规则组成。样式规则由选择器和声明组成。选择器指定哪些小部件受该规则影响&#xff1b;声明指定应在小部件上设置哪些属性…

python基础知识点(蓝桥杯python科目个人复习计划70)

继续打基础&#xff0c;爬虫部分随笔 第一题&#xff1a;特别数的和 题目描述&#xff1a; 小明对数位中含有2、0、1、9的数&#xff08;不包含前导0&#xff09;很感兴趣&#xff0c;在1到40中这样的数共有28个&#xff0c;它们的和是574。 请问在1到n中&#xff0c;这样的…

提高Java程序效率:ImmutableList、Stream API 和 JSON序列化实战指南

常用列表构建方法&#xff1a; 1.ImmutableList.of() &#xff1a; 静态方法、不可变的列表 可以接受任意数量的参数&#xff0c;并将它们作为元素添加到新创建的列表中&#xff0c;但是一旦创建&#xff0c;集合的内容就不能被改变。在多线程环境中非常有用&#xff0c;因为…

Linux编程(通信协议---udp)

UDP&#xff08;用户数据报协议&#xff09;是一种无连接的网络协议&#xff0c;主要用于快速传输数据。以下是UDP协议的一些主要特点&#xff1a; 1. **无连接**&#xff1a;UDP是无连接的协议&#xff0c;这意味着在数据传输之前不需要建立连接。每个UDP数据包都是独立的&am…

OpenSearch分析CloudTrail日志的实用案例

在AWS环境中,CloudTrail日志提供了宝贵的洞察,而OpenSearch则为分析这些日志提供了强大的工具。本文将介绍15个使用OpenSearch分析CloudTrail日志的实用案例,帮助您更好地理解和管理AWS环境。 1. 监控用户登录活动 查询: eventName: "ConsoleLogin" 这个查询可…

Spark的动态资源分配算法

文章目录 前言基于任务需求进行资源请求的整体过程资源申请的生成过程详解资源申请的生成过程的简单例子资源调度算法的代码解析 申请资源以后的处理&#xff1a;Executor的启动或者结束对于新启动的Container的处理对于结束的Container的处理 基于资源分配结果进行任务调度Pen…

把关键字当作列名 不报错的方法 (数据库)

解决方法&#xff1a; 把新字段名加上双引号 ALTER TABLE 表名 RNAME COLUMN 旧列名 TO “新列名”在这个语句中&#xff0c;“新列名” 被双引号包围&#xff0c;这样数据库就能识别它作为一个标识符(例如列名)&#xff0c;而不是一个 SQL 关键字。

Django相关的基本操作

Django是一个高级的Python Web框架&#xff0c;它鼓励快速开发和干净、实用的设计。以下是Django使用方法的基本步骤&#xff0c;涵盖了从安装到项目部署的整个过程&#xff1a; 1. 安装Django 首先&#xff0c;你需要在你的Python环境中安装Django。可以通过pip命令来安装&a…

win10删除鼠标右键选项

鼠标右键菜单时&#xff0c;发现里面的选项特别多&#xff0c;找一下属性&#xff0c;半天找不到。删除一些不常用的选项&#xff0c;让右键菜单变得干净整洁。 1、按下键盘上的“winR”组合按键&#xff0c;调出“运行”对话框&#xff0c;输入“regedit”命令&#xff0c;点击…

探索Transformer:依存句法分析的新纪元

探索Transformer&#xff1a;依存句法分析的新纪元 依存句法分析是自然语言处理&#xff08;NLP&#xff09;领域中的一项基础任务&#xff0c;它旨在揭示句子中词语之间的依存关系。近年来&#xff0c;Transformer模型以其卓越的性能在依存句法分析领域引起了一场革命。本文将…

opencv—常用函数学习_“干货“_1

目录 一、图像文件 1. imread&#xff1a;读取图像文件 2. imwrite&#xff1a;写入图像文件 3. imshow&#xff1a;显示图像 4. VideoCapture&#xff1a;捕获视频 二、创建Mat 1、创建Mat对象 2、操作Mat对象 三、矩阵算术运算 矩阵加法 矩阵减法 矩阵乘法 矩阵…