首页
社区
课程
招聘
[讨论]Intel 曝出处理器设计漏洞,影响 Linux 和 Windows 内核
发表于: 2018-1-3 18:06 8818

[讨论]Intel 曝出处理器设计漏洞,影响 Linux 和 Windows 内核

2018-1-3 18:06
8818

为了解决 Intel 处理器芯片级的一个设计缺陷,Linux 和 Windows 系统需重新设计内核。


目前研究人员正抓紧检查 Linux 内核的安全问题,与此同时,微软也预计将在本月补丁日公开介绍 Windows 操作系统的相关变更。


而 Linux 和 Windows 系统的这些更新势必会对 Intel 的产品线造成冲击,预计可能会出现 5% 到 30% 的性能下降,具体还和处理器型号有关。


苹果的 macOS 也将需要进行更新,此缺陷也影响 Intel x86-64 的硬件,并且通过 microcode 更新无法解决此问题,必须是在系统级别的软件中进行修复,或者购买新的处理器。


虽然目前尚无公开的漏洞细节,但多少还是可以发现一些端倪。


过去十多年中生产的处理器都受到了影响,漏洞允许普通的 ring3 层应用(从数据库应用到 Web 浏览器)在一定程度上识别受到保护的内核空间布局。


而解决方法则是使用所谓的内核页表隔离机制(KPTI)将内核空间与用户进程完全分开,也就是将内核移入一个完全独立的地址空间,因此设备的运行速度将会大幅减慢。


参考链接:https://www.theregister.co.uk/2018/01/02/intel_cpu_design_flaw/


Intel 目前正在抓紧修复影响 Linux、Windows 和某些 macOS 系统的 CPU 设计缺陷。据研究人员透露,这个漏洞与内核中的虚拟内存系统有关,攻击者可借此访问内核中那些受保护的数据,如密码、登录密钥等。


根据 Python Sweetness 的文章,此类攻击对 Intel 处理器的影响是深远的,除了终端计算机,云端设备也受影响,例如 Amazon EC2、Microsoft Azure 和 Google Compute Engine 等。


Intel 在昨天发布的声明中表示:Intel 和其它安全厂商都意识到了该问题,漏洞有可能会收集内核中的敏感数据,但并不会修改或删除这些数据。


报道称漏洞是由设计错误造成的,这对 Intel 产品来说是很罕见的。基于迄今的分析,许多设备(包括不同供应商的处理器和操作系统)都易遭受此类攻击。

影响 Linux 内核的一些细节已经流出,但对这种技术的全面分析并没有公开,预计微软等厂商将在本月晚些时候披露缺陷的具体细节。


“Intel 将会通过负责任的方式披露该安全问题,这就是为什么 Intel 计划选择在下周(也就是等相关厂商公布更新后)披露这一问题,目前一些媒体的报道是有失偏颇的。”


Intel 在声明中表示,“Intel 正积极与其它技术公司合作,包括 AMD、ARM 控股的公司以及几个操作系统供应商,共同开发一套解决方案来应对这个问题。同时,Intel 也已经开始提供更新来缓解漏洞的有关利用。”


要解决该类型的攻击,研究人员需要彻底检查 Linux 和 NT 内核的虚拟内存系统。


微软可能将在下周的补丁日释出安全更新,而解决 Linux 内核漏洞的安全补丁已于上周推送,另据报道,苹果的 64 位 macOS 系统也需要进行更新。


Python Sweetness 的文章表示,修复补丁将会影响 CPU 的性能,预计会降低 5% 到 30%。但 Intel 却表示,对性能的影响取决于系统工作负载,至少对普通计算机用户来说影响并不显著。


还有一些研究人员,例如 Positive Technologies 的 Max Goryachy,认为补丁并不能完全解决这个问题,他表示这个漏洞只能在新版本的 CPU 中才能得到完全解决。


虽然还没有一个官方的叫法,但研究人员已经将修复方法命名为了KPTI(Kernel Page Table Isolation)或 KAISER(Kernel Address Isolation to

have Side-channels Efficiently Removed)。


该设计缺陷与 Intel 处理器在 “内核模式” 和 “用户模式” 下内存切换的管理方式有关,已经有文章探讨了其中的一些细节,称该技术允许 ring3 程序在一定程度上识别受保护的内核空间布局。


