OK dan :-)
A) hkp is een protocol waarbij de server niet wordt geauthenticeerd en de verbinding niet wordt versleuteld (laat staan dat de integriteit van de overgedragen gegevens automatisch wordt gecontroleerd). Hoewel keyservers met geauthenticeerde TLS verbindingen ook valse public keys kunnen bevatten,
vergroot een download via een "plain text" verbinding het aanvalsoppervlak en daarmee jouw risico's. Doordat hkp vergelijkbaar is met http (en hkps met https) ontbreekt een stukje zekerheid dat er gewoon had kunnen zijn, doordat je, via de eerder door mij genoemde aanvalstechnieken, ook een valse public key
vanaf een valse server (of on-the-fly gewijzigd door ee MITM) kunt downloaden.
In bijv.
https://security.stackexchange.com/questions/4161/shouldnt-gpg-key-fetching-use-a-secure-connection wordt beargumenteerd (de arrogantie spat er vanaf) dat de noodzaak voor authenticatie van
keyservers, en het vervolgens beschermen van de integriteit van de overdracht, flauwe kul zou zijn - omdat je keyservers sowieso niet moet vertrouwen. Echter, daar gaat de Ubuntu tutorial volledig aan voorbij (zie C) maar sowieo ben ik het niet eens met die stelling, omdat:
- Als een public key op een "echte keyserver" staat (en dus door keyservers onderling wordt gesynchroniseerd) is de kans groter dat nepsleutels op een gegeven moment worden ontdekt;
- Op basis van wat ik onder B uitleg, zouden er, van dezelfde geclaimde eigenaar, niet twee verschillende public keys met
dezelfde key-ID (in de crypto wereld een
collision genoemd) op mogen voorkomen;
- Het bij "TLS eronder" om een zeer gangbare maatregel gaat.
M.b.t dat derde punt: wellicht voegt TLS netto niet heel veel veiligheid toe, maar alle beetjes helpen. Bovendien zie ik nauwelijks een gevaar voor een vals gevoel van veiligheid (omdat https helemaal geen bijzonderheid meer is, en iedereen
zou moeten weten dat een https verbinding niet betekent dat wat op de site staat, altijd betrouwbaar is of klopt).
B) De in de Ubuntu tutorial vermelde key ID's zijn 4 bytes lang: 0xFBB75451 en 0xEFE21092. In een 4 bytes lang getal kun je maximaal 4.294.967.296 verschillende decimale getallen kwijt. Dat is minder dan de wereldbevolking groot is, en bovendien bestaat hiervoor geen systeem dat zoveel mogelijk uniciteit nastreeft. Er is dus, vroeger of later, gegarandeerd sprake van
collisions (verschillende public keys die tot dezelde key ID leiden). Sterker, er bestaan tools om deze collisions te genereren (zie evil32 verderop).
Bij een collision zijn er 2 situaties mogelijk (ik heb geen idee wat er precies gebeurt in zo'n situatie):
- Keyservers accepteren ook de tweede key ID (identiek aan de key ID van een eerder geüploade public key), waarna je maar moet afwachten welke public key je terug krijgt op basis van een key ID;
- Om misverstanden te voorkomen, accepteren keyservers de public key met de niet unieke key-ID niet (genereer maar nieuwe sleutelparen totdat je een unieke key ID vindt of zo).
Beide situaties zijn onwenselijk. Maar in de tweede situatie, als het een aanvaller lukt om een code signing keypair te genereren met een identieke key ID, en zij jou middels eerder door mij genoemde aanvallen naar
haar eigen keyserver stuurt, heb jij een foute key met correcte key ID in handen. In de eerste situatie zou het best Russisch roulette kunnen zijn welke key je krijgt, of wellicht altijd de als laatst geüploade. Beide scenario's zijn dus onwenselijk.
Volgens
https://lwn.net/Articles/689792/ was het Enrico Zini, notabene een Debian contributor, die de eerste PGP key ID collission "in the wild" zou hebben ontdekt. Zie
https://gwolf.org/node/4070 voor het hele verhaal en/of check
https://lwn.net/Articles/697417/. Uit
https://evil32.com/:
It takes 4 seconds to generate a colliding 32bit key id on a GPU
TLDR: vertrouw nooit alleen op
afkortingen van unieke identifiers (fingerprints, secure hashes) van public keys, want met bijv. 4 bytes lengte heb je in de praktijk gigantisch veel meer kans op collisions dan met bijv. SHA1 - een cryptografische hash van 20 bytes lang, die we, vooral vanwege mogelijke collisions, al niet meer gebruiken!
C) Maar los van het bovenstaande: het
grootste risico is dat op keyservers fake public keys (daarmee bedoel ik
echte public keys van een andere dan de geclaimde eigenaar) te vinden zijn, met hoogstwaarschijnlijk een andere 4 byte lange key ID (maar die leidt de gnupg software af uit wat in sha256sums.sig staat, die nou net van dezelfde aanvaller afkomstig kan zijn als waarvan jij daarna de public key gaat downloaden - omdat die - duh- nog ontbreekt in jouw sleutelbos).
En dit is geen fictie: in 2015 (ruim voor evil32) schreef de security redacteur van de Duitse c't (uitgeverij Heise), Jürgen Schmidt, dat aanvallers of grappenmakers een public key op zijn naam (@ heise.de) op keyservers hadden gepubliceerd (Duitstalig en helaas grotendeels achter een pay-wall:
https://www.heise.de/ct/ausgabe/2015-6-Gefaelschte-PGP-Keys-im-Umlauf-2549724.html; algemene kritiek op PGP, van dezelde auteur doch zonder pay wall:
https://www.heise.de/ct/ausgabe/2015-6-Editorial-Lasst-PGP-sterben-2551008.html). Probleem: hij ontvangt versleutelde mails die hij niet kan ontsleutelen en anderen kunnen namens hem mails en bestanden ondertekenen (waarbij non-repudiation AKA "it wasn't me proof" alleen mogelijk is bij ontvangers die de risico's kennen en begrijpen). Last but not least kan hij deze sleutels niet intrekken (want hij heeft de bijbehorende private key niet).
Met andere woorden, het is
essentieel dat je, op secundaire wijze, zorgvuldig controleert dat een public key daadwerkelijk van de geclaimde eigenaar is
voordat je deze toevoegt aan jouw keyring (om deze daarna te gebruiken om bijv. de authenticiteit van bestanden, zoals Ubuntu ISO's, te controleren). Doe je dat niet, dan hou je jezelf voor de gek als je meent dat deze weg veiliger is dan het downloaden van een secure hash plus het onderhavige bestand vanaf dezelfde server (zelfs als het daarbij om een https verbinding zou gaan). Immers, het is zaak om in elk geval de risico's 1 t/m 5 uit mijn bijdrage van 13:53 van 18-08-2018 af te dekken (https, mits een servercertificaat wordt gebruikt waarvan je voldoende zeker weet dat deze niet aan een andere organisatie dan Ubuntu is verstrekt, mitigeer je de risico's 1 t/m 3 uit mijn eerdergenoemde bijdrage).
Kortom, los van dat maar weinigen tutorials als
https://tutorials.ubuntu.com/tutorial/tutorial-how-to-verify-ubuntu#3 weten te vinden
en helemaal lezen:
- Het gebruik van hkp i.p.v. hkps wordt beschrevent;
- Er worden 4 byte lange key identifiers gebruikt waarvan jaren geleden is aangetoond dat die onveilig zijn;
- Last but not least vermeldt de tutorial niets over het wellicht allerbelangrijkste aspect van PGP et al, vooral m.b.t. digitale handtekeningen: dat je
zelf moet vaststellen (of anderen, die jij vertrouwt en waarvan jij de public keys hebt en hebt vastgesteld dat die van hen zijn, hebben vastgesteld) dat een public signing key, zoals van Ubuntu,
daadwerkelijk toebehoort aan de geclaimde identiteit.