• 当前位置:首页>>编程开发A>>安全防御>>[AD_LAB-04003] Linux 2.6.* 内核Capability LSM模块进程特权信任状本地权限提升漏洞
  • [AD_LAB-04003] Linux 2.6.* 内核Capability LSM模块进程特权信任状本地权限提升漏洞
  • 创建时间:2004-12-23
    文章属性:原创
    文章提交:flashsky (flashsky1_at_sina.com)

    [安全通告]
    通告:[AD_LAB-04003] Linux 2.6.* 内核Capability LSM模块进程特权信任状本地权限提升漏洞
    分类:设计错误
    日期:12/20/2004
    CVE编号:NO
    受威胁的系统:
        Linux kernel 2.6.*
    未受威胁的系统:

    1.漏洞描述
    当POSIX权能(Capability)LSM未被编译进内核时,在插入Capability模块(commoncap.ko和capability.ko)后,所有已经存在的普通用户
    进程将具有所有的root特权!

    2.技术细节
    当特权操作由Capability LSM 模块控制时,系统基于进程信任状(creds)来仲裁特权操作。当Capability未被编译进内核时,内核使用默
    认的安全模块(security/dummy.c)仲裁特权操作,机制非常简单,仅仅检查进程euid、fsuid(进行文件系统相关特权操作时)是否为0。
    在这种情况下,dummy模块根本不关心进程的信任状,每个进程的信任状都拷贝其父进程的信任状。追根溯源,每个进程的信任状无论进程用
    户是否为超级用户,最终都拷贝Init进程的信任状,信任状中包含有超级用户进程的所有权能。在根据用户ID进行特权判断情况下,此错误未
    被激发。但在插入Capability模块后,特权机制转为根据进程信任状进行判断,而此前存在的任何进程的信任状都与Init进程一致,导致这些
    进程都具有超级用户root的特权。此错误的本质是装载Capability模块时没有对已有进程的信任状按Capability机制的要求进行重新计算。试
    验表明,此错误出现在2.6.* Linux内核中。

    示例:
    当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中通过。

    修正
    在 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;

    再次重复榆树测试示例,检查vim信任状如下

    $cat /proc/(pid of vim)/status

    Name: vim
    State: S (sleeping)
    SleepAVG: 91%
    Tgid: 2864
    Pid: 2864
    PPid: 1552
    TracerPid: 0
    Uid: 500 500 500 500
    Gid: 500 500 500 500
    FDSize: 256
    Groups: 500
    VmSize: 9360 kB
    VmLck: 0 kB
    VmRSS: 2816 kB
    VmData: 860 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: 0000000000000000
    CapEff: 0000000000000000

    3.感谢
        梁彬(liangbin@venustech.com.cn)发现并公布了此漏洞的具体技术细节
        感谢启明星辰技术信息有限公
  • 上一篇:[AD_LAB-04004] Microsoft Windows LoadImage API 整数溢出触发缓冲区溢出
    下一篇:Linux kernel pktcdvd ioctl break user space limit vulnerability