电脑关机了,内存就没数据了吗?

2023-11-06

前言:

大家好,我是周杰伦。

提到网络攻击技术,你脑子里首先想到的是什么?

DDoS

SQL注入、XSS

还是栈溢出RCE(远程代码执行)?

这些最常见的网络攻击技术,基本上都是与网络、软件、代码、程序这些东西相关。

这也好理解,计算机网络安全,不跟这有关,还与什么有关系?

今天跟大家介绍一下,攻击技术,除了这些,还有一些脑洞大开的方式,它们可能跟时间、震动频率温度等各种物理相关的元素相关,看完绝对让你瞠目结舌!

这些不同于传统软件安全方向,而是从其他侧面进行的网络攻击,称作侧信道攻击,也叫边信道攻击

内存冷冻

请大家思考一个问题:如果计算机突然断电,内存里的数据是不是瞬间就没了?

内存大家都知道,计算机运行离不开这东西,程序指令和数据都存储在这里,但你知道内存条存储数据的原理吗?

看到图中那一块块黑色的东西了吗?那就是内存条存储数据的地方:内存颗粒。

在内存颗粒里面,是超大规模集成电路,里面是密密麻麻的存储单元格,每一个单元格存储一个比特位:

这个单元格中的核心部件是一个电容,电容有电压,如果电压在一定范围内,这个单元格就是1,否则就是0。通过无数个这样的单元格,构成了GB级的存储空间。

但大家学过物理应该知道,电容是一个不稳定的元件,随着时间的流逝,电荷会泄漏,如果不加以控制,内存条中的电压最终就会变成0,内存中的数据也就不准确了。

因此,内存在工作的时候,需要定时的进行数据刷新,对电容进行充电,一般最多64ms就得充一次电,才能保存数据的准确性。

好了,内存的背景知识交代完毕,现在回到本节一开始提到的那个问题:计算机突然断电了,内存中的数据瞬间就没了吗?

内存中的数据是通过电容这种电子元件在承载,电容充放电都是需要时间的,所以可以大胆猜测,即使断电了,内存中的数据全部消失也是需要时间的。

国外有人脑洞大开,做了一项实验,测试内存条断电后,里面的数据随着时间的流逝,消失的情况。

普通数据不方便观察,用图片最直接,实验中将一张蒙娜丽莎的图片载入内存中,然后断电,然后计算不同时间后,这张图的变化情况:

可以看到,在断电后的5s内,图片数据肉眼上看不到变化,30s后也影响不大,一分钟后也能依稀可见,5分钟后才彻底看不到。

而更重要的是,如果温度降低时,电容中电荷遗漏的速度将更加缓慢。下面这个表格是测试内存条数据错误率在正常情况和冷冻情况下的比较

如上图所示,红色框是不冷冻情况,蓝色框是在零下50摄氏度情况,可以看到,在冷冻情况下,一分钟后,数据的错误率是0,即便是在300秒(5分钟)后,错误率也只有惊人的0.0095%。

所以,一种新的攻击方式就出来了:使用内存冷冻的方式,可以从内存条中提取数据。

内存中有什么数据?很多程序的密码密钥可能都存在于内存之中,最典型的比如Windows的开机密码。

以为电脑关机了就安全了?可不是这么回事哦!

熔断与幽灵

熔断与幽灵漏洞攻击大家应该不会陌生,在2017年刚刚爆发出来的时候,占据了无数媒体的头条,可见影响力之广。

在讲述这个漏洞之前,先请大家看一个故事。

学过计算机组成原理的朋友可能都知道,CPU有两个重要的特性:分支预测乱序执行

在执行到判断分支的时候(比如if判断),CPU会根据它自己的“经验”来判断,一会儿可能会走入哪一个分支,从而提前执行一些这个分支的指令,这叫分支预测。

另外,CPU在执行一些指令的时候,可能并不是按照顺序一条执行完再执行下一条,而是可能在会预执行一些CPU认为可以提前执行,对程序流程无关的指令,这个叫乱序执行。

但CPU认为可以提前执行,那就真的可以提前执行吗,执行了可能对程序本身流程没有影响,但会不会有什么副作用呢?

先留这个问题,一会儿再说,先来看另一个概念:缓存

CPU执行程序需要频繁与内存通信,读取数据或者写入数据。但内存的响应速度比CPU慢多了,于是CPU在其内部加了一块缓存,将最近要用的数据放到这里来,避免每一次都从内存访问,提高工作效率。

