Heartbleed: como verificar de forma confiável e portável a versão do OpenSSL?

87

Eu estava procurando uma maneira confiável e portátil de verificar a versão do OpenSSL no GNU / Linux e outros sistemas, para que os usuários possam descobrir facilmente se devem atualizar seu SSL por causa do bug Heartbleed.

Eu achei que seria fácil, mas rapidamente me deparei com um problema no Ubuntu 12.04 LTS com o mais recente OpenSSL 1.0.1g:

openssl version -a

Eu esperava ver uma versão completa, mas em vez disso eu consegui:

OpenSSL 1.0.1 14 Mar 2012
built on: Tue Jun  4 07:26:06 UTC 2013
platform: [...]

Para minha surpresa desagradável, a carta da versão não aparece. Não f, não g lá, apenas "1.0.1" e é isso. As datas listadas também não ajudam a descobrir uma versão (não) vulnerável.

A diferença entre 1.0.1 (a-f) e 1.0.1g é crucial.

Perguntas:

  • O que é uma maneira confiável de verificar a versão, de preferência, cruzar distro?
  • Por que a letra da versão não está aparecendo em primeiro lugar? Eu não pude testar isso em nada além do Ubuntu 12.04 LTS.

Outros estão relatando esse comportamento também. Alguns exemplos:

Algumas sugestões (específicas de distro) em exibição:

  • Ubuntu e Debian: apt-cache policy openssl e apt-cache policy libssl1.0.0 . Compare os números da versão com os pacotes aqui: link
  • Fedora 20: yum info openssl (obrigado @znmeb no twitter) e yum info openssl-libs

Verificando se uma versão antiga do OpenSSL ainda reside:

Acontece que a atualização do pacote OpenSSL no Ubuntu e no Debian nem sempre é suficiente. Você também deve atualizar o pacote libssl1.0.0 e, em seguida, verificar se openssl version -a indica built on: Mon Apr 7 20:33:29 UTC 2014 .

    
por Martijn 08.04.2014 / 01:51

8 respostas

67

Com base na data exibida pela sua versão do OpenSSL, parece que está vendo a versão completa exibida lá.

O Open SSL 1.0.1 foi lançado em 14 de março de 2012 . 1.0.1a foi lançado em 19 de abril de 2012.

Então, eu vou em frente e afirmo que openssl version -a é a maneira correta de distribuição cruzada para exibir a versão completa do OpenSSL instalado no sistema. Parece funcionar para todas as distribuições Linux que eu tenho acesso, e é o método sugerido na documentação do help.ubuntu.com OpenSSL, como bem . O Ubuntu LTS 12.04 é fornecido com o OpenSSL v1.0.1, que é a versão que se parece com uma versão abreviada, por não ter uma letra a seguir.

Dito isto, parece que existe um bug major no Ubuntu (ou como eles empacotam o OpenSSL), em que openssl version -a continua a retornar a versão original 1.0.1 de 14 de março, 2012, independentemente de o OpenSSL ter sido atualizado ou não para qualquer uma das versões mais recentes. E, como com a maioria das coisas quando chove, derrama.

O Ubuntu não é a única grande distro com o hábito de retroceder atualizações para o OpenSSL (ou outros pacotes), mais do que depender das atualizações e numeração de versões que todos reconhecem. No caso do OpenSSL, onde os números das versões das letras representam apenas correção de bugs e atualizações de segurança, isso parece quase incompreensível, mas eu fui informado de que isso pode ser por causa do Principais distribuições do Linux validadas pelo FIPS fornecidas pelo OpenSSL. Por causa dos requisitos em torno da revalidação que são acionados devido a qualquer alteração, até mesmo as alterações que conectam falhas de segurança são bloqueadas por versão.

Por exemplo, no Debian, a versão corrigida exibe um número de versão de 1.0.1e-2+deb7u5 em vez da versão upstream de 1.0.1g .

