Wáárom WebAuthn
Afgelopen maart trapte Troy Hunt in een phishing-mail en logde (met 2FA/MFA) in op een nepwebsite. Uit
https://www.troyhunt.com/a-sneaky-phish-just-grabbed-my-mailchimp-mailing-list/:
I went to the link which is on mailchimp—sso.com and entered my credentials which - crucially - did not auto-complete from 1Password. I then entered the OTP and the page hung.
Wat hier fout ging is dat Troy Hunt (een vaak aangehaalde tegenstander van EV-certificaten):
• Dacht dat de websitenaam
mailchimp—sso.com óók van de eigenaren van
mailchimp.com was, en
• De melding van zijn wachtwoordmanager, dat deze geen record had voor
mailchimp—sso.com negeerde en handmatig het record voor
mailchimp.com opzocht, en
• Hijzelf fatsoenlijke certificaten heeft helpen slopen waardoor hij
dáár niet uit kon halen dat
mailchimp—sso.com niet van dezelfde eigenaren als van
mailchimp.com was.
Uitleg met "swim lane" diagram
De nepwebsite
https://mailchimp—sso.com is een AitM (Attacker in the Middle), ook bekend als een proxy (plaatsvervanger of stand-in). De nepsite werkt als een kabel en geeft alles (beide kanten op) dóór - totdat de AitM heeft bereikt wat hij/zij wilde bereiken.
Hieronder is te zien hoe Troy Hunt zijn inloggegevens (hier fictief) onbedoeld invult op
https://mailchimp—sso.com, in plaats van op
https://mailchimp.com, namelijk:
User-ID:
troy@serv.tldWachtwoord:
3*f7G!sQ'z#2FA/MFA Authenticator code:
620753Te zien is dat de nepsite de inloggegevens meteen doorstuurt naar de echte site. Omdat die gegevens kloppen verklaart de echte site de aanmelder voor ingelogd, en stuurt een session cookie terug (via de https verbinding van
mailchimp—sso.com naar
mailchimp.com). De nepsite lijkt nu, richting Troy Hunt, te "hangen". Ondertussen vraagt de AitM de hele klantendatabase op.
Troy AitM (nepsite) echte site
Hunt | mailchimp—sso.com | mailchimp.com
• • •
• troy@serv.tld —> • •
• 3*f7G!sQ'z# —> • •
• 620753 —> • •
• • •
• • troy@serv.tld —> •
• • 3*f7G!sQ'z# —> •
• • 620753 —> •
• • •
• • succes!
• • •
• • <— session cookie •
• • •
• • geef user data —> •
• • •
• • <— alle user data •
• • •
• dank u! •
• • •
WebAuthn (passkeys en FIDO2 hardware keys)
Als Troy Hunt een passkey zou hebben voor
mailchimp.com, en hij zou proberen om daarmee in te loggen op
mailchimp—sso.com, dan zoekt de browser in de passkey-database naar
mailchimp—sso.com - en vindt hoogstwaarschijnlijk niks, wat leidt tot een foutmelding.
In tegenstelling tot wat Troy Hunt deed (
handmatig zoeken naar
mailchimp.com in zijn 1Password wachtwoordmanager), staat een passkey-manager "handmatig zoeken" niet toe. Bovendien moet er bij WebAuthn sprake zijn van een
foutloze https-verbinding; vervolgens is de in de adresbalk getoonde domeinnaam waar de browser naar zoekt in de database van de passkey-manager (niet exact, zie hieronder).
Voor gevorderden: WebAuthn en subdomeinmamen
De check op de juiste domeinnaam is verdeeld in twee stappen. In
https://github.com/w3ctag/design-reviews/issues/97#issuecomment-175766580 is te zien wat het probleem kan zijn.
1) In de database van de passkey-manager wordt de
hoofddomeinnaam opgenomen (voor deze website zou dat
security.nl zijn, en als je bijv. op
myaccount.google.com een passkey zou aanmaken, zal
google.com in de database van de passkey manager worden opgenomen. Daarmee kun je dan ook inloggen op bijvoorbeeld
https://accounts.sandbox.google.com (okay), maar in principe
ook op
https://sites.google.com en op
https://firebase.google.com. Dat
laatste wil je beslist niet, want daar staat content van derden (pagina's aldaar zouden in principe als passkey-AitM's misbruikt kunnen worden).
2) Tijdens inloggen maakt de browser een "pakketje" met allerlei gegevens, waaronder de volledige domeinnaam van de website waarop m.b.v. WebAuthn wordt ingelogd. Dat pakketje wordt digitaal ondertekend met de private key behorend bij de passkey (of FIDO2 hardware key) die is gekoppeld aan de hoofddomeinmaam.
Nadat de browser dat pakketje naar de server heeft gestuurd, checkt die server, m.b.v. de public key, of de digitale handtekening onder het pakketje geldig is (dit bewijst dat de browser toegang had tot de WebAuthn private key voor dit account). Vervolgens is het
de taak van de server om te checken of inloggen op de specifieke subdomeinnaam is toegestaan.
Een niet te onderschatten risico is dat de uiteindelijke authenticatieserver hier niet zorgvuldig op checkt, en bijv. dat een niet meer gebruikte domeinnaam naar een IP-adres blijft verwijzen en de server daarachter in verkeerde handen valt (want dan is een WebAuthn-AitM een eitje).
WebAuthn: phishing-resistant
Als er
géén sprake is van:
• Het vorige punt (subdomeinnaam hijack);
• Een website met een gegeven websitenaam (domeinnaam) die
onterecht een geldig certificaat heeft verkregen (bijv. doordat een DNS-record door een kwaadwillende is gewijzigd of middels een BGP-hijack);
• De client niet is gecompromitteerd,
is
phishing (middels een AitM nepwebsite) bij het inloggen gebruikmakend van WebAuthn onmogelijk.
WebAuthn is dus
niet volledig phishing-
bestendig. Phishing-
resistant, waarbij dat laatste als "weerstand biedend" of "moeilijk makend" wordt gelezen ("resistent" is mij te absoluut) vind ik correct.
Aanvullende overwegingen
1) De allerbelangrijkste eigenschap van WebAuthn is dat, tijdens inloggen,
software in plaats van de PEBCAK checkt of de juiste website geopend is;
2) Als je de asymmetrische crypto wegdenkt, vormt een fatsoenlijk (random) gegenereerde en nooit hergebruikte public key een nagenoeg perfect wachtwoord;
3) WebAuthn prijzen om asymmetrische cryptografie is grotendeels snake oil. Hoewel het extreem lastig kan zijn om WebAuthn private keys te stelen, zijn er verschillende andere manieren om met WebAuthn beschermde accounts over te nemen (zoals een aanvaller die een WebAuthn public key van hem/haar
toevoegt aan jouw account op de server, of jouw public key
vervangt);
4) Ook het kraken van WebAuthn asymmetrische sleutelparen is een broodje aap. Immers, WebAuthn public keys
zijn helemaal niet public (niet zoals in certificaten en bij PGP). Zo'n public key wordt (éénmalig) overgedragen naar een server via een https-verbinding. Als een aanvaller toegang krijgt tot jouw public key op de server, is het
allesbehalve jouw grootste zorg dat zij/hij daaruit jouw private key af zal proberen te leiden (zie ook het vorige punt);
5) 2FA/MFA is meestal een hoax omdat een session cookie 1FA is;
6) 2FA/MFA is meestal een hoax omdat de uitgifte van DV-certificaten 1FA is;
7) Passkeys zijn dus hooguit 2FA/MFA
op jouw device(s). Maar onder iOS/iPadOS is zelfs dat, onder bepaalde omstandigheden, niet het geval (zie onder "iOS, iPadOS en Android passkeys zijn een PUINHOOP" in
https://security.nl/posting/905537 en daarvoor, onder "(1) iPhone/iPad zonder vingerafdruk", in
https://security.nl/posting/905377);
8) Je kunt zelf vaak geen backup maken van de volledige records (inclusief private keys) in passkey managers (laat staan van FIDO2 hardware keys);
9) Daardoor is het verlies van toegang tot jouw passkey private keys relatief groot, vergroot door onduidelijkheden zoals bij Android (zie "Android" in
https://security.nl/posting/905377);
10) Daardoor zijn alternatieve (rescue) inlogmethodes noodzakelijk
die zelden phishing-resistant zijn;
11) Risico vendor-lock-in;
12) Fratsen zoals "passkey sharing" van Apple verzwakken het concept.