Linux内核的显存子系统在处理写时拷贝(Copy-on-Write,简写为COW)时存在条件竞争漏洞linux运维面试题,造成可以破坏私有只读显存映射。一个低权限的本地用户才能借助此漏洞获取其他只读显存映射的写权限,从而可以获取整个系统的最高权限。漏洞详情如下:
漏洞验证程序
POC链接地址如下:
受影响的范围
该漏洞从Linux内核版本>=2.6.22之后就开始存在,影响全版本Linux,直至2016年10月18日才修补。其中RedHat、Debian和Ubuntu三个发行版的受影响及修补情况见如下链接:
漏洞剖析
COW=CopyOnWrite写时复制,当程序打算写一块映射的区域,则会生成一块映射的复制,对此区域的任何更改都不会写回原先的文件。在一般的情况下,假如在COW时侯发生了缺页异常,则处理缺页异常的函数handle_mm_fault()函数则会停止页表写入并重试COW。
一般情况下,当一个程序写一个显存页,且这个数学页不可写的时侯,会触发异常,由于当前数学页在用户空间,不在内核空间中。所以调用handle_pte_fault,这个函数经过一系列的判定,发觉是由于显存页不可写引起的异常,则会调用do_wp_page来完成写时复制(COW)。不过,母子进程是以匿名映射来共享显存的,所以只须要完成reuse_swap_page即可。并且,会遗失FOLL_WRITE标志位。
假如另一个线程不停的告诉内核这个数学页不再须要、可以释放,当内核释放掉那种化学页后,handle_mm_fault在处理一个读错误(!pte_present)因而获得一个pagecache也就是文件的缓存。因而破坏私有映射完成只读文件的写入。
作者在修补代码中是这样处理的linux内核通杀提权漏洞预警,在解除映射的时侯检测了COW状态和页表的脏位(dirtybit),如右图所示:
作者在代码中降低了一个COW的标示来表示COW是否完成,设置COW位为未完成。并且linux内核通杀提权漏洞预警linux伊甸园,当程序要写一块显存时,必须满足以下条件:
这块显存可写或则完成COW并且脏位被设置。这样就保证了程序不会在没有COW的情况下完成写操作。
LINUX内核本地加壳漏洞修补建议申明