Heartbleed: come verificare in modo affidabile e portabile la versione OpenSSL?


88

Stavo cercando un modo affidabile e portatile per controllare la versione OpenSSL su GNU / Linux e altri sistemi, in modo che gli utenti possano facilmente scoprire se devono aggiornare il proprio SSL a causa del bug Heartbleed.

Ho pensato che sarebbe stato facile, ma ho riscontrato rapidamente un problema su Ubuntu 12.04 LTS con l'ultimo OpenSSL 1.0.1g:

versione di openssl -a

Mi aspettavo di vedere una versione completa, ma invece ho ottenuto questo:

OpenSSL 1.0.1 14 marzo 2012
costruito il: martedì 4 giugno 07:26:06 UTC 2013
piattaforma: [...]

Con mia spiacevole sorpresa, la lettera della versione non mostra. No f, no g lì, solo "1.0.1" e basta. Le date elencate non aiutano neanche a scoprire una versione (non) vulnerabile.

La differenza tra 1.0.1 (af) e 1.0.1g è cruciale.

Domande:

  • Qual è un modo affidabile per controllare la versione, preferibilmente cross-distro?
  • Perché la lettera della versione non viene visualizzata in primo luogo? Non sono stato in grado di testarlo su nient'altro che Ubuntu 12.04 LTS.

Anche altri stanno segnalando questo comportamento. Alcuni esempi:

Alcuni suggerimenti (specifici per la distro) che arrivano:

  • Ubuntu e Debian: apt-cache policy openssle apt-cache policy libssl1.0.0. Confronta i numeri di versione con i pacchetti qui: http://www.ubuntu.com/usn/usn-2165-1/
  • Fedora 20: yum info openssl(grazie @znmeb su Twitter) eyum info openssl-libs

Verifica se una versione precedente di OpenSSL è ancora residente:

Si scopre che l'aggiornamento del pacchetto OpenSSL su Ubuntu e Debian non è sempre sufficiente. Dovresti anche aggiornare il pacchetto libssl1.0.0 e -then- controlla se openssl version -aindica built on: Mon Apr 7 20:33:29 UTC 2014.


2
almeno assicurati che la versione di OpenSSL che hai non sia g a causa della data che mostra
Pato Sáinz

