linux keyring原理,Linux keyring提权漏洞分析(CVE

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

0x0 序

本文深入分析今年初公开的一个Linux提权漏洞,分析该漏洞之前先介绍下Linux密钥保留服务,该服务主要用于在内核中缓存身份验证数据,使内核可以快速访问所需的密钥,还可以将密钥的操作(keyctl, add_key, request_key)委托给用户态进程,同时该服务定义了两个标准密钥类型user和keyring。每个进程都可以为当前会话创建或替换一个匿名或指定名称的keyring,keyring对象有一个usage字段保留进程对该对象的引用次数,漏洞发生在替换相同名称keyring时,usage引用计数泄露。

0x1 漏洞原因

先来看看内核中的漏洞函数:

long join_session_keyring(const char *name)

{

const struct cred *old;

struct cred *new;

struct key *keyring;

long ret, serial;

//从当前task拷贝一份cred对象

new = prepare_creds();

//other code

//...

//find_keyring_by_name查找到和name匹配的keyring对象后

//内部调用atomic_inc_not_zero(&keyring->usage),增加引用计数

keyring = find_keyring_by_name(name, false);

if (PTR_ERR(keyring) == -ENOKEY) {

keyring = keyring_alloc(

name, old->uid, old->gid, old,

KEY_POS_ALL | KEY_USR_VIEW | KEY_USR_READ | KEY_USR_LINK,

KEY_ALLOC_IN_QUOTA, NULL);

if (IS_ERR(keyring)) {

ret = PTR_ERR(keyring);

goto error2;

}

} else if (IS_ERR(keyring)) {

ret = PTR_ERR(keyring);

goto error2;

} else if (keyring == new->session_keyring) {

ret = 0;

goto error2;//BUG在这里,直接跳到error2,没有调用key_put()减去引用计数

}

ret = install_session_keyring_to_cred(new, keyring);

if (ret < 0) goto error2; commit_creds(new); mutex_unlock(&key_session_mutex); ret = keyring->serial;

key_put(keyring); //减去引用计数

okay:

return ret;

error2:

mut

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值