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

88

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 devido ao bug do Heartbleed.

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

versão openssl -a

Eu esperava ver uma versão completa, mas obtive o seguinte:

OpenSSL 1.0.1 14 de março de 2012
quinta-feira, 4 de junho de 2017 07:26:06 UTC 2013
plataforma: [...]

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 (af) e 1.0.1g é crucial.

Questões:

  • Qual é uma maneira confiável de verificar a versão, de preferência entre distros?
  • Por que a carta da versão não aparece em primeiro lugar? Não consegui 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 para cada distribuição):

  • Ubuntu e Debian: apt-cache policy openssle apt-cache policy libssl1.0.0. Compare os números da versão com os pacotes aqui: http://www.ubuntu.com/usn/usn-2165-1/
  • Fedora 20: yum info openssl(obrigado @znmeb no twitter) eyum info openssl-libs

Verificando se uma versão mais antiga do OpenSSL ainda é residente:

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

Martijn
fonte
2
pelo menos, certifique-se de que a versão OpenSSL você tem não é g por causa da data em que ela mostra
Pato Sáinz
3
Isso funciona no CentOS[root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013
Jacob
1
@ PatoSáinz Eu verifiquei apt-cache policy openssle ele respondeu com: Installed: 1.0.1-4ubuntu5.12qual é o 1.0.1g lançado pelo Ubuntu para o 12.04 LTS. Saí e voltei a entrar. Há mais alguma coisa que eu possa fazer para verificar?
Martijn
1
Vou apontar, por isso que não sei, caso seja útil ... Ubuntu 12.04 LTS enviado com o OpenSSL 1.0.1 (vanilla).
HopelessN00b
1
Se essa data de compilação for precisa, você não poderá ter o código "release versioned" mais recente que o 1.0.1e, pois o 1.0.1f foi lançado em 2014 pelas notas de versão do OpenSSL 1.0.1 . Linhas ou seções individuais podem ter sido portadas para a sua versão do Ubuntu antes do lançamento oficial do OpenSSL 1.0.1f, é claro. E a data de compilação pode ser menos que completamente útil.
Anti-weakpasswords

Respostas:

66

Com base na data exibida pela sua versão do OpenSSL, parece que você 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, vou seguir em frente e afirmar que openssl version -aé a maneira correta e de distribuição cruzada para exibir a versão completa do OpenSSL que está instalada no sistema. Parece funcionar para todas as distros do Linux às quais tenho acesso, e é o método sugerido na documentação do OpenSSL help.ubuntu.com . O Ubuntu LTS 12.04 é enviado com o OpenSSL v1.0.1, que é a versão que se parece com uma versão abreviada, por não ter uma carta após isso.

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

O Ubuntu não é a única grande distro no hábito de backporting atualizações para o OpenSSL (ou outros pacotes), mais do que confiar nas atualizações upstream e na numeração de versões que todos reconhecem. No caso do OpenSSL, onde os números das versões das letras representam apenas correções de bugs e atualizações de segurança, isso parece quase incompreensível, mas fui informado de que isso pode ser devido às principais distribuições Linux do plug - in validado pelo FIPS fornecidas com o OpenSSL. Por causa dos requisitos de revalidação que são acionados devido a qualquer alteração, mesmo alterações que obstruem falhas de segurança, a versão é bloqueada.

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

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

HopelessN00b
fonte
3
Minha instalação é um simples Ubuntu 12.04 LTS sem nada que eu tenha me compilado ou baixado de outras fontes que não os repositórios do Ubuntu. Se o Ubuntu estiver distribuindo o OpenSSL com números de versão abreviados, openssl version -anão será um método portátil (pelo menos não portátil para o Ubuntu). Eu verifiquei apt-cache policy openssle ele respondeu com: Installed: 1.0.1-4ubuntu5.12qual é o 1.0.1g lançado pelo Ubuntu para o 12.04 LTS. Eu saí e voltei antes de verificar.
287 Martijn
19
HopelessN00b, não há nada duvidoso sobre a política de correções de backport em vez de versões de colisão; é uma maneira muito boa de garantir a estabilidade da plataforma, o que é altamente desejável em um ambiente de servidor. Como qualquer decisão, ela tem consequências das quais os usuários precisam estar cientes; mas apenas porque quebra a linha de raciocínio " Estou executando o foo xyz, portanto, não sou vulnerável à mais recente exploração ", isso não a torna uma coisa ruim.
21914 MadHatter
10
@towo Os números de versão existem por um motivo. Se vamos apenas lançar os números da versão upstream pela janela porque "enterprisey", ou o que seja, por que se preocupar com os números das versões? Também pode começar a nomear todas as nossas coisas com aliterações. Podemos chamar as versões vulneráveis ​​do OpenSSL de Holy Heartbleed e as fixas de coágulo astuto .
HopelessN00b
7
@ HopelessN00b Acho que você está sendo pego na armadilha "isso foi corrigido na versão XYZ", eles não seguem os números das versões porque tudo o que está sendo importado para a versão mais recente são correções de bugs e segurança. Se eles digitarem o número da versão, você também esperaria a funcionalidade adicional .. "Eu tenho o OpenSSL x XYZ, por que não tenho o ECDHA ???? ..etc". Faz sentido quando você entende que são apenas correções de bugs.
NickW
13
@NickW @Jubal @MadHatter, o que acontece com o OpenSSL é o seguinte: After the release of OpenSSL 1.0.0 the versioning scheme changed. Letter releases (e.g. 1.0.1a) can only contain bug and security fixes and no new features.Então, nada é ganho abandonando o esquema de versão upstream; fazer o backport das atualizações é essencialmente o mesmo que usar a versão atualizada, pois a atualização inclui apenas correções de segurança e erros. O que ele faz é confundir as coisas e nos deixar sem nenhuma maneira de verificar portably a versão do OpenSSL nas distribuições do Linux.
HopelessN00b
18

Se você deseja algo realmente multiplataforma, verifique a vulnerabilidade em si, em vez de confiar nos números de versão.

Você pode ter um código que relate um número de versão que é conhecido por ser vulnerável, mas o código real não é vulnerável . E o inverso - código silenciosamente vulnerável - pode ser ainda pior!

Muitos fornecedores que agrupam produtos de código aberto como o OpenSSL e o OpenSSH atualizam seletivamente 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 "versões de longo prazo" e plataformas de dispositivos.

Mas os fornecedores que fazem isso silenciosamente (sem adicionar seu próprio sufixo de cadeia de versão) correm o risco de desencadear falsos positivos em scanners de vulnerabilidade (e confundir usuários). Portanto, para tornar isso transparente e verificável, alguns fornecedores anexam suas próprias strings à versão principal do pacote. O Debian (OpenSSL) e o FreeBSD (no OpenSSH, via VersionAddendumdiretiva sshd_config) às vezes fazem isso.

Os fornecedores que não fazem isso provavelmente estão fazendo isso para minimizar a chance de quebra devido às várias maneiras diretas e indiretas que outros programas verificam os números de versão.

Portanto, pode ficar 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

... mesmo que 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 assim em jogo, você estará melhor se não confiar no número da versão.

Royce Williams
fonte
É claro que a verificação de versões não é tão fácil e transparente como eu esperava que fosse. A verificação da vulnerabilidade é multiplataforma, mas também é mais difícil: você deve ter um PoC confiável ou um teste útil para o serviço de software vulnerável em particular que você está executando. Nesse caso, tudo começou com um PoC para Apache e nginx. E se eu estivesse usando apenas SMTP com SSL naquele momento e quisesse verificar se sou vulnerável? Eventualmente, teremos testes para a maioria dos serviços, mas pode demorar um pouco.
Martijn
Martijn, esse é um argumento justo. Quando um teste não está disponível, os métodos secundários (como rastrear a soma de verificação dos binários afetados nos sistemas de destino) são menos ideais, mas podem ser bons o suficiente para fazer o trabalho ... e depois passar para o próximo disparo. :-)
Royce Williams
14

