Aan voorlaatste reageerders: ik weet niet
zeker of er sprake was van een BGP-hijack c.q. een onbedoelde configuratiefout. Maar als RosTelecom 2x zo'n blunder begaat, "toevallig" voor een enorm aantal domeinen, geloof ik niet meer in toeval. Zie ook opmerking D onderaan deze bijdrage.
Door Anoniem: Als de validatie slaagt is er niets aan de hand want het certificaat gaat alsnog naar de originele aanvrager, niet naar de MITM partij.
Als ik
https://letsencrypt.org/how-it-works/ goed begrijp, werkt het als volgt bij
http validatie.
In het voorbeeld hieronder ga ik uit van een webserver "example.com" met IP-adres 2.2.2.2. Ook ga ik ervan uit dat de aanvraag steeds plaatsvindt
vanaf dat IP-adres 2.2.2.2. Gebruikelijk is het immers om de certificaat-aanvragende client op de betreffende webserver
zelf te draaien, zodat automatische vervanging van het certificaat (elke 3 maanden) mogelijk is (zie bijv.
https://certbot.eff.org/docs/install.html#about-certbot).
Je moet een
account aanmaken op basis van een zelf-gegenereerd asymmetrisch sleutelpaar (dit is
niet het sleutelpaar waarvan de public key in het certificaat wordt opgenomen). Als ik het goed begrijp is dit nodig om de aanrvager aan de feitelijke webserver te koppelen in de situatie dat je de certificaat-aanvraag
vanaf een ander systeem indient dan de webserver. Ik verneem het graag als bijv. deze aanname van mij onjuist of onvolledig is.
Stap 1: maak account-keypair en vraag certificaat aanDe aanvrager genereert een asymmetrisch sleutelpaar voor een
account bij LE (Let's Encrypt) en vraagt een https servercertificaat aan voor "example.com" bij Let's Encrypt. Hierbij sla ik even over dat de aanvrager daarvoor een DNS lookup moet doen voor de juiste LE server, ik gaan ervan uit dat dit werkt zoals verwacht. Die aanvraag vindt dan plaats als volgt, met rechts van het midden de routering van IP netwerkpakketjes via Internet ("8390" en "ed89" heb ik overgenomen uit de voorbeelden in
https://letsencrypt.org/how-it-works/; advies: kijk eerst daar):
-> s.v.p. cert voor example.com AS3 AS2
Aanvrager hierbij mijn PubKey1 AS5 o----o
[ 2.2.2.2 ]---------------https--------------------o / \
<- OK, zet "ed89" in exampl.com/8390/ \ / o----[ LE ]
en sign met PrivKey1 \ / AS1
o
AS4
In bovenstaand plaatje heeft AS4 (Autonomous System number) naar AS5 geadverteerd dat de kortste route naar de LE server via hem (AS4 dus) loopt. Op zijn beurt heeft AS3 dat aan AS4 geadverteerd, AS2 aan AS3 en AS1 aan AS2. Dit zorgt ervoor dat IP netwerkpakketjes vanaf de aanvrager de LE server bereiken.
Hoewel routes op Internet
asymmetrisch kunnen zijn (en zelfs kunnen veranderen tijdens verbindingen) ga ik ervan uit dat de omgekeerde weg precies dezelfde is en blijft. AS2 heeft dus naar AS1 geadverteerd dat de kortste route naar 2.2.2.2 via hem loopt; op zijn beurt heeft AS3 dat aan AS2 geadverteerd, AS4 aan AS3 en AS5 aan AS4.
Nb. hoewel hierbij sprake is van een
https verbinding, is de enige die zich
betrouwbaar authenticeert de LE server. De aanvrager heeft welliswaar een asymmetrisch sleutelpaar, maar helemaal niemand bevestigt van wie dat sleutelpaar is, dat is dus geen absolute authenticatie (je kunt er, bij volgende transacties, wel mee aantonen dat het om hetzelfde account gaat).
Stap 2: LE vraagt IP-adres van example.com opLE vraagt middels een DNS "A" lookup op wat het IP-adres is van example.com. Hierbij ga ik ervan uit dat 1.1.1.1 een authoritative DNS server is voor example.com. Ik ga ervan uit dat het DNS account niet gekaapt is en de route tussen LE en de DNS-server verloopt en niemand "onderweg" de DNS-vraag en/of -antwoord manipuleert:
AS9
o AS6
Authoritative / \ o--[ LE ]
DNS server <- DNS-request: A: example.com / \ /
[ 1.1.1.1 ]---------------DNS-------------------o \ /
-> Antw: example.com = 2.2.2.2 AS10 \ /
o------o
AS8 AS7
Stap 3: LE maakt http verbinding met 2.2.2.2 en vraagt eerder verstrekt bewijs op Echte AS3 AS2
Webserver <- geef mij http://example.com/8390/ AS5 o----o
[ 2.2.2.2 ]---------------http---------------------o / \
-> "ed89" + signature (met PrivKey1) \ / o----[ LE ]
\ / AS1
o
AS4
Nu heeft 2.2.2.2 bewezen dat:
1) example.com daadwerkelijk IP-adres 2.2.2.2 heeft, en
2) dat de aanvrager iets
gesigneerd kan schrijven in http://example.com/8390/.
Stap 4: Genereer CSR, LE ondertekent dit en verstrekt het resulterende certificaatDe aanvrager genereert een nieuw asymmetrisch sleutelpaar en een CSR (Certificate Signing Request), feitelijk een certificaat dat nog niet is ondertekend door een Certificate Authority (zoals Let's Encrypt). Ik weet niet precies hoe dit proces verloopt, maar ik vermoed dat dit CSR tijdelijk ondertekend wordt met de private key van het
account om nep-aanvragen te voorkomen. Hierna vult LE het CSR aan met zaken als verloopdatum, OCSP URL etc. en ondertekent het, waarmee het een geldig certificaat wordt voor example.com - en vrijelijk kan worden verspreid - o.a. naar de bedoelde webserver.
So far, so good.
Stap 5: BGP-hijack: aanvaller maakt eigen account-keypair en vraagt certificaat aanNu gaan we uit van de situatie dat er een BGP hijack plaatsvindt en IP-verkeer van AS2 niet meer wordt uitgewisseld met AS3, maar met AS11:
Echte AS3 AS2
Aanvrager (doet niets) AS5 o o
[ 2.2.2.2 ]------------------------------------------o / / \
\ / / o----[ LE ]
\ / / AS1
o /
FAKE -> s.v.p. cert voor example.com AS4 /
Aanvrager hierbij mijn PubKey2 /
[ 2.2.2.2 ]---------------https---------------------------o
<- OK, zet "ed89" in exampl.com/8390/ AS11
en sign met PrivKey2 @AS2: kortste route
naar 2.2.2.2 via mij
Hier heeft de FAKE aanvrager een
nieuw account-sleutelpaar gegenereerd, waarmee hij een certificaataanvraag doet.
Stap 6: LE vraagt IP-adres van example.com opIk ga ervan uit dat hier niets is veranderd, zie het plaatje onder stap 2.
Stap 7: LE maakt http verbinding met 2.2.2.2 en vraagt eerder verstrekt bewijs op Echte AS3 AS2
Webserver (ontvangt niets) AS5 o o
[ 2.2.2.2 ]------------------------------------------o / / \
\ / / o----[ LE ]
\ / / AS1
o /
FAKE AS4 /
Webserver <- geef mij http://example.com/8390/ /
[ 2.2.2.2 ]---------------http----------------------------o
-> "ed89" + signature (met PrivKey2) AS11
@AS2: kortste route
naar 2.2.2.2 via mij
Stap 8: Genereer CSR, LE ondertekent dit en verstrekt het resulterende certificaatNu heeft LE dus een certificaat voor een FAKE webserver gesigneerd.
OpmerkingenA) In theorie zou LE kunnen weigeren om certificaten voor example.com te verstrekken aan iemand met een
ander account (lees: ander sleutelpaar). Echter, zodra jouw legitieme account-private key gecompromitteerd raakt of kwijtraakt (na een HDD crash zonder back-up), zou je een probleem hebben. Uit
https://letsencrypt.org/docs/revoking/#using-a-different-authorized-account maak ik op dat je
te allen tijde kunt bewijzen dat jij een certificaat voor example.com mag aanvragen. En als
jij dat mag, dan mag een
aanvaller dat dus ook!
B) Het feit dat je net zo kansloos bent zodra een aanvaller schrijftoegang krijgt tot de DNS-records van example.com (en 2.2.2.2 wijzigt in het IP-adres van een server in zijn bezit), is aanvullend bewijs dat die aanvaller niet in het bezit hoeft te zijn van jouw account-private key (zie
https://www.security.nl/posting/593796/Aanvallers+wijzigen+wereldwijd+dns-instellingen+domeinen).
C) De BGP-hijack zou ook betrekking kunnen hebben op de DNS-request (plaatje in stap 2). DNSSEC helpt dat voorkomen, maar is nog lang niet overal in gebruik. Mogelijk onder andere daarom doet LE sinds kort
vanaf meerdere locaties op Internet deze DNS-requests (zie
https://letsencrypt.org/2020/02/19/multi-perspective-validation.html). Een vergelijkbaar mechanisme bestaat er bij mijn weten niet voor stap 3 (om stap 7 te bemoeilijken).
D) Na het verkrijgen van het certificaat kan
de hele wereld op de fake example.com uitkomen -
totdat de routering is hersteld. Daarna hebben eventuele aanvallers nog steeds een geldig certificaat + private key voor example.com in hun bezit, dat ze als MitM in elk geval "lokaal" kunnen inzetten (maar wellicht ook gericht, buiten hun "jurisdictie"). Bijvoorbeeld voor het onderscheppen van verkeer tussen hun
eigen klanten en de echte example.com - de droom van elke dictatoriale regering. "Toevallig" is RosTelecom een overheidsbedrijf...
Ik weet niet helemaal zeker of het allemaal klopt en voldoende volledig is (in elk geval is het lang ;-) wat ik schrijf. Als je denkt van niet, leer ik graag waarom en wat ik fout heb aan de hand van steekhoudende reacties (aan onderbuikgevoelens en niet onderbouwde aannames heeft niemand iets).