首页
社区
课程
招聘
[求助]linux 内核提权的问题
2015-8-25 11:06 6215

[求助]linux 内核提权的问题

2015-8-25 11:06
6215
最近刚分析近几年的linux内核提权,遇到一个问题:
thread_info 中的addr_limit 一般是界定用户态进程的地址空间上限。
很多提权是将addr_limit修改为:0xffffffff。。。以覆盖到内核空间,达到内核任意地址读写目的。
但最近看keentime的blackhat的ppt,其中写道:shellcode的功能,是将thread_info 的addr_limit修改为0,然后利用pipe对内核任意地址进行读写。
不解为啥addr_limit=0,也能对内核任意地址进行读写呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
打赏
分享
最新回复 (2)
雪    币: 29
活跃值: (280)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
endlif 1 2018-12-18 20:38
2
0
同没搞懂为什么这里addr_limit置0 会任意地址写  有大佬知道的可以点拨下么0.0

雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeneBlue 2 2019-1-16 11:16
3
0
endlif 同没搞懂为什么这里addr_limit置0 会任意地址写  有大佬知道的可以点拨下么0.0
0xffffffff 是指在32位 usr 可访问的空间由 3gb(0xBFFFFFFF) 扩展到 4gb(0xFFFFFFFF),直接写0也是没错的,因为内核就这样做,当内核想要关闭地址空间的限制时直接执行  set_fs(KERNEL_DS),从以下代码看,KERNEL_DS 的值就是 0


```
#define MAKE_MM_SEG(s)        ((mm_segment_t) { (s) })

#ifndef KERNEL_DS
#define KERNEL_DS        MAKE_MM_SEG(~0UL)
#endif

#ifndef USER_DS
#define USER_DS                MAKE_MM_SEG(TASK_SIZE - 1)
#endif

#ifndef get_fs
#define get_ds()        (KERNEL_DS)
#define get_fs()        (current_thread_info()->addr_limit)

static inline void set_fs(mm_segment_t fs)
{
       current_thread_info()->addr_limit = fs;
}
#endif
```
游客
登录 | 注册 方可回帖
返回