Apesar da actual falta de tempo para seguir mais atentamente assuntos relacionados com segurança informática, esta última vulnerabilidade encontrada no servidor de X não poderia deixar de a referir, mesmo passadas cinco semanas.
O interessante desta vulnerabilidade é o contexto a que lhe deu origem, ou seja uma distracção do programador que levou a que utilizadores locais possam ganhar acesso root. O patch é tão rídiculo quanto isto:
/* First the options that are only allowed for root */
- if (getuid() == 0 || geteuid != 0)
+ if (getuid() == 0 || geteuid() != 0)
{
if (!strcmp(argv[i], "-modulepath"))
{
@@ -1677,7 +1677,7 @@
}
if (!strcmp(argv[i], "-configure"))
{
- if (getuid() != 0 && geteuid == 0) {
+ if (getuid() != 0 && geteuid() == 0) {
ErrorF("The '-configure' option can only be used by root.\n");
exit(1);
}
Ora, o programador esqueceu-se dos "()" na função geteuid, e como tal em vez comparar o valor que a função retorna está a comparar com o valor da zona de memória da função, como é impossível esta ser zero a proposição lógica do "if" será sempre verdadeira. Estranho é que o programador faz este erro duas vezes.
Apesar de ambos os statements serem válidos em C, parece-me que o compilador deveria dar um warning quando se compara o valor da memória da função com zero pois isso é impossível, já que este nem sequer é um ponteiro para função.
Depois existe aqui aquele strcmp que muito provavelmente não terá consequências a nivel da exploração do overflow do mesmo, mas custa assim tanto usar um strncmp?