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:
- https://twitter.com/orblivion/status/453323034955223040
- https://twitter.com/axiomsofchoice/status/453309436816535554
Algumas sugestões (específicas para cada distribuição):
- Ubuntu e Debian:
apt-cache policy openssl
eapt-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:
- Não é totalmente confiável, mas você pode tentar
lsof -n | grep ssl | grep DEL
. Veja Heartbleed: como verificar de forma confiável e portável a versão do OpenSSL? por que isso pode não funcionar para você.
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 -a
indica built on: Mon Apr 7 20:33:29 UTC 2014
.
[root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013
apt-cache policy openssl
e ele respondeu com:Installed: 1.0.1-4ubuntu5.12
qual é 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?Respostas:
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 -a
continua 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+deb7u5
vez da versão upstream de1.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.
fonte
openssl version -a
não será um método portátil (pelo menos não portátil para o Ubuntu). Eu verifiqueiapt-cache policy openssl
e ele respondeu com:Installed: 1.0.1-4ubuntu5.12
qual é o 1.0.1g lançado pelo Ubuntu para o 12.04 LTS. Eu saí e voltei antes de verificar.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.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
VersionAddendum
diretiva 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:
... mesmo que tenha sido corrigido :
Com coisas assim em jogo, você estará melhor se não confiar no número da versão.
fonte
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:
dpkg -s openssl | grep Version
mostra a versão 1.0.1-4ubuntu5.12 ou posterior.dpkg -s libssl1.0.0 | grep Version
mostra a versão 1.0.1-4ubuntu5.12 ou posterior.openssl version -a
mostra uma data "construída em" em 7 de abril de 2014 ou posterior.Obrigado a @danny pela informação adicional.
fonte
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ão1.0.1c-3ubuntu2.7
e se você estiver em 13.10 então ele deve estar pelo menos a versão1.0.1e-3ubuntu1.2
, de acordo com a fonte: ubuntu.com/usn/usn-2165-1libssl1.0.0
explicitamente 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.12
para o Ubuntu 12.04), você provavelmente ainda estará vulnerável.openssl version -a
pode não precisar da data de compilação de 7 de abril, porque a correção está sendo suportada para versões mais antigas.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.
produz
por exemplo, no Gentoo antes de emergir
o comando acima resulta em
depois de
Ai, ainda não g.
fonte
[...] part of OpenSSL 1.0.1 14 Mar 2012
, da mesma maneira queopenssl version -a
faz. Este é um truque que pode funcionar em outros casos!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.
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!
Depois de conectado, digite B e você verá um host vulnerável e não será desconectado:
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
Fonte:
Há também estas ferramentas:
https://github.com/titanous/heartbleeder
http://filippo.io/Heartbleed/
https://github.com/musalbas/heartbleed-masstest
fonte
Para o Ubuntu, você pode usar:
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
.fonte
É melhor atualizar para o OpenSSL mais recente OpenSSL 1.0.1j.
http://blog.vincosolution.com/2014/10/upgrade-openssl-1-0-1j-debianubuntu.html
fonte
Eu encontrei este script em devcentral :
Substitua
example.com
pelo 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_client
em deve estar usando OpenSSL 1.0.1 ou mais tarde, a fim para que isso funcione.fonte
openssl s_client
DEVE 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 .