3
Funziona su CentOS[root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013
Jacob,

1
@ PatoSáinz Ho controllato apt-cache policy openssle ha risposto con: Installed: 1.0.1-4ubuntu5.12che è la 1.0.1g appena rilasciata da Ubuntu per 12.04 LTS. Ho effettuato il logout e di nuovo l'accesso. C'è qualcos'altro che posso fare per verificare?
Martijn

1
Lo farò notare, per quello che non lo so, nel caso sia utile ... Ubuntu 12.04 LTS fornito con OpenSSL 1.0.1 (vaniglia).
HopelessN00b

1
Se la data di compilazione è accurata, non è possibile avere il codice "versioned release" più recente di 1.0.1e, poiché 1.0.1f è uscito nel 2014 in base alle note di rilascio di OpenSSL 1.0.1 . Ovviamente, le singole linee o sezioni potrebbero essere state backportate nella versione di Ubuntu prima della versione ufficiale di OpenSSL 1.0.1f. E la data di costruzione potrebbe essere meno utile.
Password anti-debole

Risposte:


66

In base alla data visualizzata dalla tua versione di OpenSSL, sembra che tu stia vedendo la versione completa visualizzata lì.

Open SSL 1.0.1 è stato rilasciato il 14 marzo 2012 . 1.0.1a è stato rilasciato il 19 aprile 2012.

Quindi, andrò avanti e affermerò che openssl version -aè il modo corretto e cross-distro per visualizzare la versione completa di OpenSSL installata sul sistema. Sembra funzionare per tutte le distro Linux a cui ho accesso, ed è anche il metodo suggerito nella documentazione OpenSSL help.ubuntu.com . Ubuntu LTS 12.04 è stato fornito con OpenSSL v1.0.1 vaniglia, che è la versione che assomiglia a una versione abbreviata, a causa del non avere una lettera che la segue.

Detto questo, sembra che ci sia un grosso bug in Ubuntu (o come impacchettano OpenSSL), in quanto openssl version -acontinua a restituire la versione 1.0.1 originale dal 14 marzo 2012, indipendentemente dal fatto che OpenSSL sia stato aggiornato a delle versioni più recenti. E, come nella maggior parte delle cose quando piove, piove a dirotto.

Ubuntu non è l'unica grande distribuzione nell'abitudine di eseguire il backport degli aggiornamenti in OpenSSL (o altri pacchetti), piuttosto che affidarsi agli aggiornamenti upstream e alla numerazione delle versioni che tutti riconoscono. Nel caso di OpenSSL, dove i numeri di versione delle lettere rappresentano solo la correzione di bug e gli aggiornamenti di sicurezza, questo sembra quasi incomprensibile, ma sono stato informato che ciò potrebbe essere dovuto al plug -in convalidato dal FIPS delle principali distribuzioni Linux fornite con OpenSSL. A causa dei requisiti relativi alla riconvalida che si attivano a causa di qualsiasi modifica, anche delle modifiche che collegano i buchi di sicurezza, è bloccato nella versione.

Ad esempio, su Debian, la versione fissa mostra un numero di versione 1.0.1e-2+deb7u5anziché la versione upstream di 1.0.1g.

Di conseguenza, al momento, non esiste un modo affidabile e portatile per controllare le versioni SSL tra le distribuzioni Linux , poiché tutti usano le proprie patch e gli aggiornamenti backport con schemi di numerazione delle versioni differenti. Dovrai cercare il numero di versione fisso per ogni diversa distribuzione di Linux che esegui e verificare la versione di OpenSSL installata rispetto alla numerazione di versione specifica di quella distribuzione per determinare se i tuoi server eseguono o meno una versione vulnerabile.


3
La mia installazione è un semplice Ubuntu 12.04 LTS senza nulla che abbia compilato o scaricato da fonti diverse dai repository Ubuntu. Se Ubuntu distribuisce OpenSSL con numeri di versione abbreviati, openssl version -anon è un metodo portatile (almeno non portatile su Ubuntu). Ho controllato apt-cache policy openssle ha risposto con: Installed: 1.0.1-4ubuntu5.12che è la 1.0.1g appena rilasciata da Ubuntu per 12.04 LTS. Ho effettuato il logout e di nuovo il login prima di controllare.
Martijn

19
HopelessN00b, non vi è nulla di dubbio sulla politica di backport delle correzioni invece che delle versioni bumping; è un ottimo modo per garantire la stabilità della piattaforma, che è altamente desiderabile in un ambiente server. Come ogni decisione, ha delle conseguenze, di cui gli utenti devono essere consapevoli; ma solo perché interrompe il ragionamento " Sto correndo foo xyz quindi sono / non sono vulnerabile all'ultimo exploit ", ciò non lo rende una cosa negativa.
MadHatter

10
@towo Esistono numeri di versione per un motivo. Se vogliamo semplicemente buttare fuori dalla finestra i numeri della versione a monte perché "enterprisey" o altro, perché preoccuparsi dei numeri di versione? Può anche iniziare a nominare tutte le nostre cose con allitterazioni. Possiamo chiamare le versioni vulnerabili di OpenSSL Holy Heartbleed e quelle fisse Cunning Coagulant .
HopelessN00b

7
@ HopelessN00b Penso che vieni catturato dalla trappola "questo problema è stato risolto nella versione XYZ", non seguono i numeri di versione perché tutto ciò che viene importato nell'ultima versione sono bug e correzioni di sicurezza. Se aumentassero il numero di versione, ti aspetteresti anche la funzionalità aggiuntiva. "Ho OpenSSL v XYZ, perché non ho ECDHA ???? ..etc". Ha senso quando si capisce che si tratta solo di correzioni di bug.
Nick

13
@NickW @Jubal @MadHatter la cosa con OpenSSL, tuttavia, è che: 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.Quindi, non si ottiene nulla abbandonando lo schema di versioning upstream; il backport degli aggiornamenti è essenzialmente lo stesso dell'utilizzo della versione aggiornata, poiché l'aggiornamento include comunque solo correzioni di sicurezza e bug. Quello che fa è confondere le cose e non ci lasciano alcun modo per controllare in modo portabile la versione OpenSSL attraverso le distro Linux.
HopelessN00b

18

Se desideri qualcosa di veramente multipiattaforma, controlla la vulnerabilità stessa anziché fare affidamento sui numeri di versione.

È possibile che sia presente un codice che riporta un numero di versione noto per essere vulnerabile, ma il codice effettivo non è vulnerabile . E il contrario - codice silenziosamente vulnerabile - potrebbe essere anche peggio!

Molti fornitori che raggruppano prodotti open source come OpenSSL e OpenSSH adatteranno selettivamente le correzioni urgenti a una versione precedente di codice, al fine di mantenere la stabilità e la prevedibilità delle API. Ciò è particolarmente vero per le "versioni a lungo termine" e le piattaforme di dispositivi.

Ma i fornitori che lo fanno in silenzio (senza aggiungere il proprio suffisso di stringa di versione) corrono il rischio di innescare falsi positivi negli scanner di vulnerabilità (e confondere gli utenti). Quindi, per renderlo trasparente e verificabile, alcuni fornitori aggiungono le proprie stringhe alla versione del pacchetto principale. Sia Debian (OpenSSL) che FreeBSD (in OpenSSH, tramite la VersionAddendumdirettiva sshd_config) a volte lo fanno.

I venditori che non lo fanno probabilmente lo stanno facendo per ridurre al minimo le possibilità di rottura a causa dei molti modi diretti e indiretti con cui altri programmi controllano i numeri di versione.

Quindi può apparire così:

$ 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

... anche se è stato corretto :

$ 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

Con cose come questa in gioco, stai meglio se non ti fidi del numero di versione.


È chiaro che controllare le versioni non è così semplice e trasparente come speravo. Verificare la vulnerabilità è multipiattaforma, ma è anche più difficile da eseguire: è necessario disporre di un PoC affidabile o testare a portata di mano il particolare servizio software vulnerabile in esecuzione. In questo caso è iniziato tutto con un PoC per Apache e nginx. E se in quel momento stavo usando SMTP con SSL e volessi verificare se sono vulnerabile? Alla fine avremo dei test per la maggior parte dei servizi, ma potrebbe richiedere del tempo.
Martijn,

Martijn, questo è un punto giusto. Quando un test non è disponibile, i metodi secondari (come rintracciare il checksum per i file binari interessati sui sistemi di destinazione) sono meno ottimali, ma potrebbero essere abbastanza buoni da portare a termine il lavoro ... e quindi passare al fuoco successivo. :-)
Royce Williams

