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:
mu