因此,同样读取一个数据,从内存读和从缓存读,时间上是有差异的。

熔断与幽灵正是利用这一点,来进行了系统攻击。

假如你想读取操作系统内核的数据,但因为系统安全机制,应用程序是无法直接访问内核空间的,但这个漏洞就可以帮你实现内核空间数据的读取。

下面这段程序,先执行几十次,每次传入的x都小于16,每次都走入同一个分支,训练CPU,让它获得一些“经验”,让它认为 < 16是大概率要执行的分支,然后启用乱序执行,提前执行x < 16这个分支中的指令。

void bad_guy(int x) {
 if (x < 16) {temp &= array2[array1[x] * 512];
 }
} 

来看一下,在上面这个例子中,x < 16这个分支中会通过array1这个数组访问内存,假设x突然来了一个很大的数,这样通过array1[x]访问的内存地址就溢出到了内核空间了。

乱序执行的后果,会提前计算array1[x] * 512,并将其作为下标访问array2数组的内容,然后会将这个内容从内存条加载到CPU缓存中。

突然冷不丁的来一个大于16的参数,这下它提前执行的指令就白费了。

而随后,CPU发现了这一次x是大于16的,不应该走到这个分支中来,上面描述的这一段活就白干了。

虽然是白干了,但它做了一件事:把array2数组对应下标的那一块数据从内存搬到缓存了。

这时再依次访问array2数组的每一个元素,就能知道刚才的下标,再进一步可以推断出那个内核空间的值。

然后不断变换x的输入,可以知道任意内核地址空间的数据。

这就是熔断与幽灵漏洞的核心思想:通过分支预测+乱序执行+缓存内存访问时间差异来推断内核数据。

计时攻击

熔断与幽灵,其实是利用了CPU访问内存和访问缓存的时间差来透露信息,从而实现数据泄漏,也就是说,利用的核心是时间这个物理量。

而利用时间的另一个经典攻击方式就是计时攻击。

给大家举个例子,如果要使用C语言编写一个函数,用来判断输入的密码是否正确,有人可能会这样写:

 bool check_passwd(char* input) {bool result = false;const char* passwd = "XiaoBaiGe2021";if (input) {if (strlen(input) != strlen(passwd)) {return false;}const char* p1 = input;const char* p2 = passwd;while (*p1 && *p2) {if (*p1 == *p2) {p1++;p2++;} else {break;}}if (*p1 == '\0' && *p2 == '\0') {result = true;}}return result;
} 

上面这个函数中,在正式的字符串比较之前,先进行了长度的比较,如果长度都不同,那就不用比较了,节省时间。

但这个看上去很聪明的做法,实际上可能会给攻击者提供了信息参考。

通过输入不同长度的字符串,发现程序验证所花费的时间不同,攻击者可能猜测出真正密码的长度。

接下来的验证过程中,开始逐位比较字符串的每一位,乍一看也没毛病,但同样的问题,如果第一位就比较错误,程序很早就退出,而如果比较的时间相对较长,则说明密码的前几位可能是正确的。

通过这些信息,然后进行不断尝试,密码可以在短时间内破解出来,是不是觉得不可思议?这是曾经发生过的真实案例。

正则表达式

正则表达式在字符串校验、文本提取、格式化解析等领域有非常广泛的应用,基本上所有主流的编程语言都有对应的程序库。

但你知道正则表达式的解析引擎是如何工作的吗,你知道如果传入一些特定的字符串,可能让解析引擎陷入巨大的计算陷阱吗?

正则表达式的解析引擎有一个重要的流派就是基于NFA,这是一种状态机。随着解析引擎的逐字符解析,状态机可能会有不同的下一个状态。由于每一个状态都有许多个下一个状态,解析引擎可能会在这条链路上不断前行,直到找到一个匹配的。

比如在 《白帽子讲Web安全》 一书中所提到的例子:

有一个这样的正则表达式:^(a+)+$

如果输入四个字符’aaaa’,解析引擎的执行过程是这样的:

它只有16条路径,很快就能走完。

但如果输入的字符a大量增加时,执行的路径将会暴增。

可以看到,随着后续字符串长度的增加,花费的时间开始呈2倍增长趋势。如果输入64个字符a,那将会是什么后果?

CPU飞转,程序失去响应,服务拒绝攻击DOS!

