【转帖】intel 2018年1 月2号爆出漏洞分析 知乎匿名用户

作者:匿名用户
链接:https://www.zhihu.com/question/265012502/answer/288407097
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先要明确的是:
1)这个漏洞不是去年说的Intel ME的漏洞;
2)这个漏洞不是很多答主说的依靠时间推测内核加载地址的问题。

这是一个新爆出的漏洞,虽然看起来不是1月2号才暴露出来。因为Linux和Windows早在去年11月份左右就有动作开始修补了。

下面是科普时间:

首先我们需要知道,以前常见的虚拟内存结构怎样的。以32位Linux为例,我们知道2^32 Bytes = 4GB,从应用程序的眼中来看,我拥有4个G的内存。但是,这4个G的内存并不完全属于应用程序——高地址那边的1GB大小的映射是属于内核的。比如,假设内核有一段代码在虚拟地址0xCCCCCCCC这个位置上,应用程序也是无法直接调用的。换句话说,虽然这些地址普通程序不能访问,但内核程序、内核栈等确实映射在这了。

看起来一切正常。接下来,假设我们发现了一个内核漏洞,这个漏洞允许程序调用任意内核级的代码——也就是说,应用程序通过这个漏洞可以调用内核中0xCCCCCCCC地址的程序了,进而对系统造成危害。

那么如何减轻发现内核漏洞之后的危害呢?毕竟,有代码的地方就会有bug。大佬们决定采用一种随机的方法:你不是要调用0xCCCCCCCC这块的代码吗?那我每次启动的时候,把内核映射到一个随机的地址上就好了嘛,比如这段代码这次启动的时候它在0xCCCC0000,下次启动它就变成了0xCCCC8888,让人摸不着头脑。

这种机制就叫KASLR。它随机化内核在虚拟空间中的地址,只有内核自己知道我在哪,别人休想知道。所以说,KASLR不是“修补”漏洞,而是提高了利用漏洞的成本——最好的情况是,虽然有人发现了漏洞,但却难以利用。

但是,魔高一尺道高一丈。另一位大佬说,你这太弱了。我用一种方法,能探测出你究竟随机到哪去了。这就是很多答主说的Time Based Attack。因为放代码的地址和没放代码的地址,在某些操作下时间长短不一样。

因此,这种Attack不是真正的漏洞攻击,但他让KASLR机制失效了。如果有人发现了可利用的内核漏洞后,就可以用这种方式绕过KASLR。

大佬还说了,虽然KASLR不好使了,但我的新方法好使啊。这个新方法就是KAISER——内核除了让应用程序知道必要的信息外,不再在应用程序的眼中“可见”。但是代价也是有的,就是性能会有所下降。

好了,下面到了今天主角登场的时间了。这次的CPU漏洞,能够使得应用程序访问任意地址——包括映射到应用程序空间中的内核地址(即新闻标题中的“Kernel Memory Leaking”,内核内存泄露)。这就相当于我们刚才说的“内核漏洞”(虽然这是CPU的bug),但是这个漏洞可不好修。所以只能阻止这个漏洞的利用条件了——用KAISER机制,让你根本访问不到内核中的东西,把内核从应用程序的眼中“隐藏”。虽然降低了一些性能,但也总比被搞事情强。

Ps. 根据一些文章,目前这项机制在Linux中改名为了“KPTI”,即内核页表隔离。

非商业转载一部分内容

新能损失部分

目前phoronix已对此进行了测试,IO性能几乎下降了50%,编译性能下降了接近30%,postgresql和redis也有差不多20%的性能下跌,详细地址:Initial Benchmarks Of The Performance Impact Resulting From Linux's x86 Security Changes

作者:Allen Leung
链接:https://www.zhihu.com/question/265012502/answer/288199200
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/8185696.html

时间: 2024-08-05 19:20:34

【转帖】intel 2018年1 月2号爆出漏洞分析 知乎匿名用户的相关文章

2018年11月17号第一次参加源创会记录

