Linux – Correção falha Shellshock do bash

bug_bash_shellshock_cleitonbuenoUma 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

No meu caso, eu estava com 2 Debian vulneráveis um com o bash 4.1 e outro com bash 4.2, um foi bem tranquilo, onde com o próprio apt-get consegui solucionar.

 

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

Share Button

CC BY-NC-SA 4.0 Linux – Correção falha Shellshock do bash by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.