14

Sfortunatamente, non sono sicuro che ci sia un modo multipiattaforma per farlo. Come discuto in un post sul blog , la versione di OpenSSL visualizzata su Ubuntu 12.04 RIMANE 1.0.1 dopo l'aggiornamento a una versione fissa.

SOLO per Ubuntu 12.04, puoi sapere se sei stato aggiornato se tutto quanto segue è vero:

  1. dpkg -s openssl | grep Version mostra la versione 1.0.1-4ubuntu5.12 o successive.
  2. dpkg -s libssl1.0.0 | grep Version mostra la versione 1.0.1-4ubuntu5.12 o successive.
  3. openssl version -a mostra una data "incorporata" del 7 aprile 2014 o successive.

Grazie a @danny per le informazioni aggiuntive.


2
Ok, in quel caso devo aggiungere che la versione del pacchetto 1.0.1-4ubuntu5.12è SOLO per Ubuntu 12.04 LTS. Se sei su Ubuntu 12.10 dovresti vedere almeno la versione 1.0.1c-3ubuntu2.7e se sei su 13.10, allora dovrebbe essere almeno la versione 1.0.1e-3ubuntu1.2, secondo la fonte: ubuntu.com/usn/usn-2165-1
Martijn

1
Questo è purtroppo insufficiente. È inoltre necessario eseguire l'aggiornamento libssl1.0.0esplicito su Ubuntu. Se vedi una data di inizio precedente al 7 aprile 2014 anche se openssl è la versione sembra corretta ( 1.0.1-4ubuntu5.12per Ubuntu 12.04) probabilmente sei ancora vulnerabile.
Danny,

