Linux内核爆安全漏洞 可通过exploit获取root权限

最近Linux 内核爆出了一个严重的安全漏洞,非root用户可以通过该漏洞的exploit 获取root权限。这并不罕见,值得一提的是这个补丁看起来如此平常以至于我们绝大多数人都不会以为这是安全问题。

先看这个问题的补丁,就是下面这个:

staticint perf_swevent_init(struct perf_event *event){-int event_id = event->attr.config;+	u64 event_id = event->attr.config;if(event->attr.type != PERF_TYPE_SOFTWARE)return-ENOENT;

我们第一眼的感觉就是这大概只是修复了编译器报的一个小警告吧,怎么会引起如此严重的安全问题呢?

在没打补丁的代码中 event_id 是个带符号的整型,而且就在下面不远处的两行代码中只检查了其上界:

if(event_id>= PERF_COUNT_SW_MAX)return-ENOENT;

而如果传递进来的 event->attr.config 值正好设置了符号位,那么 event_id 就会变成负值,而且能躲过上面的检查。

负值意味着什么呢?再继续看后面的代码:

if(!event->parent){int err;
 
                err = swevent_hlist_get(event);if(err)return err;
 
                atomic_inc(&perf_swevent_enabled[event_id]);
                event->destroy = sw_perf_event_destroy;}

意味着数组越界!这时你应该身上开始冒冷汗了。继续,数组 perf_swevent_enabled[] 在 RHEL6 上的定义是:

atomic_t perf_swevent_enabled[PERF_COUNT_SW_MAX];

而 atomic_t 基本上就是int,也就是说 perf_swevent_enabled[] 是整型数组,那么用 event_id 访问该数组时会把 event_id 的值乘以4再加上数组的起始地址。很简单哈!

好,通过 System.map 文件我们可以得到 perf_swevent_enabled 的地址:

ffffffff81f360c0 B perf_swevent_enabled

那么当 event->attr.config == 0xffffffff (即有符号的-1)时,在 x86_64 上面我们最终会得到:

0xffffffffffffffff * 4 + 0xffffffff81f360c0 == 0xFFFFFFFF81F360BC

同理,当 event->attr.config == 0xfffffffe 时我们得到:

0xfffffffffffffffe * 4 + 0xffffffff81f360c0 == 0xFFFFFFFF81F360B8

所以上述的 atomic_inc() 其实增加的是前面两个地址中存放的值,而这俩地址都指向内核空间(参见 Documentation/x86/x86_64/mm.txt)!这时你应该感到紧张了。。。

后面更有趣的事情发生在 sw_perf_event_destroy() 函数中,它是在 perf_event_open() 返回的 fd 被关闭时被调用,RHEL6 上其定义如下:

staticvoid sw_perf_event_destroy(struct perf_event *event){
        u64 event_id = event->attr.config;
 
        WARN_ON(event->parent);
 
        atomic_dec(&perf_swevent_enabled[event_id]);
        swevent_hlist_put(event);}

很明显的不同是,event_id 这次是无符号的类型。那么,同上,当 event->attr.config == 0xffffffff 时我们得到:

0xffffffff * 4 + 0xffffffff81f360c0 == 0x0000000381F360BC

当 event->attr.config == 0xfffffffe 时我们得到:

0xfffffffe * 4 + 0xffffffff81f360c0 == 0x0000000381F360B8

所以这里的 atomic_dec() 实际上减小的是用户空间地址内的值。

上面是“基础知识”,带着这些知识我们看 exploit 代码究竟做了什么,代码片段如下:

#define BASE 0x380000000
#define SIZE 0x010000000
assert((map = mmap((void*)BASE, SIZE, 3, 0x32, 0,0)) == (void*)BASE);
memset(map, 0, SIZE);
sheep(-1); sheep(-2); // sheep will just invoke perf_event_open
// syscall with attr.config set to the param
for (i = 0; i 
 
assert(map[i+1]);
break;
}

它首先会 mmap() 起始地址是 0×380000000 的一块内存区域。然后分别以 attr.config 为 -1 和 -2 调用两次 perf_event_open()。根据前面的计算,它实际上分别增加了 0xFFFFFFFF81F360BC 和 0xFFFFFFFF81F360B8 两处内存的值,减少了 0x0000000381F360BC 和 0x0000000381F360B8 的值。后面的 for 循环则是找出被减少的内存地址,这样一来也就可以算出 perf_swevent_enabled[] 数组的地址(System.map 并不总是存在,如果存在而且可读我们当然可以直接去读这个值)。

知道这个地址我们就可以操纵内核中某处的32bit的值,把其值加一。正因为如此,作者巧妙地选择了中断描述符表——一个16字节描述符的数组,它的地址可以通过 sidt 指令获取。它其中的描述符结构定义如下:

Offset 	Size 	Description
0 	2 	Offset low bits (0..15)
2 	2 	Selector (Code segment selector)
4 	1 	Zero
5 	1 	Type and Attributes (same as before)
6 	2 	Offset middle bits (16..31)
8 	4 	Offset high bits (32..63)
12 	4 	Zero

这里最有趣的是 offset 为8 的地方,在 x86_64 上面其值为 0xffffffff。作者选择的中断描述符是 0×4,所以相对于中断描述符表它的偏移实际上是 0×48。现在的任务就成了通过 perf_swevent_enabled[] 来计算出该中断描述符中偏移为8的内存地址,并对其加一!下面的代码就是做的这个工作:

sheep(-i + (((idt.addr&0xffffffff)-0x80000000)/4) + 16);

i 是我们前面在 for 循环中搜到的 perf_swevent_enabled[] 的一个偏移,idt.addr 是中断描述符表的绝对内核地址,取其低32位并减去 0×80000000 是为了得到低28位作为偏移,除以4是因为数组是int,最后加的16就是 0×4 中断描述符中的偏移(4已经除去了),所以最终sheep()里面的参数就是我们想要的偏移,这样以来内核就替我们把 0×4 中断描述符中的偏移为 8 的 0xffffffff 加上了1,也就成了0,也就成了用户空间的地址!所以后面的 int 0×4 其实就会跳转到用户空间早已经设置好的代码!!!

而这段代码比较生涩,但其意思就是更改当前进程的 uid/gid 为0来提升权限,所以最终取得一个有 root 权限的 shell!整个攻击大功告成!

注:上面的链接可能不能用,exploit 代码也可以在这里看到:https://gist.github.com/onemouth/5625174

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/132441.html<

(0)
管理的头像管理
上一篇2025-02-27 00:37
下一篇 2025-02-27 00:38

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注