赞
踩
Polkit是一个应用程序级别的工具集,通过定义和审核权限规则,实现不同优先级进程间的通讯:控制决策集中在统一的框架之中,决定低优先级进程是否有权访问高优先级进程。
另外Polkit在系统层级进行权限控制,提供了一个低优先级进程和高优先级进程进行通讯的系统。和sudo等程序不同,Polkit并没有赋予进程完全的root权限,而是通过一个集中的策略系统进行更精细的授权。
目前主流Linux版本可能均受影响
漏洞出在pkexec命令上
在main函数里,如果传入的命令不是绝对路径,就会在PATH环境变量的目录里搜索
main (int argc, char *argv[]){
for (n = 1; n < (guint) argc; n++){
}
path = g_strdup (argv[n]);
if (path[0] != '/'){
s = g_find_program_in_path (path);
argv[n] = path = s;
}
}
....
for循环从下标1开始遍历argv[],但Linux里argv允许只包含一个元素,就是使用execve并给argv传入{0},此时argc就是0。
for循环结束之后,变量n为1。下面产生了第一个越界读,而后又产生了一个越界写,把g_find_program_in_path返回的指针尝试写回argv[1]。
调用execve之后,新进程的栈如下,新进程的栈如下:
巧合的是argv之后正好马上接的是envp的第一个元素,完全可控。只要不是/开头的字符串就会进入越界写的分支。如果能控制g_find_program_in_path返回的字符串,就可以注入任意的环境变量。
这个内存安全问题瞬间变成了一个逻辑漏洞。
GitHub Security Labs在去年就发过一篇Polkit的本地提权漏洞CVE-2021-3560,只是利用条件有一定的限制。
本地复现
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。