Como resultado, neste momento, não há maneira confiável e portátil de verificar as versões SSL nas distribuições do Linux , pois todas elas usam seus próprios patches e atualizações com diferentes esquemas de numeração de versão. Você terá que procurar o número da versão fixa para cada distribuição diferente do Linux executado e verificar a versão do OpenSSL instalada em relação à numeração de versão específica dessa distribuição para determinar se os servidores estão executando uma versão vulnerável ou não.

    
por 08.04.2014 / 02:05
18

Se você quiser algo realmente compatível com várias plataformas, verifique a vulnerabilidade em si, em vez de confiar nos números de versão.

Você pode ter um código que informe um número de versão que seja vulnerável, mas o código real não está vulnerável . E o contrário - código silenciosamente vulnerável - pode ser ainda pior!

Muitos fornecedores que agregam produtos de código aberto, como o OpenSSL e o OpenSSH, reajustarão seletivamente as correções urgentes para uma versão mais antiga do código, a fim de manter a estabilidade e a previsibilidade da API. Isso é especialmente verdadeiro para plataformas de "lançamento de longo prazo" e de aplicativos.

Mas os fornecedores que fazem isso silenciosamente (sem adicionar seu próprio sufixo de seqüência de versão) correm o risco de acionar falsos positivos em scanners de vulnerabilidades (e usuários confusos). Então, para tornar isso transparente e verificável, alguns fornecedores anexam suas próprias strings à versão principal do pacote. Tanto o Debian (OpenSSL) quanto o FreeBSD (no OpenSSH, através da diretiva VersionAddendum sshd_config) às vezes fazem isso.

Fornecedores que não fazem isso provavelmente estão fazendo isso para minimizar a chance de quebra devido a muitas maneiras diretas e indiretas como outros programas verificam os números de versão.

Então, pode ser assim:

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"

$ openssl version
OpenSSL 1.0.1 14 Mar 2012

... embora tenha sido corrigido :

$ dpkg -l openssl | grep openssl
ii  openssl  1.0.1-4ubuntu5.12  [truncated]

$ ls -la 'which openssl'
-rwxr-xr-x 1 root root 513208 Apr  7 12:37 /usr/bin/openssl

$ md5sum /usr/bin/openssl
ea2a858ab594905beb8088c7c2b84748  /usr/bin/openssl

Com coisas como esta em jogo, é melhor que você não confie no número da versão.

    
por 08.04.2014 / 22:52
14

Infelizmente, não tenho certeza de que seja uma maneira multiplataforma de fazer isso. Como eu discuto em um post no blog , a versão do OpenSSL exibida no Ubuntu 12.04 REMAINS 1.0.1 após a atualização para uma versão fixa.

Apenas para o Ubuntu 12.04, você pode saber se foi atualizado se todos os itens abaixo forem verdadeiros:

  1. dpkg -s openssl | grep Version mostra a versão 1.0.1-4ubuntu5.12 ou posterior.
  2. dpkg -s libssl1.0.0 | grep Version mostra a versão 1.0.1-4ubuntu5.12 ou posterior.
  3. openssl version -a mostra uma data "incorporada" de 7 de abril de 2014 ou posterior.

Obrigado ao @danny pela informação adicional.

    
por 08.04.2014 / 05:15
4

Dê uma chance ao seguinte. Ele extrairá todas as strings da biblioteca crypto com a qual o ssh está vinculado. Ela produz mais de uma linha de saída, mas, se necessário, pode ser convertida em uma linha.

ldd 'which ssh' | awk '/\// { print $3 }' | grep crypto | xargs strings  | grep OpenSSL

produz

OpenSSLDie
DSA_OpenSSL
...
MD4 part of OpenSSL 1.0.1f 6 Jan 2014 
MD5 part of OpenSSL 1.0.1f 6 Jan 2014
... 
etc

por exemplo. no Gentoo antes de emergir

[ebuild     U  ] dev-libs/openssl-1.0.1f [1.0.1c] USE="bindist (sse2) tls-heartbeat%* zlib -gmp -kerberos -rfc3779 -static-libs {-test} -vanilla" 4,404 kB

o comando acima resulta em

...
OpenSSL 1.0.1c 10 May 2012

depois

...
OpenSSL 1.0.1f 6 Jan 2014

Ai, ainda não há g.

    
por 08.04.2014 / 16:45
2

