Na wat leeswerk (met name de antwoorden van Jack Lloyd en Thomas Pornin in
https://crypto.stackexchange.com/questions/257/unpredictability-of-x-509-serial-numbers), denk ik de reden te begrijpen om een random serial number te gebruiken. Het doel lijkt om een potentieel andere kwetsbaarheid lastiger exploitable te maken.
Bij die andere kwetsbaarheid gaat het om hash collisions in de digitale handtekening onder het certificaat, zoals aangetoond in 2008 door Alexander Sotirov, Marc Stevens, Jacob Appelbaum, Arjen Lenstra, David Molnar, Dag Arne Osvik en Benne de Weger in hun "hash-clash" onderzoek aan de TUe (TU Eindhoven, zie
https://www.win.tue.nl/hashclash/rogue-ca/). Voor degenen die niet weten hoe dat werkt, de volgende uitleg.
Een digitale handtekening maak je door een cryptografische hash over een document te berekenen, waarna die hash wordt versleuteld met de private key van de ondertekenaar (de certificaatverstrekker in dit geval). Nb. wat we in de praktijk gemakshalve een certificaat noemen, is feitelijk het echte certificaat + digitale handtekening (bijv. Wireshark zie je dit netjes opsplitsen).
Bij het ondertekenen van een certificaat gebeurt, in essentie, het volgende. De certificaataanvrager levert een CSR (Certificate Signing Request) in bij een CSP (Certificate Service Provider). Die CSP checkt of de public key daarin echt hoort bij het "subject" (zoals de domeinnaam in het geval van een website of een e-mail adres in het geval van een S/MIME certificaat). Als dat klopt zet de CSP een digitale handtekening waarmee het CSR een certificaat wordt. In de basis zou je dus exact dezelfde digitale handtekening moeten krijgen als je hetzelfde CSR nogmaals indient bij dezelfde CSP.
Het ligt echter wat ingewikkelder, want de CSP wijzigt verschillende velden in het CSR, zoals datum en tijd waarin de geldigheid ingaat en eindigt, maar ook het certificaat-serienummer (deze wijzigingen vinden natuurlijk plaats vóórdat de CSP ondertekent).
De "hash-clash" aanval van de TUe was mogelijk doordat dat zij de waardes van alle velden die de CSP wijzigde vlak voor het ondertekenen konden voorspellen, en daarmee de waarde van de hash. Dankzij het feit dat zij precies konden voorspellen wat de inhoud zou worden van het certificaat, en dus de resulterende waarde van de hash (toen nog MD5), konden zij hun feitelijke aanval uitvoeren, namelijk een MD5 hash collision realiseren.
Het risico
daarvan bestaat eruit dat je voor twee verschillende subjects certificaten kunt maken die dezelfde MD5 hash opleveren. Rekening houdend met de voorspelbare wijzigingen door de CSP kon de TUe (met veel rekenwerk) voor twee verschillende domeinnamen het volgende maken:
1) Een CSR voor een onbenullige domeinnaam waarvan ze de waarden van de door de CSP te wijzigen informatie hadden voospeld waarmee de voorspelde certificaatinhoud een specifieke MD5 hash zou opleveren;
2) Een volledig ingevuld maar nog niet ondertekend certificaat -nog zonder handtekening- voor een andere domeinnaam (van een bank bijvoorbeeld) met identieke MD5 hash.
Na het terugkrijgen van het eerste -door de CSP ondertekende- certificaat, hoefden ze alleen maar de handtekening daaruit te kopiëren en plakken achter het nepcertificaat, waarmee ook dat een geldige handtekening kreeg.
Het idee is dat je dit soort aanvallen lastiger uitvoerbaar maakt als je niet kunt voorspellen wat de CSP wijzigt in het CSR voordat deze wordt ondertekend. Dat hoeft overigens geen serienummer te zijn, de CSP zou een apart veld (onder een OID) kunnen toevoegen met een aantal random bytes naar keuze. Maar goed, er is gekozen voor ranomization van het serienummer om dit (en daarmee de hash gebruikt voor de handtekening) onvoorspelbaar te maken.
De discussie is nu kennelijk dat 64 bits genoeg is en 63 bits te weinig. Ervan uitgaande dat de in omloop zijnde 63bit lange random nummers niet voorspelbaar zijn (daar heb ik niks over gelezen), blijf ik bij mijn standpunt: tot iemand mij uitlegt waarom dit een issue is vind ik het schandalige verspilling van belastinggeld en erger, het leidt af van veel belangrijker zaken.
Nb. zelfs als de gebruikte serienummers (ongeacht aantal bits) voorspelbaar zouden zijn, heb je een SHA2 hash-collision nodig om een nepcertificaat te kunnen maken. Het risico van dit soort trucs (randomization van serienummers) is dat we, zodra een of meer SHA2 hash-collisions worden gevonden, we gaan stellen dat dit niet erg is omdat die random serienummers aanvallen tegengaan (net zo stompzinnig als bij 2FA stellen dat verlies van 1 factor geen probleem is).