Infelizmente, eu não tenho certeza que é uma maneira de plataforma cruzada de fazer isso. Como discuti em uma postagem 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.

SOMENTE para o Ubuntu 12.04, você pode saber se foi atualizado se todas as opções abaixo forem verdadeiras:

  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 "construída em" em 7 de abril de 2014 ou posterior.

Obrigado a @danny pela informação adicional.

Schof
fonte
2
Ok, nesse caso, devo adicionar que a versão do pacote 1.0.1-4ubuntu5.12é SOMENTE para o Ubuntu 12.04 LTS. Se você estiver no Ubuntu 12.10 você deve ver pelo menos a versão 1.0.1c-3ubuntu2.7e se você estiver em 13.10 então ele deve estar pelo menos a versão 1.0.1e-3ubuntu1.2, de acordo com a fonte: ubuntu.com/usn/usn-2165-1
Martijn
1
Infelizmente isso é insuficiente. Você também deve atualizar libssl1.0.0explicitamente no ubuntu. Se você estiver vendo uma data de construção antes de 7 de abril de 2014, mesmo que o openssl seja a versão correta ( 1.0.1-4ubuntu5.12para o Ubuntu 12.04), você provavelmente ainda estará vulnerável.
danny
@danny Você acabou de me poupar muito trabalho. Eu estava tentando descobrir por que a data de compilação estava certa em alguns sistemas 12.04 e errada em outros. Você é um salva-vidas!
Schof 08/04
openssl version -apode não precisar da data de compilação de 7 de abril, porque a correção está sendo suportada para versões mais antigas.
Patrick James McDougle
4

