从CVE漏洞分析到安全防护复盘
统信安全应急响应中心第一时间发布了漏洞修复方案
pkexec为suid程序
当argc(命令行参数个数变量)为0时,pkexec会读取argv[1]变量,而由于Linux进程的内存布局中环境变量是紧接着命令行参数的,因此实际上会读取到第一个环境变量。
读取到argv[1]之后,若其不是以/开头的(即不是绝对路径),则pkexec会将其理解为相对路径,继而会在环境变量中查找PATH变量,将其转换为实际路径。
若PATH环境变量包含一个攻击者可控的路径,则pkexec转换后的实际路径将会是这个攻击者可控的路径下的一个子目录,则显然此实际路径也是攻击者可控的。
pkexec会对argv[1]赋值,将其修改为上述得到的实际路径,但是我们知道argv[1]此时实际上指向的是pkexec的第一个环境变量,也就是说,pkexec将自己的第一个环境变量修改为这个实际路径了。
pkexec会在程序运行过程中调用g_printerr函数,这个函数会在运行的时候按需载入GCONV_PATH环境变量指向的路径下的gconv-modules文件中写明的外部动态链接库(so),并运行其中的初始化函数gconv_init。
这样,攻击者只需要:
就可以最终获得一个root shell了。
其中第一步与第三步可以有多种方法实现,虽然常见的PoC给出的是可执行程序,但是也可以通过脚本施行攻击,但是第二步需要生成一个so文件,就是在这里,新生成的so文件因为没有有效证书签名,因此在缺省的统信UOS上无法被载入执行。
当然,除了使用gconv的外挂插件之外,从理论上来说,也可以思考如何利用环境变量从pkexec的外部载入程序,但是这个实施难度显然就更高了。
因此,我们也希望统信UOS的广大用户不要修改系统的缺省配置,因为统信UOS基于证书签名的应用治理机制确实能有效地保护系统的安全,规避安全风险。
相关文章
扫码加入官方社群
享受专属社群服务
回到顶部