该文还称,内核页表隔离机制(KPTI)会将内核内存与用户态进程分开,也就是将内核移到一个完全独立的地址空间中,所以对于普通进程来说是不可见的。KPTI 技术利用了 Intel 处理器的地址切换方式、缓存数据转储以及内存数据的重载。



目前,操作系统厂商已经发布补丁更新,如Linux, Apple和Android,微软也已发布补丁更新。


建议用户及时下载补丁进行更新,参考链接:


Linux:http://appleinsider.com/articles/18/01/03/apple-has-already-partially-implemented-fix-in-macos-for-kpti-intel-cpu-security-flaw

Android:https://source.android.com/security/bulletin/2018-01-01

Microsoft:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/ADV180002


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个漏洞略叼,打了KPTI补丁之后内核访问用户态内存都要切CR3了,TLB全清,真是修复了现存INTEL-CPU过于流畅的问题。
PS:牙膏厂补上洞再坑一波钱美滋滋。
2018-1-3 18:27
0
雪    币: 199
活跃值: (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
这不是真的,我不要换cpu
2018-1-3 18:54
0
雪    币: 416
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这是要把牙膏往回吸的节奏啊。
2018-1-3 22:49
0
雪    币: 30
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
奇葩了,我的电脑我做主,ring3  层应用识别受到保护的内核空间布局又怎么地。呵呵,你微软个人操作系统也紧张个卯毛?
2018-1-4 00:22
0
雪    币: 8764
活跃值: (5240)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
win7  不会修复这个漏洞...
2018-1-4 11:03
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
关注中。。。
2018-1-4 21:20
0
雪    币: 226
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
话说inter出的检测工具哪里可以下载到
2018-1-5 08:54
0
雪    币: 405
活跃值: (2280)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
//  SpecuCheck.cpp  :  Defines  the  entry  point  for  the  console  application.
//
/*Module  Name:

specucheck.c

Abstract:

This  module  implements  a  checker  app  for  CVE-2017-5754  and  CVE-2017-5715

Author:

Alex  Ionescu  (@aionescu)  03-Jan-2018  -  Initial  version

Environment:

User  mode  only.

--*/

//
//  OS  Headers
//
#include  <windows.h>
#include  <winternl.h>
#include  <stdio.h>

int  Spectre_main(int  argc,  char*  argv[]);


#define  NT_SUCCESS(Status)  ((NTSTATUS)(Status)  >=  0)

typedef  NTSTATUS  (__stdcall  *ZWQUERYSYSTEMINFORMATION)  (
       __in  SYSTEM_INFORMATION_CLASS  SystemInformationClass,
       __out_bcount_opt(SystemInformationLength)  PVOID  SystemInformation,
       __in  ULONG  SystemInformationLength,
       __out_opt  PULONG  ReturnLength
       );
//
//  Internal  structures  and  information  classes
//
#define  SystemSpeculationControlInformation  (SYSTEM_INFORMATION_CLASS)201
typedef  struct  _SYSTEM_SPECULATION_CONTROL_INFORMATION
{
       struct
       {
               ULONG  BpbEnabled  :  1;
               ULONG  BpbDisabledSystemPolicy  :  1;
               ULONG  BpbDisabledNoHardwareSupport  :  1;
               ULONG  SpecCtrlEnumerated  :  1;
               ULONG  SpecCmdEnumerated  :  1;
               ULONG  IbrsPresent  :  1;
               ULONG  StibpPresent  :  1;
               ULONG  SmepPresent  :  1;
               ULONG  Reserved  :  24;
       }  SpeculationControlFlags;
}  SYSTEM_SPECULATION_CONTROL_INFORMATION,  *PSYSTEM_SPECULATION_CONTROL_INFORMATION;

#define  SystemKernelVaShadowInformation          (SYSTEM_INFORMATION_CLASS)196
typedef  struct  _SYSTEM_KERNEL_VA_SHADOW_INFORMATION
{
       struct
       {
               ULONG  KvaShadowEnabled  :  1;
               ULONG  KvaShadowUserGlobal  :  1;
               ULONG  KvaShadowPcid  :  1;
               ULONG  KvaShadowInvpcid  :  1;
               ULONG  Reserved  :  28;
       }  KvaShadowFlags;
}  SYSTEM_KERNEL_VA_SHADOW_INFORMATION,  *PSYSTEM_KERNEL_VA_SHADOW_INFORMATION;

//
//  Welcome  Banner
//
const  WCHAR  WelcomeString[]  =  L"SpecuCheck  v1.0.0  --  Copyright  (c)  2018  Alex  Ionescu\n"
L"http://www.alex-ionescu.com  -  @aionescu\n"
L"----------------------------------------------------\n\n";

//
//  Error  String
//
const  WCHAR  UnpatchedString[]  =  L"Your  system  either  does  not  have  the  appropriate  patch,  "
L"or  it  may  not  support  the  information  class  required.\n";

//
//  Error  codes  used  for  clarity
//
typedef  enum  _SPC_ERROR_CODES
{
       SpcSuccess  =  0,
       SpcFailedToOpenStandardOut  =  -2,
       SpcFailedToQueryKvaShadowing  =  -3,
       SpcFailedToQuerySpeculationControl  =  -4,
}  SPC_ERROR_CODES;

INT
SpcMain  (
                 VOID
                 )
{
       HANDLE  hStdOut;
       NTSTATUS  status;
       //BOOL  boolResult;
       SYSTEM_KERNEL_VA_SHADOW_INFORMATION  kvaInfo;
       SYSTEM_SPECULATION_CONTROL_INFORMATION  specInfo;
       SPC_ERROR_CODES  errorCode;
       WCHAR  stateBuffer[512];
       INT  charsWritten;
       ZWQUERYSYSTEMINFORMATION    NtQuerySystemInformation  =  NULL;
       HMODULE  hntdll  =  GetModuleHandle(L"ntdll.dll");

       if  (!hntdll)
       {
               return  SpcSuccess;
       }
        NtQuerySystemInformation    =  (ZWQUERYSYSTEMINFORMATION)GetProcAddress(hntdll,  "NtQuerySystemInformation");
       if  (!NtQuerySystemInformation)
       {
               return  SpcSuccess;
       }
       //
       //  Open  the  output  handle  --  also  not  much  we  can  do  if  this  fails
       //
       hStdOut  =  CreateFile(L"CONOUT$",
               GENERIC_WRITE,
               0,
               NULL,
               OPEN_EXISTING,
               0,
               NULL);
       if  (hStdOut  ==  INVALID_HANDLE_VALUE)
       {
               hStdOut  =  INVALID_HANDLE_VALUE;
               errorCode  =  SpcFailedToOpenStandardOut;
               goto  Exit;
       }

       //
       //  We  now  have  display  capabilities  --  say  hello!
       //
       WriteConsole(hStdOut,  WelcomeString,  ARRAYSIZE(WelcomeString)  -  1,  NULL,  NULL);

       //
       //  Get  the  KVA  Shadow  Information
       //
       status  =  NtQuerySystemInformation(SystemKernelVaShadowInformation,
               &kvaInfo,
               sizeof(kvaInfo),
               NULL);
       if  (!NT_SUCCESS(status))
       {
               //
               //  Print  out  an  error  if  this  failed
               //
               WriteConsole(hStdOut,
                       UnpatchedString,
                       ARRAYSIZE(UnpatchedString)  -  1,
                       NULL,
                       NULL);
               errorCode  =  SpcFailedToQueryKvaShadowing;
               goto  Exit;
       }

       //
       //  Get  the  Speculation  Control  Information
       //
       status  =  NtQuerySystemInformation(SystemSpeculationControlInformation,
               &specInfo,
               sizeof(specInfo),
               NULL);
       if  (!NT_SUCCESS(status))
       {
               //
               //  Print  out  an  error  if  this  failed
               //
               WriteConsole(hStdOut,
                       UnpatchedString,
                       ARRAYSIZE(UnpatchedString)  -  1,
                       NULL,
                       NULL);
               errorCode  =  SpcFailedToQuerySpeculationControl;
               goto  Exit;
       }

       //
       //  Print  status  of  KVA  Features
       //
       charsWritten  =  swprintf_s(stateBuffer,
               ARRAYSIZE(stateBuffer),
               L"KVA  Shadowing  Enabled:  %s\n"
               L"KVA  Shadowing  with  User  Pages  Marked  Global:  %s\n"
               L"KVA  Shadowing  with  PCID  Support:  %s\n"
               L"KVA  Shadowing  with  INVPCID  Support:  %s\n\n",
               kvaInfo.KvaShadowFlags.KvaShadowEnabled  ?  L"yes"  :  L"no",
               kvaInfo.KvaShadowFlags.KvaShadowUserGlobal  ?  L"yes"  :  L"no",
               kvaInfo.KvaShadowFlags.KvaShadowPcid  ?  L"yes"  :  L"no",
               kvaInfo.KvaShadowFlags.KvaShadowInvpcid  ?  L"yes"  :  L"no");
       WriteConsole(hStdOut,  stateBuffer,  charsWritten,  NULL,  NULL);

       //
       //  Print  status  of  Speculation  Control  Features
       //
       charsWritten  =  swprintf_s(stateBuffer,
               ARRAYSIZE(stateBuffer),
               L"BPB  Enabled:  %s\n"
               L"BPB  Disabled  due  to  System  Policy:  %s\n"
               L"BPB  Disabled  due  to  No  Hardware  Support:  %s\n"
               L"Speculation  Controls  Enumerated:  %s\n"
               L"Speculation  Commands  Enumerated:  %s\n"
               L"IBRS  Speculation  Control  Present:  %s\n"
               L"STIBP  Speculation  Control  Present:  %s\n"
               L"Supervisor  Mode  Execution  Prevention  Present:  %s\n",
               specInfo.SpeculationControlFlags.BpbEnabled  ?  L"yes"  :  L"no",
               specInfo.SpeculationControlFlags.BpbDisabledSystemPolicy  ?  L"yes"  :  L"no",
               specInfo.SpeculationControlFlags.BpbDisabledNoHardwareSupport  ?  L"yes"  :  L"no",
               specInfo.SpeculationControlFlags.SpecCtrlEnumerated  ?  L"yes"  :  L"no",
               specInfo.SpeculationControlFlags.SpecCmdEnumerated  ?  L"yes"  :  L"no",
               specInfo.SpeculationControlFlags.IbrsPresent  ?  L"yes"  :  L"no",
               specInfo.SpeculationControlFlags.StibpPresent  ?  L"yes"  :  L"no",
               specInfo.SpeculationControlFlags.SmepPresent  ?  L"yes"  :  L"no");
       WriteConsole(hStdOut,  stateBuffer,  charsWritten,  NULL,  NULL);

       //
       //  This  is  our  happy  path 
       //
       errorCode  =  SpcSuccess;

Exit:
       //
       //  Close  output  handle  if  needed
       //
       if  (hStdOut  !=  INVALID_HANDLE_VALUE)
       {
               CloseHandle(hStdOut);
       }

       //
       //  Return  the  error  code  back  to  the  caller,  for  debugging
       //
       return  errorCode;
}


int  main(int  argc,  CHAR*  argv[])
{
       SpcMain();
       return  0;
}
看了下,采用的应该是类似LINUX下的KAISER技术,采用shadow  页表技术,R3,R0用不同的页表,内核地址在R3中只有极少数被映射,大部分都无效,R0中的都有效,并且R3地址也都能访问,只通过SMAP和SMEP来进行保护。
2018-1-5 17:13
0
雪    币: 1054
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
膜拜
2018-1-5 17:18
0
雪    币: 405
活跃值: (2280)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
在打了新的WIN10  补丁后,我们在  KPROCESS  里会看到

0:  kd>  dt  nt!_EPROCESS  @$proc  ImageFileName  Pcb.DirectoryTableBase  Pcb.UserDirectoryTableBase
***  ERROR:  Module  load  completed  but  symbols  could  not  be  loaded  for  LiveKdD.SYS
      +0x000  Pcb                                                :
            +0x028  DirectoryTableBase                  :  0x1ab002
            +0x278  UserDirectoryTableBase          :  0x2f00001
      +0x450  ImageFileName                            :  [15]    "System"
新的UserDirectoryTableBase  用来保存R3  的CR3  ,而原来的DirectoryTableBase则为R0的CR3


0:  kd>  ?  nt!KiSystemCall64Shadow
Evaluate  expression:  -8787652898496  =  fffff801`f7121140
0:  kd>  !vtop  1ab000  fffff801f7121140
Amd64VtoP:  Virt  fffff801`f7121140,  pagedir  1ab000
Amd64VtoP:  PML4E  1abf80
Amd64VtoP:  PDPE  3b09038
Amd64VtoP:  PDE  3b0adc0
Amd64VtoP:  Large  page  mapped  phys  00000002`18121140
Virtual  address  fffff801f7121140  translates  to  physical  address  218121140.

0:  kd>  !vtop  2f00000  fffff801f7121140
Amd64VtoP:  Virt  fffff801`f7121140,  pagedir  2f00000
Amd64VtoP:  PML4E  2f00f80
Amd64VtoP:  PDPE  eb3038
Amd64VtoP:  PDE  ab2dc0
Amd64VtoP:  PTE  eb9908
Amd64VtoP:  Mapped  phys  00000002`18121140
Virtual  address  fffff801f7121140  translates  to  physical  address  218121140.
  而比较重要的nt!KiSystemCall64Shadow,在2个表中都有映射,指向同一物理地址218121140

0:  kd>  !pcr
KPCR  for  Processor  0  at  fffff801f5b22000:
        Major  1  Minor  1
                NtTib.ExceptionList:  fffff801f9664fb0
                        NtTib.StackBase:  fffff801f9663000
                      NtTib.StackLimit:  0000000000000000
                  NtTib.SubSystemTib:  fffff801f5b22000
                            NtTib.Version:  00000000f5b22180
                    NtTib.UserPointer:  fffff801f5b22870
                            NtTib.SelfTib:  00000058e0504000

                                        SelfPcr:  0000000000000000
                                              Prcb:  fffff801f5b22180
                                              Irql:  0000000000000000
                                                IRR:  0000000000000000
                                                IDR:  0000000000000000
                            InterruptMode:  0000000000000000
                                                IDT:  0000000000000000
                                                GDT:  0000000000000000
                                                TSS:  0000000000000000

                            CurrentThread:  fffff801f72a4380
                                  NextThread:  0000000000000000
                                  IdleThread:  fffff801f72a4380

                                    DpcQueue:  Unable  to  read  nt!_KDPC_DATA.DpcListHead.Flink  @  fffff801f5b24f80

0:  kd>  !vtop  2f00000  fffff801f5b24f80
Amd64VtoP:  Virt  fffff801`f5b24f80,  pagedir  2f00000
Amd64VtoP:  PML4E  2f00f80
Amd64VtoP:  PDPE  eb3038
Amd64VtoP:  PDE  ab2d68
Amd64VtoP:  PTE  37b6920
Amd64VtoP:  zero  PTE
Virtual  address  fffff801f5b24f80  translation  fails,  error  0xD0000147.

0:  kd>  !vtop  1ab000  fffff801f5b24f80
Amd64VtoP:  Virt  fffff801`f5b24f80,  pagedir  1ab000
Amd64VtoP:  PML4E  1abf80
Amd64VtoP:  PDPE  3b09038
Amd64VtoP:  PDE  3b0ad68
Amd64VtoP:  PTE  510d920
Amd64VtoP:  Mapped  phys  f88f80
Virtual  address  fffff801f5b24f80  translates  to  physical  address  f88f80.

而另一个内核地址,只在R0被影射为物理地址f88f80.而在R3没有映射

提示错误  Virtual  address  fffff801f5b24f80  translation  fails,  error  0xD0000147.
2018-1-5 17:48
0
雪    币: 30
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
与其说这是个漏洞,不如说这是个福音,微软这个死垃圾厚脸无耻把驱动圈起来收钱,补丁不用打了,我正研究怎么实现这个漏洞,玩一玩windows10这个垃圾系统
2018-1-6 18:15
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
13
wx_邱晖 与其说这是个漏洞,不如说这是个福音,微软这个死垃圾厚脸无耻把驱动圈起来收钱,补丁不用打了,我正研究怎么实现这个漏洞,玩一玩windows10这个垃圾系统
神tm福音
2018-1-7 07:10
0
雪    币: 1048
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
2018-1-7 15:17
0
游客
登录 | 注册 方可回帖
返回
//