Acht bits aan vertrouwen: CA-sleutels van eMudhra in milliseconden gekraakt

Niet een getal dat begint met 4, of het getal 4 gevolgd door een paar honderd willekeurige cijfers, maar gewoon: 4. Een andere is 56, en weer een andere is 115. Ik weet dit omdat ik ze zojuist allemaal heb hersteld vanuit hun publieke certificaten op mijn laptop, en dat kostte minder dan een seconde.

Wat er is gebeurd

Op zaterdag 17 oktober meldde een beveiligingsonderzoeker aan Apple, Google, Microsoft, Mozilla en eMudhra dat de private sleutels van acht eMudhra-tussencertificaten (intermediates) gecompromitteerd waren. Chrome verspreidde diezelfde avond een CRLSet-update om ze te blokkeren, en Mozilla blokkeerde ze enkele uren later in Firefox via OneCRL. Op dinsdag de 20ste maakte Mozilla dit publiekelijk bekend en bracht een NSS-update uit waarmee de eMudhra-root werd verwijderd. Chrome bevestigde dat de root wordt opgenomen in Chrome Root Store v43.

De acht intermediates bestaan uit zes TLS-uitgevende CA's (DV, OV en EV, elk in twee generaties) en twee code-signing CA's, die allemaal in april 2025 zijn aangemaakt. Elke sleutel was in mei 2025 ook cross-signed door de AAA Certificate Services-root van Sectigo.

Dat is het "wat", maar het "hoe" is het interessante deel. Ian Carroll vatte het in één regel samen in de discussie: Ze zijn inherent zwakke single-byte sleutels die iedereen kan factoriseren, en het probleem kan niet worden ingedamd.

Wat een private sleutel precies is

Het gaat hier om elliptic-curve sleutels op de P-384 curve. De private sleutel is simpelweg een getal, $d$. De publieke sleutel — het onderdeel dat in het certificaat staat zodat de hele wereld het kan zien — is $d \times G$. Hierbij is $G$ een vast punt op de curve dat door iedereen wordt gebruikt, en "×" staat voor het $d$ keer optellen van $G$ aan zichzelf met behulp van de speciale rekenkunde van de curve.

Voorwaarts rekenen is eenvoudig, maar terugrekenen van de publieke sleutel naar $d$ wordt als onpraktisch beschouwd. Dat is het volledige beveiligingsmodel, maar dit werkt alleen als $d$ enorm is. Een P-384 private sleutel zou een willekeurig 384-bit getal moeten zijn, wat $2^{384}$ mogelijkheden oplevert (ongeveer $10^{115}$), waardoor niemand dit ooit kan doorzoeken.

De sleutels van eMudhra zien er echter als volgt uit: `d = 0x0000000000000000000000000000000