$8 से कम cloud लागत में 512-bit DKIM key कैसे क्रैक की गई
(dmarcchecker.app)- शीर्ष 10 लाख वेबसाइटों की जांच में 1,024-bit से कम DKIM public keys 1,700 से अधिक मिलीं, और प्रयोग में यह जांचा गया कि redfin.com की 512-bit RSA DKIM key का वास्तव में दुरुपयोग हो सकता है या नहीं
- DKIM record के
ptag को decode कर RSA modulusnऔर public exponente=65537प्राप्त किए गए, फिर CADO-NFS से modulus का factorization किया गया - Hetzner के 8 dedicated vCPU, 32GB RAM server पर लगभग 86 घंटों में
nको दो prime numbersp,qमें विभाजित किया गया, और इसी आधार पर RSA private key दोबारा बनाई गई - दोबारा बनाई गई private key से
security@redfin.comsender mail पर signature करने पर Gmail·Outlook ने उसे reject किया, लेकिन Yahoo Mail, Mailfence, Tuta नेdkim=passलौटाया - redfin.com की
p=reject; pct=100DMARC policy में DKIM pass होने से DMARC pass हो गया, इसलिए mail providers को 1,024-bit से कम RSA DKIM signatures reject करने चाहिए
512-bit DKIM keys के बचे रहने की समस्या
- शीर्ष 10 लाख वेबसाइटों के SPF, DKIM, DMARC records की जांच में 1,024-bit से कम लंबाई वाली public DKIM keys 1,700 से अधिक मिलीं
- 1,024-bit से कम RSA keys असुरक्षित मानी जाती हैं, और DKIM में 2018 के RFC 8301 के बाद से इनके उपयोग को phase out करने की सिफारिश है
- प्रयोग का लक्ष्य
key1._domainkey.redfin.comमें मिली 512-bit RSA public key थी - उद्देश्य यह जांचना था कि क्या केवल public key से private key restore कर, असली domain sender की तरह email पर signature किया जा सकता है
- साथ ही यह भी verify किया गया कि Gmail, Outlook.com, Yahoo Mail जैसे बड़े email providers छोटी key से बने DKIM signature को pass करते हैं या नहीं
DKIM public key से RSA components निकालना
- DKIM record के
ptag में public key ASN.1 DER format में encode होने के बाद फिर Base64 में encode होकर रहती है - Python के
Crypto.PublicKey.RSA.import_keyसे public key पढ़कर RSA components निकाले गए- Modulus
n:10709580243955269690347257968368575486652256021267387585731784527165077094358215924099792804326677548390607229176966588251215467367272433485332943072098119 - Public exponent
e:65537
- Modulus
CADO-NFS से modulus का factorization
- RSA private key बनाने के लिए modulus
nको दो prime numberspऔरqके product में तोड़ना होता है - Factorization के लिए CADO-NFS का उपयोग किया गया
- CADO-NFS बड़े integers के factorization में इस्तेमाल होने वाले Number Field Sieve(NFS) algorithm का implementation है
- स्थानीय computer को कई दिनों तक व्यस्त रखने से बचने के लिए Hetzner cloud server किराए पर लिया गया
- Server specs 8 dedicated vCPU, AMD EPYC 7003 series, 32GB RAM थे
- OS Ubuntu था
- काम के लिए पर्याप्त memory सुनिश्चित करने हेतु 32GB swap जोड़ा गया
cado-nfs.pyमें modulusninput देकर factorization चलाया गया- पूरी job 8-vCPU server पर लगभग 86 घंटे चली, और
nनिम्न दो prime numbers में factorize हुआp = 97850895333751392558280999318309697780438485965134147739065017624372104720767q = 109447953515671602102748820944693252789237215829169932130613751100276125683257
- अधिक शक्तिशाली server या कई systems पर distributed execution इस्तेमाल करने से समय घटाया जा सकता है, और CADO-NFS distributed work को सरल बनाता है
RSA private key को दोबारा बनाना
p,q,eमिलने के बाद Python और PyCryptodome से RSA private key बनाई गई- गणना में निम्न values और प्रक्रिया इस्तेमाल हुई
n = p * qphi = (p-1) * (q-1)d = inverse(e, phi)RSA.construct((n, e, d, p, q))
- परिणाम PEM format की RSA private key था, जिसे OpenDKIM configuration में integrate कर test mail signing के लिए इस्तेमाल किया गया
Mail providers के हिसाब से DKIM verification results
- दोबारा बनाई गई private key को OpenDKIM में डालकर
security@redfin.comFROM address से कई email hosting services को test mails भेजे गए - अधिकांश providers ने 512-bit key को असुरक्षित मानकर DKIM signature reject किया, लेकिन तीन ने
dkim=passलौटाया - Provider-wise results इस प्रकार हैं
- Gmail: FAIL
- Outlook: FAIL
- Yahoo Mail: PASS
- Zoho: FAIL
- Fastmail: FAIL
- Proton Mail: FAIL
- Mailfence: PASS
- Tuta: PASS
- GMX: FAIL
- OnMail: FAIL
- redfin.com के पास
v=DMARC1;p=reject;pct=100;...स्वरूप का valid DMARC record है - redfin.com के लिए DKIM verification pass होने से DMARC verification भी pass हुआ, और BIMI requirements भी पूरी हुईं
लागत और operational कदम
- 30 साल पहले 512-bit RSA public key तोड़ना supercomputer-level task था, लेकिन आज cloud server पर US$8 से कम में संभव है
- यदि 16 cores या उससे अधिक वाला powerful home computer हो, तो यह और तेज़ और सस्ता भी किया जा सकता है
- 512-bit या 768-bit DKIM keys बनाए रखने का कोई कारण नहीं है, और email providers को 1,024-bit से कम RSA keys से बने DKIM signatures को automatically reject करना चाहिए
- Yahoo, Mailfence, Tuta को experiment results और recommendation भेजे गए
- Domain owners को DNS settings में पुराने DKIM records जांचने चाहिए
- DKIM record के
ptag में Base64 characters की संख्या गिनकर आसानी से जांचा जा सकता है - 1,024-bit RSA public key में Base64 आधार पर कम से कम 216 characters होते हैं
- DKIM record के
1 टिप्पणियां
Hacker News की राय
14 साल पहले भी 512-bit DKIM RSA key को तोड़ना संभव था: https://blog.jgc.org/2010/06/facebooks-dkim-rsa-key-should-b...
दलील यह थी कि छोटी key होने पर DKIM signature लंबे समय तक सबूत के तौर पर नहीं टिकता, इसलिए बाद में यह साबित करना मुश्किल हो जाता है कि कौन-सा email असली था, और इस तरह deniability बनी रह सकती है
बेशक इसका मतलब यह नहीं कि ज्यादातर कंपनियां छोटी keys इसी वजह से इस्तेमाल करती थीं; मतलब बस इतना है कि छोटी keys को पूरी तरह बुरा नहीं माना जाता था
DKIM deniability निजी तौर पर मेरे लिए लंबे समय से दिलचस्प विषय रहा है [1]; ऐसी छोटी keys साफ तौर पर समाधान नहीं हैं, लेकिन मैं इन्हें DKIM को लेकर उलझी सोच और हर email signing scheme के निहितार्थों को स्वीकार न करने वाले community माहौल का नतीजा मानता हूं
[1] https://blog.cryptographyengineering.com/2020/11/16/ok-googl...
https://www.wired.com/2012/10/dkim-vulnerability-widespread/
मोटे तौर पर 14 साल में यह समय कुछ हफ्तों से घटकर 8 घंटे रह गया
अगर मजे के लिए आजमाना हो, तो 4096-bit DKIM key बनाकर देखिए
online DKIM/SPF checkers DNS देखकर सब कुछ ठीक बताते हैं, लेकिन test mail fail हो जाता है
वे लगभग
STATUS: Fail,DKIM: Pass,SPF: Passजैसी शानदार explanation दिखाते हैंDKIM entry में 2048-bit से बड़ी key इस्तेमाल करना allowed और valid है, लेकिन verifier के लिए 2048-bit से बड़ी key को अनिवार्य रूप से handle करना जरूरी नहीं था
इसे खुद भुगतकर सीखने में मेरे कुछ बाल झड़ गए
दिलचस्प बात यह है कि sites कहती हैं कि तीनों entries सही और valid हैं, फिर भी mail को fail treat करती हैं
शायद इसलिए कि DNS record checking और email verification अलग-अलग software handle करते हैं
इसमें कहा गया है कि verifiers को 512-bit से 2048-bit तक की keys वाले signatures verify करने में सक्षम होना चाहिए, और वे बड़ी keys भी verify कर सकते हैं
मैंने एक साल पहले इसी विषय पर master's thesis लिखी थी; आजकल बड़े mail providers सभी 4096-bit support करते हैं और कुछ 16384-bit तक भी support करते हैं
मुझे हैरानी है कि सभी encryption में कुल मिलाकर key size काफी ज्यादा क्यों नहीं बढ़ाया जाता
समाधान न सही, समय खरीदने वाला कदम तो लग सकता है
computational performance तेजी से बढ़ रही है और quantum computers की बातें भी लगातार हो रही हैं, लेकिन लगता है सब चुप बैठे हैं
बेशक बड़ी keys की computation cost ज्यादा होती है, लेकिन हमारे पास भी compute resources बढ़े हैं, तो उन्हें सिर्फ attack के लिए नहीं, defense में भी इस्तेमाल करना चाहिए
client side पर TLS 1.2 की जगह TLS 1.3 force करने जैसा सरल काम भी बहुत कुछ तोड़ देता है, HN site भी शामिल है
ये numbers device technology level से नहीं, बल्कि thermodynamics द्वारा allow की गई अधिकतम सीमा से जुड़े हैं
निष्कर्षतः AES-256 या RSA-4096 को brute force से तोड़ना भौतिक रूप से असंभव है
1024-bit keys कई cryptosystems में 10 साल से ज्यादा समय से phase out हो रही हैं
एक पीछे रह गए अपवाद को छोड़ दें तो ऐसा ही है; और 2048-bit keys को खतरा सिर्फ quantum computers से है, जो RSA itself को ही खतरे में डालता है
progress linear नहीं होती, इसलिए 1024 कमजोर हुआ तो 2048 भी mechanically जल्द ढह जाएगा—ऐसी बात नहीं है; 1024 पर भी आज वास्तविक attack आसान नहीं है
DKIM उन exceptions में से एक है
DKIM side में Ed25519 के widely adopted होने का इंतजार है, फिर कई असुविधाएं दूर हो जाएंगी
आम तौर पर वह दर्द service operators के बजाय सीधे users पर आता है, और उम्मीद की जाती है कि users इतनी शिकायत करेंगे कि operators ध्यान दें
लेकिन users इस बात की भी काफी संभावना रखते हैं कि वे ऐसे competitor के पास चले जाएं जो security जैसी छोटी चीज को revenue रोकने न दे
असल में यह पूछने जैसा है, “हम वह काम क्यों नहीं कर रहे जो हम पहले से कर रहे हैं?”
CADO-NFS इस्तेमाल करें तो यह हैरानीजनक रूप से आसान है
कुछ हफ्ते पहले काम के सिलसिले में मैंने desktop computer से 512-bit RSA DKIM key factorize की थी और सिर्फ 28 घंटे लगे
खास तौर पर वह AMD Zen 5 9900X था
दुर्भाग्य से 1024-bit key अभी hobby-level effort से मुश्किल है, लेकिन 2010 में 768-bit key factorize करने वाले पैमाने का academic project हो तो संभव हो सकता है: https://eprint.iacr.org/2010/006.pdf
कल Bank of America से account setup की समस्या के बारे में एक email मिला
यह सही है कि मैंने नया account बनाया था, और email को यह बात, कंपनी का नाम वगैरह पता था
कोई link नहीं था, सिर्फ BofA business number पर call करने का निर्देश था, और BofA website पर number verify करने पर वही निकला, इसलिए मैंने call किया
लेकिन किसी ने नहीं बताया कि मुझे email क्यों मिला या account में क्या समस्या है, और agent को इस email भेजे जाने का record भी नहीं मिला
मुझे 100% यकीन है कि यह email Bank of America से आया था
इसमें phishing जैसा कुछ नहीं था, न link, न कोई malicious phone number
SPF, DKIM, DMARC सभी Google के ARC-Authentication-Results में pass थे, और DKIM key भी 2048-bit थी
जब मैंने Bank of America से जांच करने को कहा, तो उन्होंने कहा कि “यह phishing message रहा होगा” और phishing से सावधान रहने के तरीकों का link भेज दिया
शायद account creation के दौरान किसी system ने बहुत जल्दी consistency check चला दिया और email generate कर दिया — एक साधारण error होने की संभावना ज्यादा है
लेकिन चूंकि उन्होंने इसे “phishing” कहा, इसलिए मैंने पूरा material attach करके CTO को FedEx भेजा
बात दो में से एक है: या तो DKIM key leak हो गई है और उन्हें तुरंत public warning जारी करनी चाहिए, या अक्षम employees और IT systems ने मुझे चक्कर कटवाकर मेरा एक घंटा बर्बाद किया
किसी भी स्थिति में, मैं पूरी जांच और समाधान चाहता हूं
कुछ DNS providers बेहद खराब हैं और सिर्फ 1024-bit लंबाई वाली key तक ही set करने देते हैं
उदाहरण के लिए wordpress.com ऐसा है
संदर्भ के लिए, आखिरी crack किया गया RSA number RSA-250 था, यानी 829-bit, और 2020 में इसमें 2700 core-years लगे थे [1]
जबकि RSA-155, यानी 512-bit, 1999 में ही factorize हो चुका था
यह खतरनाक स्थिति नहीं है
[1]: https://sympa.inria.fr/sympa/arc/cado-nfs/2020-02/msg00001.h...
वजह यह है कि यह पर्याप्त security level नहीं देता
यह NSA को रोकने के स्तर का नहीं है, लेकिन यह देखते हुए कि DKIM कई protection layers में से एक है, spammers को रोकने के लिए पर्याप्त लगता है
मुझे जिज्ञासा है कि क्या TXT record size की कोई limit है, या फिर वे DKIM जैसा दिखने वाला TXT record parse करने की कोशिश करके fail होते हैं और उसे add करने से मना कर देते हैं
अच्छे demonstration के लिए 512-bit key crack करना, भले ही पहले किया जा चुका हो, बहुत valuable security research है
“यह उन जगहों की list है जो अभी भी 512-bit इस्तेमाल कर रही हैं, इसलिए इन्हें migrate करना चाहिए” यह publicly कहना भी जायज है
लेकिन production में चल रही real-world key को सीधे crack करना मुझे निजी तौर पर ethical line पार करने जैसा लगता है, इसलिए असहज करता है
मैं lawyer नहीं हूं, लेकिन यह crime भी हो सकता है, और थोड़ा unnecessary लगता है
original में
now no longer availableखोजेंआम तौर पर जब किसी online system के vulnerable होने को दिखाया जाता है, तो good faith में vulnerability reproduce की जाती है, research document की जाती है और review का अनुरोध किया जाता है
चाहे cryptosystem crack करना हो, locked game console पर arbitrary code execution पाना हो, voting machine data manipulate किया जा सकता है यह prove करना हो, या Google Meet Q&A comments edit किए जा सकते हैं यह दिखाना हो — process वही है
सिर्फ यह कहना कि system vulnerable है, ignore किया जा सकता है, लेकिन vulnerable है यह कहना और prove करना ignore करना मुश्किल बना देता है
और अगर इसके साथ industry-standard disclosure deadline रखकर करीब 60 दिनों तक contact की कोशिश के बाद vulnerability public करने की बात कही जाए, तो ignore करने की गुंजाइश लगभग खत्म हो जाती है
वह बस math है
उस math पर निर्भर करके fraud करना या किसी jurisdiction के कानून का उल्लंघन करने वाले emails भेजना illegal है
मूल बात math नहीं, बल्कि action और intent है
यह बताना कि कोई बेवकूफी कर रहा है, भी illegal नहीं है, लेकिन वे आपकी जिंदगी मुश्किल बनाने की कोशिश कर सकते हैं
जैसे “bug exploitable है यह दिखाना ठीक है, लेकिन proof-of-concept code लिखना line cross करना है”
समस्या यह है कि जब तक आप यह नहीं दिखाते कि यह वास्तव में संभव है, ज्यादातर लोग security research की बात नहीं सुनते
इसके बजाय DKIM RFC ठीक से follow न करने वाले 10 बड़े email providers में से 3, यानी Yahoo, Tuta, Mailfence, को notify करने के बाद public किया गया
यही वजह थी कि मुझे Hover से DNS management बंद करना पड़ा
यह 255 characters से लंबे TXT records support नहीं करता, और मुझे ऐसा कोई example भी नहीं मिला जहां Hover पर split records काम करते हों
आखिर में Digital Ocean इस्तेमाल करना पड़ा
अगर यह समस्या फिर 10 साल चलने वाली है, तो अच्छा होगा कि elliptic curve cryptography standard बन जाए
“ज्यादातर providers ने 512-bit key को सही तरह unsafe पहचाना और DKIM signature reject किया, लेकिन तीन बड़े providers — Yahoo Mail, Mailfence, Tuta — ने dkim=pass report किया” वाले हिस्से में, मुझे जिज्ञासा है कि Google में सच में DKIM signature unsafe होने के कारण fail हुआ था या SPF failure की वजह से
dkim=policy (weak key)result के साथ fail हुआयह ठीक उसी requirement के अनुसार है कि “verifiers को 1024-bit से कम RSA key इस्तेमाल करने वाले signatures को valid signature नहीं मानना चाहिए”
512 बिट का नंबर बड़ा है या छोटा, यह इस पर निर्भर करता है कि वह symmetric cryptography है या asymmetric cryptography
asymmetric cryptography को हमेशा symmetric cryptography से 8 गुना कमजोर मान सकते हैं
DKIM asymmetric तरीका है, इसलिए 512-bit DKIM symmetric hash के हिसाब से 64-bit के बराबर है और यह बहुत पहले ही टूट चुका स्तर है
160-bit SHA-1 तक को भी टूटा हुआ माना जाता है
अगर DKIM को 512-bit SHA-3 जैसी strength चाहिए, तो कम से कम 4096-bit की जरूरत होगी, और तब भी इसमें SHA-3 की retransmission attack mitigation तकनीकें शामिल नहीं होंगी
यह email header में signature डालकर verify करने का standard है
दुर्भाग्य से DKIM सिर्फ
rsa-sha1औरrsa-sha256signatures ही support करता है: https://datatracker.ietf.org/doc/html/rfc6376/#section-3.3अच्छा होगा अगर DKIM को revise करके Ed25519 या उससे मिलते-जुलते signatures की अनुमति दी जाए
उदाहरण के लिए, 224-bit ECC लगभग 2048-bit RSA जैसा है
दोनों asymmetric तरीके हैं
इसके उलट, asymmetric elliptic-curve की strength symmetric cipher AES जैसी होती है
बेशक, यह quantum computers के सामने कमजोर है