Linux kernel是美国Linux基金会发布的操作系统Linux所使用的内核。NFSv4 implementation是其中的一个分布式文件系统协议。 Linux Kernel的实现上存在漏洞,本地攻击者可能利用此漏洞提升自己的权限。 Linux Kernel的fs/splice.c文件中的vmsplice_to_user()函数错误地引用了用户提供的内存指针: ---8<;--- fs/splice.c:1378 ---8<--- error = get_user(base, &iov->iov_base); /* ... */ if (unlikely(!base)) { error = -EFAULT; break; } /* ... */ sd.u.userptr = base; /* ... */ size = __splice_from_pipe(pipe, &sd, pipe_to_user); ---8<--- fs/splice.c:1401 ---8<--- 这段代码没有验证这些指针。__splice_from_pipe()假设这些指针为有效的用户内存指针,没有执行任何验证。函数用pipe_to_user()中的__copy_to_user_inatomic()函数引用了指针,以便将数据写入用户进程内存,导致可能将从管道读取的任意数据写入到内核内存。本地攻击者可以通过特制的vmsplice()系统调用导致获得root用户权限。
Linux kernel是美国Linux基金会发布的操作系统Linux所使用的内核。NFSv4 implementation是其中的一个分布式文件系统协议。 Linux Kernel的实现上存在漏洞,本地攻击者可能利用此漏洞提升自己的权限。 Linux Kernel的fs/splice.c文件中的vmsplice_to_user()函数错误地引用了用户提供的内存指针: ---8<;--- fs/splice.c:1378 ---8<--- error = get_user(base, &iov->iov_base); /* ... */ if (unlikely(!base)) { error = -EFAULT; break; } /* ... */ sd.u.userptr = base; /* ... */ size = __splice_from_pipe(pipe, &sd, pipe_to_user); ---8<--- fs/splice.c:1401 ---8<--- 这段代码没有验证这些指针。__splice_from_pipe()假设这些指针为有效的用户内存指针,没有执行任何验证。函数用pipe_to_user()中的__copy_to_user_inatomic()函数引用了指针,以便将数据写入用户进程内存,导致可能将从管道读取的任意数据写入到内核内存。本地攻击者可以通过特制的vmsplice()系统调用导致获得root用户权限。