3.1 Low-level RSA signaturesWe ontkomen niet aan een stukje low-level techniek. Nogmaals
ik ben geen expert, correcties en aanvullingen zijn welkom.
Hoe een RSA sleutelpaar precies gegenereerd wordt leg ik
hier niet uit. Van belang is dat je weet dat er uiteindelijk
drie positieve gehele getallen uit rollen:
n: de modulus
e: de public exponent
d: de private exponent
De public key wordt gevormd door zowel e als n, en de
private key door zowel d als n (beide keys bestaan feitelijk
uit twee positieve gehele getallen, waarbij "n" in beide
keys wordt gebruikt).
Bij RSA encryptie wordt de "message" of "plaintext" (de te
versleutelen data) opgenomen als onderdeel in een blok van
vaste lengte, bijv. 1024 bits (128 bytes). Bij signatures,
waarbij een hash (ook bekend als message digest) wordt
versleuteld met het PKCS #1 protocol (RFC3447), is de layout
van dit blok als volgt:
EncodedMessage =
| 0 | 1 | Padding | 0 | ASN.1_DigestInfo |
"Padding" bevat zoveel 0xFF bytes als nodig om tot de
gewenste bloklengte te komen, en ASN.1_DigestInfo bevat,
naast de hash zelf, onder meer informatie over welk hash
algoritme wordt gebruikt. N.B. "Encoded" betekent hier
alleen ingepakt, er is nog niets versleuteld! Dat
versleutelen gaat als volgt:
[color=red]signature = EncodedMessage^d mod n
[/color]
oftewel "EncodedMessage" wordt hier als een getal beschouwd
en tot de macht "d" verheven, en van het getal dat daar
uitkomt wordt de modulus met "n" berekend (modulus is de
rest na een deling, bijv. 11 mod 3 geeft 2). De ontvanger
decrypt de signature weer in een EncodedMessage als volgt:
[color=red]EncodedMessage = signature^e mod n
[/color]
waarna de hash uit de EncodedMessage gehaald wordt.
3.2 Public Exponent=3Indien de public exponent "e" de waarde 3 heeft, blijken een
aantal implementaties kwetsbaar, als ik het goed begrijp bij
het uitpakken van de EncodedMessage (dus
na het
decrypten). In OpenSSL zijn zelfs twee verschillende
problemen geconstateerd. In beide gevallen laat de software
zich verleiden om de "hash" op een verkeerde plaats uit het
blok te halen. De aanvaller maakt namelijk een
EncodedMessage als volgt:
| 0 | 1 | Padding | 0 | ASN.1_DigestInfo | Troep |
waarbij de aanvaller de lengte van padding varieert om zo
troep (vrij te kiezen bytes) toe te kunnen voegen. Als de
aanvaller weet dat de ontvanger een root certificaat met
public key exponent = 3 in z'n browser heeft, kan hij een
certificaat naar keuze maken dat door de door hem gekozen CA
lijkt te zijn gesigneerd. Hoe dat precies in z'n werk gaat
begrijp ik nog niet helemaal, maar het komt er op neer dat
de aanvaller in elk geval zo met de hash, de troep en het
aantal padding bytes moet spelen totdat het blok een macht
van 2 vormt, waarna hij de wortel daarvan als signature kan
gebruiken (ik vermoed dat er dan nog een iteratieslag nodig
is om de signature te laten goedkeuren).
3.3 Oorzaken exp=3 bugsDe bug waar Bleichenbacher op doelt ontstaat doordat OpenSSL
niet controleert of ASN.1_DigestInfo helemaal rechts in het
blok zit. Ook andere implementaties (doch niet GnuTLS)
blijken na de 0, de 1 en een onbekend aantal 0xFF bytes te
zoeken naar de eerstvolgende 0, om er daarna blind van uit
te gaan dat daarop de ASN.1_DigestInfo volgt.
Een tweede probleem, zowel in OpenSSL als in GnuTLS, zou
door Yutaka Oiwa, Kazukuni Kobara en Hajime Watanabe zijn
ontdekt, en wordt in
http://www.mail-archive.com/cryptography%40metzdowd.com/msg06624.htmltoegelicht door Simon Josefsson. Daarbij zou een signature
ook zijn te vervalsen door de ASN.1 structure te manipuleren.
Beide bugs werken, voor zover mij bekend, alleen bij een
public key met public exponent=3.
3.4 Nog niet genoemde bronnenhttp://en.wikipedia.org/wiki/RSAhttp://en.wikipedia.org/wiki/ASN.1Aardige RSA uitleg page waar ook wikipedia naar verwijst
http://www.di-mgt.com.au/rsa_alg.htmlIndex van een archive van de Cryptography maillijst
http://www.mail-archive.com/cryptography%40metzdowd.com/maillist.htmlPublic-Key Cryptography Standards (PKCS) #1: RSA
Cryptography Specifications Version 2.1
http://tools.ietf.org/html/rfc3447Generate a keypair using OpenSSL
http://en.wikibooks.org/wiki/Transwiki:Generate_a_keypair_using_OpenSSLForscher stellen Exploit für SSL-Schwachstelle vor
http://www.heise.de/security/news/meldung/78274Het enige artikel op security.nl dat inhoudelijk aandacht
besteed aan deze bug, met op dit moment nog geen enkel
commentaar
http://www.security.nl/article/14383/1/SSL_spoofing_door_beveiligingslek_in_RSA_crypto.htmlOpenSSL-Signaturen lassen sich fälschen
http://www.heise.de/security/news/meldung/77783