没想到吧,你只是输入了一个正则表达式字符串,就能让服务器失去响应。

【技术文档&<白帽子讲Web安全高清电子版>】

总结

以上就是今天给大家介绍的一些侧信道攻击技术。

除了上面这些案例,通过CPU的利用率,CPU电信号的频率等等信息,也能泄露出很多有价值的信息,侧信道攻击技术,不只是电影中的黑科技,而是可能真实发生的攻击。
< img src=“https://hnxx.oss-cn-shanghai.aliyuncs.com/official/1678694737820.png?t=0.6334725112165747” />

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

电脑关机了,内存就没数据了吗? 的相关文章

  • SpringBoot访问静态资源html和jsp

    1 新建springBoot项目 1 2 3 4 5 6 2 配置项目JDK 前面已经配置的可以不用配置 1 2 3 把项目配置成maven项目 1 2 3 4 5 6 有maven项目这里结构有test 4 访问json 配置数据库在默认
  • 使用51单片机实现点阵汉字平滑滚动显示

    使用51单片机实现点阵汉字平滑滚动显示 说明 采用的芯片是89C51 LED点阵屏的规格是16 16 同时使用了两个74HC595芯片 字模生成软件在文末有网盘链接 1 连接原理图 整体的电路连接如上图所示 单片机只需要使用三个IO接口 就
  • 云开发小程序要服务器吗,小程序云开发发布还需要服务器吗

    小程序云开发发布还需要服务器吗 内容精选 换一换 AppCube的服务编排 支持对逻辑判断组件 数据处理组件 以及脚本 子服务编排 商业对象等进行可视化组合编排 实现丰富的业务功能 在传统的开发中程序员一般是基于代码进行开发 程序员需要学习
  • (2019.8.20半解决)Solving environment: failed with initial frozen solve. Retrying with flexible solve.Co

    用conda命令在linux安装python库出现上述错误 这里提到了这个问题 有人建议更新conda 我更新后无效 不过 conda不行 但是pip可以安装 问题先这样 后续有时间再仔细研究
  • ThreadLocal和ThreadLocalMap

    1 ThreadLocal是什么 是用来存放我们需要能够线程隔离的变量的 那就是线程本地变量 也就是说 当我们把变量保存在ThreadLocal当中时 就能够实现这个变量的线程隔离了 entry中的key使用了弱引用 static clas
  • 系统之家装机大师如何制作U盘启动盘?

    U盘的用途非常广泛 现在很多人都会使用U盘重装系统 那就需要先把U盘制作成U盘启动盘来重装系统 那要如何制作U盘启动盘呢 下面小编就教教大家使用系统之家装机大师制作U盘启动盘的方法 系统之家一键重装系统工具下载 系统之家装机大师官方版下载1

