Linux内核Capability LSM模块进程特权信任状本地权限提升漏洞 (Linux,缺陷) |
涉及程序: |
Linux内核程序 |
描述: |
Linux内核Capability LSM模块进程特权信任状本地权限提升漏洞 |
详细: |
Linux Kernel是开放源代码操作系统Linux的内核。 Linux Kernel在处理Capability模块实现时存在问题,本地攻击者可以利用这个漏洞提升权限。 当特权操作由Capability LSM 模块控制时,系统基于进程信任状(creds)来仲裁特权操作。当Capability未被编译进内核时,内核使用默认的安全模块(security/dummy.c)仲裁特权操作,机制非常简单,仅仅检查进程euid、fsuid(进行文件系统相关特权操作时)是否为0。在这种情况下,dummy模块根本不关心进程的信任状,每个进程的信任状都拷贝其父进程的信任状。追根溯源,每个进程的信任状无论进程用户是否为超级用户,最终都拷贝Init进程的信任状,信任状中包含有超级用户进程的所有权能。在根据用户ID进行特权判断情况下,此错误未被激发。但在插入Capability模块后,特权机制转为根据进程信任状进行判断,而此前存在的任何进程的信任状都与Init进程一致,导致这些进程都具有超级用户root的特权。此错误的本质是装载Capability模块时没有对已有进程的信任状按Capability机制的要求进行重新计算。试验表明,此错误出现在2.6.* Linux内核中。 <*来源:liangbin (liangbin@venustech.com.cn) 链接:http://marc.theaimsgroup.com/?l=bugtraq&m=110384535113035&w=2 *> 受影响系统: Linux kernel 2.6.9 Linux kernel 2.6.8 Linux kernel 2.6.7 Linux kernel 2.6.6 Linux kernel 2.6.5 Linux kernel 2.6.4 Linux kernel 2.6.3 Linux kernel 2.6.2 Linux kernel 2.6.1 Linux kernel 2.6 |
攻击方法: |
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负! 当Capability模块未被编译进内核时,(如果已经编译进内核,须disable相应编译选项后重新编译内核)。在装载Capability模块前,以普通用户身份允许一个vim编辑器,在vim种输入命令: :r /etc/shadow vim 将回应 “can't open file /etc/shadow”,这个访问root文件操作的操作被拒绝。 不要终结vim,转到其它控制台以root身份登录,插入Capability模块: #modprobe capability 在模块被转载后,回到vim中再次尝试打开shadow文件,将发现能够以普通用户读写并且保存(w!)shadow文件!根本的原因是vim进程的信任状中包含了权能CAP_DAC_OVERRIDE和CAP_DAC_READ_SEARCH,因而能够进行超越访问控制策略的特权操作。 使用以下命令可查看vim的信任状: $cat /proc/2454/status (2454 是vim进程的pid) Name: vim State: S (sleeping) SleepAVG: 91% Tgid: 2454 Pid: 2454 PPid: 1552 TracerPid: 0 Uid: 500 500 500 500 Gid: 500 500 500 500 FDSize: 256 Groups: 500 VmSize: 9356 kB VmLck: 0 kB VmRSS: 2728 kB VmData: 856 kB VmStk: 16 kB VmExe: 1676 kB VmLib: 3256 kB Threads: 1 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 8000000000003000 SigCgt: 00000000ef824eff CapInh: 0000000000000000 CapPrm: 00000000ffffffff CapEff: 00000000fffffeff 最后3行即是vim的信任状,可以看到它具有除了CAP_SETPCAP外的所有Capability权能。 以上测试在 2.6.* 和2.5.72-lsm1中通过。 |
解决方案: |
临时解决方法: 如果您不能立刻安装补丁或者升级,CNNS建议您采取以下措施以降低威胁: * 第三方补丁如下: 在 security/capability.c中加入以下代码 static void recompute_capability_creds(struct task_struct *task) { if(task->pid <= 1) return; task_lock(task); task->keep_capabilities = 0; if ((task->uid && task->euid && task->suid) && !task->keep_capabilities) cap_clear (task->cap_permitted); else task->cap_permitted = CAP_INIT_EFF_SET; if (task->euid != 0){ cap_clear (task->cap_effective); } else{ task->cap_effective = CAP_INIT_EFF_SET; } if(task->fsuid) task->cap_effective &= ~CAP_FS_MASK; else task->cap_effective |= CAP_FS_MASK; task_unlock(task); return; } 并且在已有capability_init 函数在其返回前加入以下代码: struct task_struct *task; read_lock(&tasklist_lock); for_each_process(task){ recompute_capability_creds(task); } read_unlock(&tasklist_lock); return 0; 厂商补丁: Linux ----- 目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本: http://www.kernel.org/ |
Linux 2.6.* 内核Capability LSM模块进程特权信任状本地权限提升漏洞
最新推荐文章于 2020-06-21 17:23:49 发布