码迷,mamicode.com
首页 > 系统相关 > 详细

Linux ASLR漏洞:攻击者可无限禁用ASLR

时间:2016-04-15 18:03:05      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:

  

技术分享

 

  近日,安全人员修复了一个Linux ASLR中比较古老的漏洞,拥有x86设备上的32位应用程序使用权限的任何用户,通过将RLIMIT_STACK资源设置为“无限制”可以禁用ASLR。

  该漏洞CVE编号为CVE-2016-3672,CNNVD编号为CNNVD-201604-092。

  2cto小科普:

  aslr)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。

  检测

  用户可以通过执行以下步骤检查其系统是否受到影响:

  1、创建显示内存映射的空项目:

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  #include

  int main(int argc, const char *argv[])

  {

  char cmd[256];

  sprintf(cmd, "cat /proc/%d/maps", getpid());

  system(cmd);

  return 0;

  }

  2、编译该程序:

  $ gcc show_maps.c -o show_maps # In a i386 machine

  $ gcc show_maps.c -o show_maps -m32 # In a 64-bit machine

  3、运行该程序检查ASLR是否工作:

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  $ for i in `seq 1 10`; do ./show_maps | grep "r-xp.*libc"; done

  f75c4000-f7769000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  f75db000-f7780000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  f7557000-f76fc000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  f7595000-f773a000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  f7574000-f7719000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  f75af000-f7754000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  f7530000-f76d5000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  f7529000-f76ce000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  f75c2000-f7767000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  f75fe000-f77a3000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  如果ibc-2.19.so库文件映射到随机位置,说明ASLR正常工作。

  那么将RLIMIT_STACK栈设置为“无限制”后运行相同的检测:

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  $ ulimit -a | grep stack

  stack size (kbytes, -s) 8192

  $ ulimit -s unlimited

  stack size (kbytes, -s) unlimited

  $ for i in `seq 1 10`; do ./show_maps | grep "r-xp.*libc"; done

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  5559a000-5573f000 r-xp 00000000 08:01 784726 /lib32/libc-2.19.so

  libc-2.19.so库文件映射到了相同的位置,说明ASLR被禁用。

  这是禁用ASLR的一种老方法,但不幸的是,当前的Linux系统中仍然存在该问题。

  漏洞简介

  该漏洞由于当栈大小设置为“无限制”时,ASLR Linux随机化所有的mmap基址。也就是说,当在i386和X86_64上使用legacy模式模拟X86_32时,程序只随机化栈和可执行文件,忽略了其他的mmapped文件(库文件,vDSO等),甚至在有些Linux版本中,可执行文件都不是随机化的。

  mmap_legacy_base()函数用来计算当栈大小设置为“无限制”时的库文件位置:

  static unsigned long mmap_legacy_base(void)

  {

  if (mmap_is_ia32())

  return TASK_UNMAPPED_BASE;

  else

  return TASK_UNMAPPED_BASE + mmap_rnd();

  }

  当系统运行在本地32位系统(i386)或32位模拟系统(x86_32)中时,该函数不会添加任何随机偏移。

  漏洞利用

  攻击者只需要将栈大小设置为“无限制”,然后运行一个32位应用程序,这种方法主要用于运行(攻击)提权应用,如setuid或setgid。

  影响

  拥有x86系统上32位应用运行权限的攻击者可以利用该漏洞禁用任意应用的ASLR,包括setuid和setgid程序。需要注意的是其实它本身并不算是一个漏洞,而是一种禁用ASLR的方式,攻击者可以将其与别的漏洞结合使用。由于i386(Intel 80386)的使用率比较高,受影响的系统和用户仍然十分广泛。

  修复

  该漏洞的补丁如下:

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  18

  19

  20

  21

  22

  23

  24

  25

  26

  27

  28

  29

  30

  31

  32

  diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c

  index 96bd1e2..389939f 100644

  --- a/arch/x86/mm/mmap.c

  +++ b/arch/x86/mm/mmap.c

  @@ -94,18 +94,6 @@ static unsigned long mmap_base(unsigned long rnd)

  }

  /*

  - * Bottom-up (legacy) layout on X86_32 did not support randomization, X86_64

  - * does, but not when emulating X86_32

  - */

  -static unsigned long mmap_legacy_base(unsigned long rnd)

  -{

  - if (mmap_is_ia32())

  - return TASK_UNMAPPED_BASE;

  - else

  - return TASK_UNMAPPED_BASE + rnd;

  -}

  -

  -/*

  * This function, called very early during the creation of a new

  * process VM image, sets up which VM layout function to use:

  */

  @@ -116,7 +104,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)

  if (current->flags & PF_RANDOMIZE)

  random_factor = arch_mmap_rnd();

  - mm->mmap_legacy_base = mmap_legacy_base(random_factor);

  + mm->mmap_legacy_base = TASK_UNMAPPED_BASE + random_factor;

  if (mmap_is_legacy()) {

  mm->mmap_base = mm->mmap_legacy_base;

  该补丁启用了legacy模式下的i386和X86_32上的库文件、vDSO和mmap请求的随机化,并将在下一个Linux版本中修复该问题

  http://www.biyinjishi.com/products/a70-b7010/

  http://www.biyinjishi.com/products/a70-b7015/

  http://www.biyinjishi.com/products/a70-b7020/

  http://www.biyinjishi.com/products/a70-b7050/

  http://www.biyinjishi.com/products/a70-b7060/

  http://www.biyinjishi.com/products/a70-b7099/

  http://www.biyinjishi.com/products/a99-b9920/

  http://www.biyinjishi.com/products/a99-b9925/

  http://www.biyinjishi.com/products/a99-b9960/

  http://www.biyinjishi.com/products/a99-b9999/

Linux ASLR漏洞:攻击者可无限禁用ASLR

标签:

原文地址:http://www.cnblogs.com/biyinjishi/p/5396242.html

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