码迷,mamicode.com
首页 > 其他好文 > 详细

intel:spectre&Meltdown侧信道攻击(一)

时间:2020-07-12 00:27:01      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:速度   绿色   ati   操作   指针   权限   diy   ctr   输入密码   

   只要平时对安全领域感兴趣的读者肯定都听过spectre&Meltdown侧信道攻击,今天简单介绍一下这种攻击的原理( https://www.bilibili.com/video/av18144159?spm_id_from=333.788.b_765f64657363.1 这里有详细的视频介绍,墙裂推荐)。

   1、CPU顺序执行指令

         众所周知,程序是由一条条指令顺序排列构成的,老的cpu也是逐行执行指令;随着cpu的技术发展(著名的摩尔定律),cpu执行指令的速度越来越快,和内存读写速度的差距越来越大。理论上,CPU执行一条指令耗时纳秒左右,但从内存读一次数据需要耗时约100纳秒(参考这里:https://zhuanlan.zhihu.com/p/24726196),理论上相差了百倍,业界称为冯诺依曼瓶颈;这个速度差异不解决,CPU执行速度再快都没用;由此衍生出了近年来CPU的一个重要特性:乱序执行

        2、乱序执行:如下所示,比如有个if分支。正常情况下,如果MEM==0才会执行if分支;但CPU由于速度百倍于内存,等把这块内存的数据读出来,下面那4条指令早就执行完了,所以先不判断if条件是否成立,CPU会先执行这4条指令;等前面的指令执行完毕,轮到执行if 的时候,才会从内存读mem的数据,然后判断是否为0.  如果是,说明if这个分支本来就该执行,由于前面已经执行完毕,所以整个效率大大提升;退一步说,就算if条件不成立,cpu白执行了4条指令,这时只需要回退(主要是寄存器的值)即可,和以前的顺序执行比也没啥损失。这种提前预测分支执行的方法截至目前至少看起来没啥损失,还有一定的概率提升整体效率了!这个就是业界所谓的speculative execution!

         技术图片

   3、缓存cache

   前面说了,CPU执行指令的速度和从内存读数据的速度差了百倍。如果每次执行指令前都要从内存读取数据,CPU会闲死的;为了解决这个问题,衍生出了cpu另一个非常重要的功能:缓存;第一次从内存读取数据后,cpu会先把这些数据存放在内部缓存。下次再需要用这些数据时,不会立刻从内存读,而是先看看自己的缓存种是否已经有了,没有才会继续去内存读取;此种思想方法也能在一定程度上提升程序的执行效率和速度,但问题也随之而来:

        技术图片

   cpu的缓存是否有该数据,直接影响了从内存读取该数据的效率,理论上差了近百倍,这个差异是非常明显的,这就给黑客留下了“把柄”;

  4、meltdown和side-channel attack

    (1)利用时间差,可以做的攻击有很多,先举一个通俗易懂的栗子:暴力猜密码

           比如我设置了一个登陆密码“cnblogs”,用户输入密码后,后台验证的逻辑是逐个字符比对。比如用户输入djgnyd,第一个字符就不对,直接返回false;比如用户输入cjhtsf,第一个字符对了,再继续比对第二个,结果发现第二个错了,再次返回。这就给了黑客可乘之机:多次随机输入密码,利用不同的返回时间差猜测输入的密码是否正确!这就是业界俗称的side-channel attack;

     (2)meltdown和side-channel attack

              接下来介绍本文的重点:利用spectre和meltdown读取任意内存的数据,而不受任何权限限制;计算机的整个内存种,我们自己程序能用的只是一部分,还有很多内存是不能用的,比如部分内核的内存、其他进程的内存、其他虚拟机的内存(以下简称victim memory),操作系统会通过各种机制确保我们的程序无法访问(比如保护模式下的0~3环+CPL/DPL/RPL等机制控制、操作系统对内存rwx属性的管理)。如果不慎读到这些内存,windows会弹出c000005内存访问错误;如下:

           (2.1)假设蓝色是我们能正常使用的内存,红色是无法使用的victim内存;我们在蓝色区域开辟一个数组A(绿色表示),只有两个元素A[0]和A[1]; 通过A指针访问这两个元素是ok的;但是要想通过A+X越界直接访问victim内存是不行的,cpu或操作系统会直接阻止,并抛出异常或弹框报错;

     技术图片

   (2.2)同时继续再在蓝色区域开辟一个instrument 的数组,该数据所有数据一律不能存放cpu缓存(后面会解释原因);

   (2.3)接下来最关键的点来了:if(xxx) access Instrument[A[x]]

                     如果直接执行A[x],由于越界到victim内存,会被终止;但这个指令在if条件分支,cpu的乱序执行特性会先不判断if条件是否成立,而是直接access Instrument[A[x]];此时也不会检查A[x]是否越界,而是直接读取该内存数据;假如读取的数据是4,那么Instrument[A[x]] = G,这个G会被存到CPU缓存;然后又从Instrument0开始一致读取到7,判断哪个数据读取的速度最快(上面有解释:没在缓存的只能从内存读,理论速度差了近百倍),很明显第4个单元的耗时最断,反推出A[x]=4,导致该victim的内存数据泄露

      有读者肯定会问:就算是预测分支乱序执行,为啥不检查A[x]是否越界了?整个攻击最核心的点就在这里啊!个人猜测:这和是cpu、操作系统的分工不明确导致的;cpu提前预测分支指令执行,这时if条件是否成立还不知道了,又怎么去判断A[x]是否越界了? 所以cpu spectaculative设计人员把这个验证的事情甩给了操作系统内核,希望正常执行到该命令时操作系统内核能检查一下是否越界,如果有,再kill程序、抛出异常;但等到操作系统验证时为时已晚........

          技术图片

  这是核心的js代码:如果操作系统或浏览器没打补丁,理论上用户在浏览网页的时候,黑客可以通过这种方式从内存读取所有数据,导致密码等敏感数据泄露;

   技术图片

  下面是参考的文章,漏洞复现的demo下面的连接都有,这里就不贴出来了;

参考:https://www.freebuf.com/articles/system/159811.html  一步一步理解CPU芯片漏洞:Meltdown与Spectre

           https://meltdownattack.com/ 官网

           https://www.bilibili.com/video/av18144159?spm_id_from=333.788.b_765f64657363.1  15分钟读懂英特尔熔断幽灵漏洞-Emory

           https://www.fortinet.com/blog/threat-research/into-the-implementation-of-spectre  (中文翻译:https://zhuanlan.zhihu.com/p/33635193)Spectre 攻击详解(详细的demo代码)

           https://bbs.pediy.com/thread-224040.htm 简短的demo代码,非常适合入门学习原理

intel:spectre&Meltdown侧信道攻击(一)

标签:速度   绿色   ati   操作   指针   权限   diy   ctr   输入密码   

原文地址:https://www.cnblogs.com/theseventhson/p/13282921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!