- 936 if (!(flags & MAP_FIXED))
- 937 addr = round_hint_to_min(addr);
如果没有设置MAP_FIXED(区间的起始地址必须是由参数addr指定的,不允许变通)标志,也就是说创建的线性区的起始地址是可以改变的,那么调整地址addr=
round_hint_to_min
- 111 static inline unsigned long round_hint_to_min(unsigned long hint)
- /* */
- 112 {
- 113 hint &= PAGE_MASK;
- 114 if (((void *)hint != NULL) &&
- 115 (hint < mmap_min_addr))
- 116 return PAGE_ALIGN(mmap_min_addr);
- 117 return hint;
- 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进行执行,从而造成安全性问题。
阅读(1804) | 评论(0) | 转发(0) |