Verouderde DKIM-sleutel blijkt eenvoudig te kraken
Gebruik een sleutellengte van 2.048 bits
Gebruik een sleutellengte van 2.048 bits
Een flink aantal van de meest bezochte webdomeinen blijkt een te korte DKIM-sleutel te gebruiken voor mail. Deze sleutel wordt door domeinnaamhouders/operators gepubliceerd in het DNS-systeem en door ontvangende mail-gateways gebruikt om de authenticiteit van verzonden berichten te controleren. Door uitgaande mailberichten met DKIM te ondertekenen zorgt de afzender dat geldige berichten makkelijk geaccepteerd worden en vervalste berichten met spam en malware worden afgewezen.
Een proof-of-concept-aanval liet zien dat zo'n zwakke DKIM-sleutel met een goedkope recht-toe-recht-aan cloud-server in minder dan 4 dagen te kraken was. Daarmee was het mogelijk om vervalste berichten vanaf het betreffende afzenderdomein met een geldige DKIM-handtekening te laten accepteren door mail-gateways met een verouderde of incomplete DKIM-check.
Deze DKIM-hack begon met een analyse van Tranco's top-1-miljoen lijst van meest bezochte webdomeinen. Softwareontwikkelaar Andreas Wulf onderzocht deze domeinnamen in eerste instantie op de toepassing van de mail-beveiligingsprotocollen SPF, DKIM en DMARC. Deze analyse leverde maar liefst 1.726 DKIM-sleutels op (van de 476.617 gevonden DKIM-records) waarvan de lengte korter was dan 1.024 bits. RFC 8301, gepubliceerd in 2018, schrijft echter voor dat RSA-gebaseerde DKIM-sleutels tegenwoordig minstens 1.024 bits (maar het liefst 2.048 bits) lang moeten zijn.
Figuur 1: Van de 476.617 gevonden DKIM-records bleken 1.726 RSA-gebaseerde sleutels een lengte van minder dan de voorgeschreven 1.024 bits te hebben. [Bron: Andreas Wulf]
In vervolg op deze uitkomst onderzocht Wulf hoe makkelijk het was om een van de gevonden DKIM-sleutels met een lengte van 512 bits daadwerkelijk te kraken. Daarvoor voerde hij een zogenaamde priem-factorisatie op de sleutel uit, dé manier om een RSA-sleutel te ontleden. En dat bleek verbazingwekkend eenvoudig: met behulp van een kant-en-klaar beschikbaar open-source softwarepakket lukte dit op een goedkope recht-toe-recht-aan cloudserver in minder dan 4 dagen.
De zo gevonden componenten van de DKIM-sleutel kunnen vervolgens gebruikt worden om de private DKIM-sleutel (die normaal gesproken geheim is en alleen in bezit van de domeinnaamhouder/operator) samen te stellen. En daarmee kan dan direct een geldige handtekening worden gezet onder willekeurig welk bericht.
Wulf heeft op deze manier ook daadwerkelijk vervalste mailberichten van een geldige DKIM-handtekening voorzien en deze vervolgens aangeboden aan verschillende grote mail-verwerkers. Hoewel de meeste van die dienstverleners deze berichten afwezen vanwege de te korte DKIM-sleutel, kenden sommige dienstverleners deze berichten weldegelijk een positieve DKIM-validatie toe.
Omdat het DMARC-protocol een geldige validatie oplevert als SPF of DKIM positief valideert, wordt op deze manier in het kielzog van de DKIM-beveiliging gelijk ook de DMARC-beveiliging omzeild.
Merk op dat er 2 dingen nodig zijn om deze DKIM-hack te misbruiken: Op het afzenderdomein (het signing domain) moet ten eerste een zwakke DKIM-sleutel aanwezig zijn. Ten tweede moet de mail-gateway aan ontvangende zijde positief valideren voor DKIM-sleutels met een lengte kleiner dan 1.024 bits. Deze zwakheden zullen in de meeste gevallen worden veroorzaakt door verouderde configuraties.
De oplossing voor domeinnaamhouders/operators is dan ook simpel: vervang je DKIM-sleutel door een nieuwe met een lengte van het liefst 2.048 bits (1.024 bits mag volgens RFC 8301 nog wel, maar wordt inmiddels afgeraden). Vergeet daarbij niet de nieuwe publieke sleutel ook als DKIM-record in de zone van het signing domain te publiceren (middels een mini-rollover).
Gebruik je Postfix met Amavis, dan gaat dit het makkelijkst met deze opdracht:
amavisd -c /etc/amavisd/amavisd.conf showkeys
Gebruik je Exim, dan vind je de DKIM-sleutels in de directory '/etc/exim/keys/'. De publieke sleutel verkrijg je middels deze opdracht:
openssl rsa -in dkim_rsa.private -out /dev/stdout -pubout -outform PEM
Beheerders van mail-gateways moeten hun configuratie controleren op de minimale sleutellengte die vereist is voor een geldige DKIM-validatie. RFC 8301 schrijft voor dat dit minstens 1.024 bits moet zijn.
Voor Postfix in combinatie met Amavis en OpenDKIM vind je deze instelling in het bestand '/etc/opendkim.conf':
## Specifies the minimum number of key bits for acceptable keys and signatures. MinimumKeyBits 1024
Voor Exim wordt de check op de minimum DKIM-sleutellengte van 1.024 bits afgedwongen middels de '$dkim_verify_min_keysizes'-variabele. De default lengte kun je aanpassen met behulp van de '$dkim_key_length'-variabele. Een compleet voorbeeld van die laatste configuratie vind je in de Exim-documentatie.
Er is inmiddels een eerste begin gemaakt met de ontwikkeling van DKIM-versie 2. Belangrijkste doelstellingen zijn om de problemen met forwarders en aliassen op te lossen, en replayaanvallen en backscatter te voorkomen. Daarvoor wordt een mechanisme ontwikkeld dat onderweg elke hop in het delivery path en eventueel doorgevoerde wijzigingen cryptografisch vastlegt, net als de volgende hop richting de eindbestemming. Voor de details verwijzen we je graag naar deze eerste drafts.