@danny Mi hai appena salvato così tanto lavoro. Stavo cercando di capire perché la data di costruzione fosse corretta su alcuni sistemi 12.04 e sbagliata su altri. Sei un vero toccasana!
Schof,

openssl version -apotrebbe non essere necessaria la data di compilazione del 7 aprile, poiché la correzione viene trasferita alle versioni precedenti.
Patrick James McDougle,

4

Prova quanto segue. Estrarrà tutte le stringhe dalla libreria di crittografia a cui ssh è collegato. Produce più di una riga di output, ma se necessario può essere convertito in 1 riga.

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

produce

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

ad es. su Gentoo prima di emergere

[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

il comando sopra risulta in

...
OpenSSL 1.0.1c 10 May 2012

dopo

...
OpenSSL 1.0.1f 6 Jan 2014

Ahi, ancora no g.


3
Pensavo fossi molto vicino a fornire una buona soluzione, ma sfortunatamente questo non funziona per la libreria crittografica su Ubuntu 12.04 LTS. Visualizza tutte le stringhe con la versione [...] part of OpenSSL 1.0.1 14 Mar 2012, come openssl version -afa. Questo è un trucco che potrebbe funzionare in altri casi però!
Martijn,

@Martijn Beh, è ​​un peccato, ma funziona su Ubuntu 12.10. Strano che si sarebbe identificato erroneamente su 12.04. Ci sono più librerie? È possibile che ssh non utilizzi il più aggiornato?
WaTeim

Non sono stato in grado di trovare altri binari openssl o librerie crittografiche. Altri suggeriscono che la differenza è che, su 12.04 LTS, Ubuntu esegue il backport delle modifiche alla 1.0.1 senza aumentare la versione. Mentre 12.10 non è un LTS e quindi Ubuntu usa l'ultima versione lì invece di un backport.
Martijn,

2

Qualcuno di questi script verifica tutti i servizi o verifica solo HTTPS ? AFAIK , PostgreSQL è vulnerabile, ma è solo una voce fino a quando non emerge un attacco selvaggio.

È disponibile uno script metasploit .

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

È possibile digitare questo (testato con la versione binaria 1.0.1.6 GnuWin32 OpenSSL, datata 2014-01-14), oppure usare semplicemente lo script nel commento sotto questo. È più preciso e più semplice!

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

Una volta connesso, digita B e vedrai un host vulnerabile e non sarai disconnesso:

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

Riceverai una risposta al battito cardiaco simile a questa.

Su un host con patch, vedrai una risposta simile alla seguente e verrai disconnesso:

Inserisci 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   .~.V..7.@...C...
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:

Ci sono anche questi strumenti:




0

Ho trovato questo script in devcentral :

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

Sostituire example.comcon il nome o l'indirizzo IP del server che si desidera verificare.

Restituirà "safe"se il tuo server è a posto o in "server extension "heartbeat" (id=15)"caso contrario.

Questo non dipende dal numero di versione, ma dall'elenco dell'estensione del server che causa il problema, quindi dovrebbe essere immune alla versione della libreria shenanigans.

Per poter funzionare, openssl s_clientil computer su cui è in esecuzione deve utilizzare OpenSSL 1.0.1 o versione successiva.


4
Utile, ma non ti dice se hai una versione con l'estensione e la correzione .
Mattdm,

1
Questo è davvero un buon modo per verificare la vulnerabilità ed è ciò che fanno alcuni script. In realtà non richiede l'accesso SSH.
Stefan Lasiewski,

8
GRANDE AVVISO IMPORTANTE - La macchina su cui si sta eseguendoopenssl s_clientDEVE utilizzare OpenSSL 1.0.1 o versioni successive affinché funzioni. Se si esegue questo comando su un computer con 0.9.8 o 1.0.0, SI RIPORTERÀ SEMPRE "Sicuro", anche per i server vulnerabili .
voretaq7,

Dispari. Sto eseguendo una versione di OpenSSL presumibilmente influenzata da questo errore, ma quella stringa non appare nell'output ...
Michael

@StefanLasiewski Ho aggiornato la mia risposta e rimosso la parte "need ssh"
egarcia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.