前言 昨天下午,到网易大厦参加了源创会的微信小程序技术沙龙.之前也参加过一些技术沙龙,但是原创会的还是第一次,总体感觉,还是很不错的. 细雨纷飞,准时来到会场之后,竟然发觉早已经人满为患,后边陆续还有不少参会者进场,后来的人就只能够站着听了. 主题 一共有四个主题,基本都与微信小程序和前端开发相关的.其实我也不知道为什么选题主要都和小程序或者前端相关,也许可能微信总部在广州吧,又或者广州这个城市比较着重商贸,所以微商或者搞前端这些讲求快捷实用的小公司更多吧.毕竟大部份的科技巨头都集中在北京上海深

2018年3月7号 认识html

<!doctype html>(声明为 HTML5 文档)<html>(标签限定了文档的开始点和结束点)<head>(带有最基本的必需的元素.定义文档的头部)<meta charset="utf-8">(规定 HTML 文档的字符编码:)<title>无标题文档</title>(标题)</head><body> (包含了可见的页面内容.定义文档的身子)</body></ht

2018年3月12号 学习内容

选择器: 标签选择器:根据标签名找 id选择器:根据id的属性值来找元素 #id的属性值 class选择器:根据class的属性值来找元素 .class的属性值 并列 关键符号(,)形式:选择器1(,)选择器2{} 后代  关键符号(空格)形式:父选择器(空格)子选择器 css层叠样式表 用来美化页面 css分类: 1. 内联(行内):写在标签里面 以属性的形式 属性名是style 注:不推荐但是优先级最高 2.内嵌: 写在head标签内 以标签的的形式表现 标签名是link <link rel

2018年3月13号

float:浮动 clear:both 消除浮动 要浮动的标签用div包起来 给div设宽高 设行高 设行高垂直居中: #div{ width:100%; height:30px; link-height:30px;// 行高 默认垂直居中 (这里的高要跟设的高一个样) } link-height:最好对一行使用 如果换行了 标签的高度就变了 兼容:将最外层的标签设宽高 里面用百分比 盒子模型: 从内到外,内容,内边距(填充物),边框,外边距(和别的物品的距离) html        padd

2018年3月23号 Dom操作

Dom操作 dom操作:找到元素 操作元素          找元素(标签对象)                   标签名                       document.getElementsByTagName();                   属性                       document.getElementById();    id属性值                       document.getElementsByName();  

2018年5月31号(树状数组)

今天,老师讲了树状数组,本蒟蒻有点懵懵懂懂,但是基本模板我还是记到的: 先是讲下原理: 今晚学了树状数组…所以呢我来总结一下自己对它的理解…    这图是在网上随便找找的…  由图可以得出:  c1=a1;  c2=c2+c1=a1+a2;  c3=a3;  c4=c4+c3+c2=a1+a2+a3+a4;  c5=a5;  c6=c6+c5=a5+a6;  c7=a7;  c8=c8+c7+c6+c4=a1+a2+a3+a4+a5+a6+a7+a8; 前k项和:  s1=c1=a1;  s2=

2018年6月1号(线段树(1))

今天是六一儿童节,先祝各位六一儿童节快乐 今天想和大家一起学习一下线段树: 1. 创建线段树 对于线段树我们可以选择和普通二叉树一样的链式结构.我们可以用数组来存储,下面的讨论及代码都是数组来存储线段树,节点结构如下(注意到用数组存储时,有效空间为2n-1,实 际空间确不止这么多,比如上面的线段树中叶子节点1.3虽然没有左右子树,但是的确占用了数组空间,实际空间是满二叉树的节点数目. 是树的高度,但是这个空间复杂度也是 O(n) 的 ). 定义包含n个节点的线段树 SegTreeNode seg

2018年6月4号(线段树(4))

今天想和大家一起了解下今天我刚写的一道题: P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:1. "C A B C" 指在A到 B 号方格中涂上颜色 C.2. "P A B" 指老师的提问:A到 B号方格中有几种颜色.学校的颜料盒中一共有 T 种颜料.

2018年6月5号(离散化)

today,我们接触了新的名词:离散化,听着就觉的高大尚: 离散化是什么,这个问题问得好(问度娘): 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率. 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小.例如: 原数据:1,999,100000,15;处理后:1,3,4,2; 原数据:{100,200},{20,50000},{1,400}; 处理后:{3,4},{2,6},{1,5}; 其实就是将大数据进行排序,再进行编号,这样就将特别大的数字变成