Uma falha de natureza grave foi encontrada no interpretador de comando do Linux o bash, repercussão essa que foi classificada com nota de risco 10 segundo a Common Vulnerability Scoring System, uma falha mais grave que a HeartBleed do OpenSSL, que ocorreu neste ano também.
Hoje foi um dia em que muitos SysAdmins ficaram preocupados(senão loucos :/), visto que compromete o acesso remoto ao sistema podendo executar comandos de diversas maneiras até via web, se quiser ver um caso e entender melhor como funciona a falha clique aqui, correções já estão disponíveis e vou relatar como verifiquei em meus servidores o problema e como apliquei a correção.
Verificando se o servidor esta vulnerável:
root@sc-vm1:~# env x='() { :;}; echo vulnerable' bash -c "echo this is a test" vulnerable this is a test
Se o seu terminal aparecer como acima, seu bash esta vulnerável, caso aparecer como abaixo, não esta.
root@sc-vm1:~# env x='() { :;}; echo vulnerable' bash -c "echo this is a test" bash: warning: x: ignoring function definition attempt bash: error importing function definition for `x' this is a test
No caso a maioria das distribuições Linux corrigiram o problema e lançaram patchs e atualizações, segue algumas informações das principais distribuições:
Debian
https://www.debian.org/security/2014/dsa-3032
RedHat/Fedora
https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2014-6271
SuSe
http://support.novell.com/security/cve/CVE-2014-6271.html
Ubuntu
http://www.ubuntu.com/usn/usn-2362-1/
CentOS
http://centosnow.blogspot.com.br/2014/09/critical-bash-updates-for-centos-5.html
Debian 7 (Wheezy)
root@sc-vm1:~# apt-get update && apt-get install --only-upgrade bash ... root@sc-vm1:~# env x='() { :;}; echo vulnerable' bash -c "echo this is a test" bash: warning: x: ignoring function definition attempt bash: error importing function definition for `x' this is a test
Com o meu segundo servidor, um Debian 6 tive uma certa dificuldade onde apenas com o apt-get install não foi suficiente, pensei em baixar o fonte e compilar, mas resolvi dar uma pesquisada e achei este link, onde adicionando 2 repositórios e atualizando os pacotes já estava disponível a versão 4.1.3+deb6u1 com a correção, então vamos lá.
Debian 6 (Squeeze)
root@vm02-dc:~# vim /etc/apt/sources.list # Line commented out by installer because it failed to verify: deb http://ftp.de.debian.org/debian squeeze main contrib non-free deb http://security.debian.org/ squeeze/updates main # Repositorio para correcao do bash no Debian 6 deb http://mirror.bytemark.co.uk/debian/ squeeze-lts main contrib non-free deb-src http://mirror.bytemark.co.uk/debian/ squeeze-lts main contrib non-free
Em seguida:
root@vm02-dc:~# apt-get update root@vm02-dc:~# apt-cache search bash bash: Instalado: 4.1-3+deb6u1 Candidato: 4.1-3+deb6u1 Tabela de versão: *** 4.1-3+deb6u1 0 500 http://mirror.bytemark.co.uk/debian/ squeeze-lts/main amd64 Packages 100 /var/lib/dpkg/status 4.1-3 0 500 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages root@vm02-dc:~# apt-get install --only-upgrade bash root@vm02-dc:~# root@vm02-dc:~# bash --version GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. root@vm02-dc:~# root@vm02-dc:~# env x='() { :;}; echo vulnerable' bash -c "echo this is a test" bash: warning: x: ignoring function definition attempt bash: erro ao importar a definição da função para `x' this is a test root@vm02-dc:~#
OBS: Caso após adicionar os repositórios e executar o apt-get update aparecer um erro como:
W: Erro GPG: http://mirror.bytemark.co.uk squeeze-lts Release: As assinaturas a seguir não puderam ser verificadas devido à chave pública não estar disponÃvel: NO_PUBKEY 8B48AD6246925553
Execute a seguinte linha para corrigir e tente novamente:
root@vm02-dc:~# apt-get install debian-archive-keyring root@vm02-dc:~# apt-get update && apt-get install --only-upgrade bash
Tudo resolvido, os 2 Debian “vacinados” até que lembrei de uma VM que possuo, e essa seria problema visto que fornece acessos de serviços para web porém eu não tenha acesso a internet direto por ela, ae dano! Sem chance de apt-get e na altura do campeonato achei inviável subir um apt-cacher só para esta finalidade, então agora como fiz para corrigir o problema do outro Debian 6 (Squeeze) sem “internet”, vamos la:
Primeiro, baseado no link do repositório que eu tinha, usei meu notebook e baixei o Package.gz do link abaixo, navegando em dists > squeeze-lts > main > binary-amd64 (você pode alterar algum desses níveis caso precisar de outro):
http://mirror.bytemark.co.uk/debian/dists/squeeze-lts/main/binary-amd64/Packages.gz
cleiton@nb-lenovo:/tmp$ wget http://mirror.bytemark.co.uk/debian/dists/squeeze-lts/main/binary-amd64/Packages.gz cleiton@nb-lenovo:/tmp$ gzip -d Packages.gz cleiton@nb-lenovo:/tmp$ cat Packages | grep --color=auto -E 'Filename.*bash|Package.*bash' Package: bash Filename: pool/main/b/bash/bash_4.1-3+deb6u1_amd64.deb Package: bash-builtins Filename: pool/main/b/bash/bash-builtins_4.1-3+deb6u1_amd64.deb Package: bash-doc Filename: pool/main/b/bash/bash-doc_4.1-3+deb6u1_all.deb Package: bash-static Filename: pool/main/b/bash/bash-static_4.1-3+deb6u1_amd64.deb
Resumindo, baixe, descompactei e abri o arquivo filtrando por Filename, Package e bash. Legal, tenho tudo que preciso, o link do repositório (http://mirror.bytemark.co.uk/debian/) e agora o caminho até o pacote .deb (bash_4.1-3+deb6u1_amd64.deb), só baixar.
cleiton@nb-lenovo:/tmp$ wget http://mirror.bytemark.co.uk/debian/pool/main/b/bash/bash_4.1-3+deb6u1_amd64.deb cleiton@nb-lenovo:/tmp$ ls bash_4.1-3+deb6u1_amd64.deb Packages
Depois disso, vou transferir o arquivo do notebook para o servidor, no caso usei um intermediário na internet e depois via rede, transferi para o vulnerável com scp, dentro do servidor eu instalei o pacote como abaixo:
admin@vm-pandora:/tmp$ dpkg -i bash_4.1-3+deb6u1_amd64.deb (Lendo banco de dados ... 54787 ficheiros e directórios actualmente instalados.) Preparando para substituir bash 4.1-3+deb6u1 (usando .../bash_4.1-3+deb6u1_amd64.deb) ... Desempacotando substituto bash ... Configurando bash (4.1-3+deb6u1) ... update-alternatives: a usar /usr/share/man/man7/bash-builtins.7.gz para disponibilizar /usr/share/man/man7/builtins.7.gz (builtins.7.gz) em modo automático. Processando gatilhos para man-db ...
Li em uma thread de lista de discussão que o Busybox não foi afetado, hummm resolvi conferir no meu router de casa:
# BusyBox v1.01 (2006.08.31-18:23+0000) Built-in shell (ash) Enter 'help' for a list of built-in commands. # bash --version ash: bash: not found # ash --help BusyBox v1.01 (2006.08.31-18:23+0000) multi-call binary # ash -c "echo OK" OK # env x='() { :;}; echo vulnerable' bash -c "echo this is a test" ash: env: not found # env x='() { :;}; echo vulnerable' ash -c "echo this is a test" ash: env: not found # cd /bin/ # ls ntpclient auth pppoe.sh flash mkdir disc_server cbu ntp.sh iptables ls pptp arp mesh.sh brctl kill pppd tc ifc.sh stty hostname ez-ipupdate dropbearkey fixedip.sh zcat gzip iapp ssh firewall.sh watch gunzip iwcontrol dbclient domain.sh vi grep tcpdump dropbear disconnect.sh umount echo salvar dropbearmulti dhcpd.sh tar df recuperar init.sh dhcpc.sh sleep date pppoe-relay udps ddns.sh sh cp olsrd VERSION connect.sh sed chmod netstraind wlanapp.sh check.sh rm cat netstrain watchdog.sh cbu.sh ps ash iptraf iwpriv bridge.sh ping busybox dhcrelay reload.sh alias.sh mv config pptp.sh webs mount # ls /usr/bin/ wget top sort head cut wc test passwd expr bzcat uptime telnet logger dumpleases bunzip2 unix2dos tail killall dos2unix [ # help Built-in commands: ------------------- . : break cd chdir continue eval exec exit export false hash help let local pwd read readonly return set shift times trap true type ulimit umask unset wait #
Não encontrei o /usr/bin/env nesta versão e é claro não é vulnerável porque a falha é no interpretador bash, neste caso do BusyBox esta sendo usado o ash, o mesmo aplica-se caso o servidor estiver com interpretador (ash, csh ou tcsh) você não terá problemas, o inseto esta no bash(Bourne Again SHell).
Espero que ajude quem precisar corrigir a falha, o foco foi na distribuição Debian mas a ideia aplica-se as demais distribuições que foi informado o link.
Até a próxima!
Referências
https://security-tracker.debian.org/tracker/CVE-2014-7169
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169
https://tecnoblog.net/166271/shellshock-falha-grave-bash/
https://forum.bytemark.co.uk/t/shell-shock-what-you-need-to-do-now-about-the-bash-remote-exploit-vulnerability/2068
https://www.debian.org/security/2014/dsa-3032
https://access.redhat.com/articles/1200223
https://access.redhat.com/documentation/pt-BR/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/Alternatives_to_busybox.html
Linux – Correção falha Shellshock do bash by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.