Experimente o seguinte. Ele extrairá todas as seqüências de caracteres da biblioteca de criptografia à qual o ssh está vinculado. Produz mais de uma linha de saída, mas, se necessário, pode ser convertida em 1 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 de

...
OpenSSL 1.0.1f 6 Jan 2014

Ai, ainda não g.

waTeim
fonte
3
Eu pensei que você estava muito perto de fornecer uma boa solução, mas infelizmente isso não funciona para a biblioteca de criptografia no Ubuntu 12.04 LTS. Ele exibe todas as seqüências de caracteres com a versão [...] part of OpenSSL 1.0.1 14 Mar 2012, da mesma maneira que openssl version -afaz. Este é um truque que pode funcionar em outros casos!
287 Martijn
@ Martijn Bem, isso é lamentável, mas funciona no ubuntu 12.10. Estranho que ele se identificasse errado em 12.04. Existem várias bibliotecas? É possível que o ssh não use o mais atualizado?
waTeim
Não consegui encontrar outros binários openssl ou bibliotecas de criptografia. É sugerido por outros que a diferença é que, no 12.04 LTS, o Ubuntu está portando as alterações para a 1.0.1 sem atualizar a versão. Enquanto o 12.10 não é um LTS, o Ubuntu usa a versão mais recente lá, em vez de um backport.
287 Martijn
2

Algum desses scripts testa todos os serviços ou apenas o HTTPS ? AFAIK , o PostgreSQL é vulnerável, mas isso é apenas um boato até que um ataque ocorra.

Há um script metasploit disponível para uso.

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

Você pode digitar isso (testado com a versão binária do GnuWin32 OpenSSL 1.0.1.6, de 14-0-2014) ou apenas usar o script no comentário abaixo deste. É mais preciso e mais simples!

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

Depois de conectado, digite B e você verá 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 batimento cardíaco semelhante a esta.

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:

Há também estas ferramentas:

Justin Goldberg
fonte
0

Para o Ubuntu, você pode usar:

aptitude show libssl1.0.0 | grep Version

E compare com http://www.ubuntu.com/usn/usn-2165-1/ . Após uma reinicialização (!!!), você pode verificar com http://possible.lv/tools/hb.

Rufinus
fonte
0

Eu encontrei este script em devcentral :

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

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

Retornará "safe"se o servidor estiver bom ou "server extension "heartbeat" (id=15)"não.

Isso não depende do número da versão, mas da lista da extensão do servidor que causa o problema; portanto, ela deve estar imune às travessuras da versão da biblioteca.

A máquina que você estiver executando openssl s_clientem deve estar usando OpenSSL 1.0.1 ou mais tarde, a fim para que isso funcione.

egarcia
fonte
4
Útil, mas não informa se você possui uma versão com a extensão e a correção .
amigos estão dizendo sobre mattdm
1
Essa é realmente uma boa maneira de verificar a vulnerabilidade e é o que alguns scripts fazem. Na verdade, não requer acesso SSH.
Stefan Lasiewski
8
AVISO IMPORTANTE MUITO ASSUSTADOR - A máquina em que você está executandoopenssl s_clientDEVE estar usando o OpenSSL 1.0.1 ou posterior para que isso funcione. Se você executar este comando em uma máquina com 0.9.8 ou 1.0.0, SEMPRE INFORMARÁ "Seguro", mesmo para servidores vulneráveis .
precisa saber é o seguinte
Ímpar. Estou executando uma versão do OpenSSL que é supostamente afetados por esse bug, mas essa seqüência não aparecer na saída ...
Michael
@StefanLasiewski Eu atualizei a minha resposta e removeu o "precisa ssh" parte
egarcia