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

本文介绍了计算机安全中的侧信道攻击,包括内存冷冻技术,利用断电后内存中数据的残留来提取敏感信息;熔断与幽灵漏洞,通过CPU的分支预测和乱序执行来泄露内核数据;以及计时攻击和正则表达式陷阱,利用程序执行时间和正则解析引擎的特性来实施攻击。这些攻击方式揭示了网络安全不仅涉及软件层面,还与物理特性密切相关。

大家好,我是周杰伦。

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

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安全》** 高清PDF版

总结

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

除了上面这些案例,通过CPU的利用率,CPU电信号的频率等等信息,也能泄露出很多有价值的信息,侧信道攻击技术,不只是电影中的黑科技,而是可能真实发生的攻击。

### 电脑长时间运行后内存占用过高问题及解决方案 在电脑长时间运行过程中,可能会出现内存占用逐渐升高的现象。这种问题通常与系统资源管理、程序运行机制以及后台服务的优化程度密切相关。以下是对此类问题的详细分析和对应的解决方法。 #### 内存占用过高的原因 1. **内存泄漏**:某些应用程序在运行时未能正确释放不再使用的内存,导致内存持续增长。这种情况常见于使用自动垃圾回收(GC)机制的语言中,例如Java或C#。即使GC功能较为智能化,但依然可能因为对象引用未被释放而造成内存堆积[^2]。 2. **高内存消耗程序**:一些程序在运行时会占用大量内存,并且随着运行时间延长,其内存需求可能不断增长,从而导致整体内存占用率升高[^1]。 3. **后台进程和服务**:操作系统或第三方软件中的后台进程可能会在长时间运行时积累内存占用,尤其是在执行数据缓存或日志记录等操作时[^3]。 4. **线程问题**:多线程应用程序中,如果线程未正确关闭或存在阻塞情况,也可能导致内存占用增加[^4]。 #### 解决方案 1. **通过任务管理器监控并终止高内存占用程序**: - 按下快捷键 `Ctrl + Shift + Esc` 直接打开任务管理器。 - 在“性能”选项卡中查看内存使用情况,切换到“进程”选项卡,按内存使用排序,找到占用内存较高的程序。 - 如果发现非关键性程序占用过多内存,可以右键选择“结束任务”以释放内存资源[^1]。 2. **手动释放内存(Windows平台)**: - 对于某些长期运行的应用程序,可以通过调用 Windows API(如 Win32API)来定时释放内存。这种方法尤其适用于 C++ 或 WinForm 等开发框架构建的桌面应用,在检测到内存泄漏问题时效果显著[^2]。 3. **优化系统配置**: - 使用快捷键 `Alt + Ctrl + Delete` 打开任务管理器,点击“性能”选项卡,观察系统内存和物理内存的使用趋势。 - 进入“开始”菜单,输入 `msconfig` 命令,打开系统配置工具,检查启动项是否包含不必要的服务,适当减少开机自启程序以降低内存负担[^3]。 4. **使用内存分析工具排查问题**: - 对于 Java 应用程序,可以使用 Eclipse Memory Analyzer (MAT) 或 VisualVM 等专业工具进行内存分析。这些工具能够帮助定位内存泄漏的具体原因,并提供详细的内存使用报告[^4]。 - 示例代码片段用于获取 Java 虚拟机的内存信息: ```java import java.lang.management.ManagementFactory; import com.sun.management.OperatingSystemMXBean; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; public class MemoryMonitor { public static void main(String[] args) { MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage(); System.out.println("Initial Heap Memory: " + heapUsage.getInit()); System.out.println("Used Heap Memory: " + heapUsage.getUsed()); System.out.println("Max Heap Memory: " + heapUsage.getMax()); } } ``` 5. **重启服务或系统**: - 如果上述方法无法有效缓解内存压力,可尝试重启相关服务或整个系统。重启可以清理临时分配的内存空间,尤其对于长期运行的服务而言是一个有效的重置手段。 6. **定期维护与更新**: - 确保所有软件和操作系统保持最新版本,及时修复已知的内存管理漏洞。 - 定期清理磁盘缓存和临时文件,避免因存储空间不足间接影响内存使用效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值