随机推荐

  • 【Redis学习笔记】2:认识Redisson及其分布式锁RLock.lock()

    Redisson和Jedis类似 都是用Java实现的操作Redis的客户端 但是使用场景不同 Redisson更多用在分布式场景下 功能可以看wiki Jedis更多用在单机场景下 1 Java接入Redisson 以Spring Boo
  • SpringMVC——静态资源访问之

    web xml 配置
  • 关于不设置div高度时,背景图片或背景颜色不显示的问题

    在写一个网页时 遇到div高度不定时 即高度设为auto 或者不设置时 加入的的背景图片不能显示的问题 在查阅相关资料后发现几种解决方法 出现这种情况有两个前提 1 外部的div没有设置高度 2 内部div浮动 解决方法 1 最直接的方法
  • 多元时间序列

    目录 多元时间序列 RBF径向基神经网络多变量时间序列预测 Matlab完整程序 预测结果 基本介绍 程序设计 参考资料 多元时间序列 RBF径向基神经网络多变量时间序列预测 Matlab完整程序 预测结果 基本介绍 多元时间序列 Matl
  • docker修改镜像的存储位置_Docker中修改镜像、容器的存放目录

    系统是CentOS7 DOCKER 1 13版本 之后版本未测试过 以上步骤在该操作系统和Docker版本下已经测试过 解决方案 在默认情况下 Docker镜像和容器的默认存放位置为 var lib docker 一般根下分区我们不会给太大
  • 爬虫实战

    爬51job url里的内容 项目的开发工具选择Requests模块和BeautifulSoup模块实现爬虫开发与数据清洗 数据存储选择Sqlalchemy框架 数据库选择MySQL 获取城市编号 1 观察搜索页的URL地址 控制变量 观察
  • docker数据管理---数据卷,数据卷容器

    在Docker中 数据卷 data volumes 和数据卷容器 data volume containers 是用于在容器之间共享和持久化数据的两种不同的机制 一 数据卷 数据卷是一个特殊的目录或目录 可以绕过容器文件系统的常规层 直接在
  • 输入一行字符,统计其中各种字符个数(C语言)

    输入一行字符 统计其中各种字符个数 编译环境VS2017 其中输出英文字母 数字 空格以及其他字符的个数 需要注意的是fgets 函数的使用 会在字符串末尾 0前 读入我们在键盘上敲的回车即换行符 n include
  • 自制Web桌面日历

    想要一个带农历的桌面日历 google了半天也没有找到中意的 但是经常浏览网站的时候发现很多不错的日历 直接保存到我的桌面上不就完了吗 下面是具体操作 将中意的日历页面 查看源文件 看是否可以看到script文件 如果可以 就保存到本地 用
  • 【雕爷学编程】Arduino动手做(202)---热释电效应、热释电元件与HC-SR505运动传感器模块

    37款传感器与模块的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止37种的 鉴于本人手头积累了一些传感器和执行器模块 依照实践出真知 一定要动手做 的理念 以学习和交流为目的 这里准备逐一动手试试多做实验 不管成功
  • vba中find方法查找1

  • QML ListView实现树形效果

    转自 http blog huati365 com 5jELjzLwnx3YGw import QtQuick 2 11 import QtQuick Controls 2 2 import QtQuick Controls Materia
  • Android抓包工具——Fiddler

    前言 在平时和其他大佬交流时 总会出现这么些话 抓个包看看就知道哪出问题了 抓流量啊 payload都在里面 这数据流怎么这么奇怪 这里出现的名词 其实都是差不多的意思啊 这都跟抓包这个词有关 说到抓包呢我们今天就先来了解一下抓包的一些基础
  • MySQL组成

    MySQL 的组成分为两部分 服务器端 服务的提供 相当于卖家 客户端 服务的使 相当于买家 消费者 服务器端只能有一个 而客户端可以有多个 安装了 MySQL 说明我们既是服务器端又是客户端 服务器端的服务体现就是 客户端是使 MySQL
  • 微软亚洲研究院实习生面试

    上周说到微软亚洲研究院 MSRA 一下就简称MSRA吧 网络面试我这边因为连不上而要重新安排面试 周五HR就给我电话约好今天中午1 00 3 00重新面试 于是提前做好各种准备 找了个拉ADSL的宿舍来上网 然后用了人家带摄像头的笔记本 还
  • B站创建视频分集播放列表

    上传视频在B站上创建视频分集列表方法 上传时创建分集列表 1 打开B站 2 登录B站后 点击投稿上传视频 3 上传视频或把视频直接拖拽到页面里 4 点击上传第一个视频后页面下会出现一个 号的按钮 点击 继续上传 上传视频就会出现两个正在上传
  • 浅谈 Node.js 热更新

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 记得在 15 16 年那会 Node js 刚起步的时候 我在去前东家的入职面试也被问到了要如何实现 Node js 服务的热更新 其实
  • Tuple VS ValueTuple(元组类 VS 值元组)

    Tuple VS ValueTuple 元组类 VS 值元组 文章目录 Tuple VS ValueTuple 元组类 VS 值元组 Tuple 1 创建元组 2 表示一组数据 3 从方法返回多个值 4 用于单参数方法的多值传递 缺点 Va
  • 基于php的课程网站络管理系统的设计与实现

    摘 要 管理系统是根据课程网站的需求而设计和实现的 主要 用于实现课程系统办公人员对其办公系统内所有公务员进行管理 实现对员工信息的查询 录入 修改和删除 以及发布重要通知 最新信息和规章制度 通过 网上办公 无纸办公 大大提高办公效率 体
  • 电脑关机了,内存就没数据了吗?

    前言 大家好 我是周杰伦 提到网络攻击技术 你脑子里首先想到的是什么 是DDoS 是SQL注入 XSS 还是栈溢出 RCE 远程代码执行 这些最常见的网络攻击技术 基本上都是与网络 软件 代码 程序这些东西相关 这也好理解 计算机网络安全