quarta-feira, 8 de janeiro de 2014

Anatomy of a 22-year-old bug do Windows X: Obter root com falha recém-descoberta


Um guia para e-mail transacional


O Windows System X, que sustenta hoje desktops Linux em todo o mundo, tem sido em torno de mais de duas décadas - e por isso têm seus bugs.


Sysadmins tem alguns dias para consertar libXfont para remover um recém-descoberto, 22-year-old bug privilégio escalada no código antes de qualquer usuário cansativas sacar um exploit. A falha permite que alguém conectado a uma máquina vulnerável a derrubar o servidor X, ou possivelmente executar código injetado como um superusuário.







Difícil nos saltos de uma apresentação Chaos Communication Congress que encontrou "centenas" de bugs (discutidos na lista de discussão X.org aqui ), o bug recém-descoberto é um estouro de buffer de pilha de livros didáticos, que remonta a 1991 - e está presente em todos os versões do X11.


O bug é muito simples. Como os X.org assessoria afirma: "Um arquivo de fonte BDF contendo um mais que o esperado corda pode estourar o buffer na pilha. Testes em servidores X construídos com Stack Protector resultou em um acidente de imediato ao ler uma fonte especialmente criado fornecido pelo usuário. "


O culpado é este bloco de código em bdfReadCharacters () em libXfont / árvore / src / bitmap / bdfread.c :



caractere charName [100];

if (sscanf ((char *) linha ", STARTCHAR% s", charName)! = 1) {
bdfError ("nome mau caráter em BDF arquivo \ n");
Ir à AJUDA; / * fundo da função, livre e de erro de retorno * /
}

Se você já não pode ver o bug depois vamos explicar. Fontes na tela podem ser armazenados em Glyph Bitmap Distribution Format (BDF) [ PDF ] arquivos, que começam com a seguinte linha ao declarar a versão do formato da fonte está aderindo a:



STARTCHAR 2.1

Isso é tudo muito bem, se a fonte carregado tem um número de versão curta, expressa como uma string, que neste caso é "2.1". Essa informação é copiado para a variável de seqüência charName pela chamada sscanf () em bdfread.c. O problema é que sscanf () não é dito para limitar o número de bytes lidos para o número da versão e irá manter a cópia de dados a partir do arquivo até que ele atinge um caractere de espaço em branco .


A variável charName é declarado como tendo um comprimento de 100 bytes, de modo que alimenta a uma fonte BDF trabalhada com um "STARTCHAR" número da versão mais longa do que vai perfurar o limite de espaço alocado a variável na memória e em outros dados sobre a pilha. Isso significa que um invasor pode sobrescrever a memória que controla ponteiro de instruções do processador em deixar as bdfReadCharacters function (), de forma eficaz o seqüestro do programa.


E uma vez que o servidor X geralmente é executado com privilégios de superusuário, o usuário normal pode começar a correr código para assumir o controle da máquina, se o ataque for bem sucedido. Muito mais explicações detalhadas sobre como estouros de buffer de pilha pode ser explorada, apesar de algumas das proteções no lugar em sistemas modernos, pode ser encontrado aqui e aqui .


A correção para o bug é simples, você simplesmente dizer sscanf () para ler no máximo 99 bytes, deixando um para o NULL de terminação:



if (sscanf ((char *), linha, "STARTCHAR% 99s", charName)! = 1) {

Como afirma o anúncio X.org:


Como libXfont é usado para ler arquivos de fonte especificados pelo usuário em todos os servidores X distribuídos pela X.Org, incluindo o servidor Xorg que muitas vezes é executado com privilégios de root ou como setuid-root para acessar hardware, esse bug pode levar a um sem privilégios usuário adquirir privilégios de root em alguns sistemas.

Na apresentação dezembro Chaos Communication Congress, Ilja van Sprundel disse que ia encontrar 120 erros em um par de meses ", e eu não estou perto de feito". Van Sprundel já tinha provocado uma grande segurança X.org atualização maio 2013, com dezenas de correções necessárias porque as bibliotecas de cliente de confiança servidores para enviar dados válidos, e não o que foi enviado testadas em sanidade.


A mais recente bug, descoberto usando o cppcheck analisador estático, é designado CVE-2013-6462; atualizações de segurança deve estar disponível a partir de todos os gestores bom pacote e repositórios. ®







via Alimentação (Feed)

Nenhum comentário:

Postar um comentário