Chinaunix首页 | 论坛 | 博客
  • 博客访问: 231539
  • 博文数量: 37
  • 博客积分: 933
  • 博客等级: 军士长
  • 技术积分: 511
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-16 10:15
文章分类
文章存档

2012年(1)

2011年(36)

分类: LINUX

2011-03-29 11:32:47

  1. 936 if (!(flags & MAP_FIXED))
  2.  937 addr = round_hint_to_min(addr);
如果没有设置MAP_FIXED(区间的起始地址必须是由参数addr指定的,不允许变通)标志,也就是说创建的线性区的起始地址是可以改变的,那么调整地址addr= round_hint_to_min
  1. 111 static inline unsigned long round_hint_to_min(unsigned long hint)
  2.      /* */
  3.  112 {
  4.  113 hint &= PAGE_MASK;
  5.  114 if (((void *)hint != NULL) &&
  6.  115 (hint < mmap_min_addr))
  7.  116 return PAGE_ALIGN(mmap_min_addr);
  8.  117 return hint;
  9.  118 }
mmap_min_addr 根据你的配置设定其值,我的机器上为4096;此外,这个值还可以通过/proc文件系统提供给用户的接口进行修改
[root@localhost study]# cat /proc/sys/vm/mmap_min_addr
4096
[root@localhost study]# echo 8192 > /proc/sys/vm/mmap_min_addr
上述代码的目的:首先调整地址为4K页边界对齐,如果地址不为空,并且地址小于mmap_min_addr 则把将要创建的线性区的起始地址设为PAGE_ALIGN(mmap_min_addr),否则返回原来的addr值。
这里的设计思想是:根据你设定的最小映射的起始地址 如果指定的addr不为空并且小于最小的映射地址,就从这个起始地址开始创建。
 
引入的目的为了防止解引用NULL指针而造成的获得root权限问题。
也就是说一旦设置此值为大于等于4096,那么0----4096(线性地址的第一个页)是不允许进行mmap的。
 
这就从根本上杜绝了 将0---4096这一页映射为某shellcode进行执行,从而造成安全性问题。
阅读(1800) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~