CVE-2011-1485: polkitd/pkexec vulnerability

Olá, neste post a missão será explicar a vulnerabilidade identificada pelo CVE-id 2011-1485, trata-se de um caso de race condition, onde se confiou no procfs /proc/<pid> para obter o UID do processo pai, o que acaba deixando executarmos qualquer programa localmente como root.

Podemos ver pelo patch [1] que o código vulnerável era:

g_snprintf (procbuf, sizeof procbuf, "/proc/%d", process->pid);
if (stat (procbuf, &statbuf) != 0)
[...]
result = statbuf.st_uid;

O que funciona bem se ele somente fosse executado como processo pai, mas e se nós executarmos ele como processo filho e chamarmos um programa setuid no processo pai quando ele checar pelo /proc/<pid>? Iremos alterar o effective UID, e ele o usará como UID. :)

Usarei o código do exploit feito por zx2c4 para analisar o que acontece, vejamos.

Primeiro, podemos constatar que ao chamar um programa setuid, será herdado os direitos do owner do arquivo, vemos isso com o seguinte código:

	printf("/proc/%i\n", getpid());		
	execl("/usr/bin/chsh", "chsh", NULL);

Executando teremos:

$ ./xpl &
[1] 18163
/proc/18157
[1]+  Stopped                 ./xpl
$ ls -la /proc/ | grep 18163
dr-xr-xr-x   7 root        felipe                    0 Jun 23 10:51 18163
$ ps aux | grep 18163
root     18163  0.0  0.0    1160 pts/2    T    11:49   0:00 chsh

Então tudo que precisamos, é invocar o /usr/bin/chsh no momento em que o pkexec for usar stat() no /proc/<pid>. O que nos leva a um problema de race condition, o qual podemos vencer simplesmente usando inotify, que nos notificará quando o /proc/<pid> for acessado. [3]

Quanto a leitura da stdin pela solicitação de senha pelo chsh, basta fecharmos os file descriptors que são abertos por padrão. (/proc/<pid>/fd/*)

Veja como ficou simples o exploit nas referências [2].

Há também um outro exploit para essa falha, mas este sem usar inotify, fazendo o tradicional loop para tentar vencer o race. Ele foi desenvolvido por xi4oyu, veja no exploit-db. [4]

O fix para obter o real UID, foi usar o /proc/<pid>/status. Os patches para esta falha podem ser vistos no bugtracker da Red hat [5].

[1] - https://bugzilla.redhat.com/attachment.cgi?id=489458
[2] - https://github.com/zx2c4/CVE-2011-1485/blob/master/polkit-pwnage.c
[3] - http://en.wikipedia.org/wiki/Inotify
[4] - http://www.exploit-db.com/exploits/17942/
[5] - https://bugzilla.redhat.com/show_bug.cgi?id=692922

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options