Algum desses scripts testa todos os serviços, ou eles testam apenas o HTTPS ? AFAIK , PostgreSQL é vulnerável, mas isso é apenas um rumor até que surjam superfícies de ataque in-the-wild.

Existe um script metasploit disponível para uso.

https://github.com/rapid7/metasploit-framework/commit/dd69a9e5dd321915e07d8e3dc8fe60d3c54f551a

Você pode digitar isto (testado com GnuWin32 OpenSSL binário versão 1.0.1.6, datado de 2014-01-14), ou apenas use o script no comentário abaixo deste. É mais preciso e simples!

s_client -connect a23-75-248-141.deploy.static.akamaitechnologies.com:443 -debug -state

Uma vez conectado, digite B e você verá em um host vulnerável e não será desconectado:

B

HEARTBEATING
write to 0x801c17160 [0x801cbc003] (66 bytes => 66 (0x42))
0000 - 18 03 03 00 3d 8f 6f 3c-52 11 83 20 9c a2 c0 49   ....=.o 5 (0x5))
0000 - 18 03 03 00 3d                                    ....=
read from 0x801c17160 [0x801cb7008] (61 bytes => 61 (0x3D))
0000 - 05 4d f5 c0 db 96 d1 f5-c7 07 e5 17 1f 3b 48 34   .M...........;H4
0010 - 6e 11 9d ba 10 0c 3a 34-eb 7b a5 7c c4 b6 c0 c0   n.....:4.{.|....
0020 - b0 75 0e fe b7 fa 9e 04-e9 4e 4a 7d 51 d3 11 1f   .u.......NJ}Q...
0030 - e2 23 16 77 cb a6 e1 8e-77 84 2b f8 7f            .#.w....w.+..
read R BLOCK

Você receberá uma resposta de pulsação semelhante a essa.

Em um host corrigido, você verá uma resposta semelhante à abaixo e será desconectado:

Digite B

HEARTBEATING
write to 0x801818160 [0x8019d5803] (101 bytes => 101 (0x65))
0000 - 18 03 03 00 60 9c a3 1e-fc 3b 3f 1f 0e 3a fe 4c   ....'....;?..:.L
0010 - a9 33 08 cc 3d 43 54 75-44 7d 2c 7b f3 47 b9 56   .3..=CTuD},{.G.V
0020 - 89 37 c1 43 1c 80 7b 87-66 ff cb 55 5f 8d 1a 95   .7.C..{.f..U_...
0030 - 1b 4c 65 14 21 a1 95 ac-7a 70 79 fc cc a0 cf 51   .Le.!...zpy....Q
0040 - 0f 7e c5 56 14 c8 37 c1-40 0b b8 cb 43 96 8a e6   [email protected]...
0050 - 21 42 64 58 62 15 fb 51-82 e6 7f ef 21 1b 6f 87   !BdXb..Q....!.o.
0060 - b9 c2 04 c8 47                                    ....G

Fonte:

Existem também estas ferramentas:

por 09.04.2014 / 13:43
0

Para o Ubuntu, você pode usar:

aptitude show libssl1.0.0 | grep Version

E compare com o link . Depois de uma reinicialização (!!!), você pode verificar com http://possible.lv/tools/hb .

    
por 08.04.2014 / 13:14
0

É melhor atualizar para o OpenSSL OpenSSL 1.0.1j mais recente.

link

    
por 19.10.2014 / 03:57
0

Eu encontrei este script em deventral :

openssl s_client -connect example.com:443 -tlsextdebug 2>&1| grep 'server extension "heartbeat" (id=15)' || echo safe

Substitua example.com pelo nome ou endereço IP do servidor que você deseja verificar.

Irá devolver "safe" se o seu servidor estiver bem ou "server extension "heartbeat" (id=15)" se não estiver.

Isso não depende do número da versão, mas da listagem da extensão do servidor que causa o problema, por isso deve ser imune aos shenanigans da versão da biblioteca.

A máquina em que você está executando openssl s_client em deve estar usando o OpenSSL 1.0.1 ou posterior para que isso funcione.

    
por 08.04.2014 / 11:12