Dalam penelitian kami pada catatan SPF, DKIM, dan DMARC dari 1 juta situs web teratas, kami terkejut menemukan lebih dari 1.700 kunci publik DKIM yang panjangnya kurang dari 1.024 bit. Temuan ini tidak terduga, karena kunci RSA yang lebih pendek dari 1.024 bit dianggap tidak aman, dan penggunaannya di DKIM sudah tidak digunakan lagi sejak diperkenalkannya RFC 8301 pada tahun 2018.
Didorong oleh rasa ingin tahu, kami memutuskan untuk mencari tahu apakah kami dapat memecahkan salah satu kunci ini. Tujuan kami adalah mengekstrak kunci pribadi dari kunci RSA publik, sehingga memungkinkan kami menandatangani email seolah-olah kami adalah pengirim aslinya. Kami juga ingin tahu apakah email yang ditandatangani dengan kunci yang disusupi ini akan lolos pemeriksaan verifikasi DKIM dari penyedia email besar seperti Gmail, Outlook.com, dan Yahoo Mail, atau apakah mereka akan langsung menolak memverifikasi tanda tangan yang dibuat dengan kunci pendek tersebut. .
Untuk percobaan kami, kami memilih redfin.com setelah menemukan kunci publik RSA 512-bit di kunci1._domainkey.redfin.com (sekarang tidak tersedia lagi):
$ dig +short TXT key1._domainkey.redfin.com "k=rsa; p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMx7VnoRmk/wFPeFWxrVUde6AJQI51/uPFL2CbiHGMnRSnLjPs72AgxAVHIe5QrNQ2riR5+7u47Sgh5R5va/d0cCAwEAAQ=="
Mendekode Kunci Publik RSA
Kunci publik, terletak di catatan DKIM p
tag, dikodekan dalam Format DER ASN.1dan selanjutnya dikodekan sebagai Base64. Untuk memecahkan kode kunci untuk mendapatkan modulus (N) dan eksponen publik (e), kami menggunakan beberapa baris kode Python:
$ python3 >>> from Crypto.PublicKey import RSA >>> RSA.import_key('-----BEGIN PUBLIC KEY-----n' + 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMx7VnoRmk/wFPeFWxrVUde6AJQI51/uPFL2CbiHGMnRSnLjPs72AgxAVHIe5QrNQ2riR5+7u47Sgh5R5va/d0cCAwEAAQ==' + 'n-----END PUBLIC KEY-----') RsaKey(n=10709580243955269690347257968368575486652256021267387585731784527165077094358215924099792804326677548390607229176966588251215467367272433485332943072098119, e=65537)
Memfaktorkan Modulus RSA
Dengan modulus N di tangan, langkah kita selanjutnya adalah mengidentifikasi dua bilangan prima, P Dan Qyang produknya setara N. Proses ini, yang dikenal sebagai anjak piutang, bisa jadi cukup menantang untuk dilakukan secara efisien. Untungnya, kami menemukan alat sumber terbuka canggih yang disebut CADO-NFSyang menawarkan implementasi algoritma Number Field Sieve (NFS) yang mudah digunakan — metode paling efisien yang tersedia untuk memfaktorkan bilangan bulat besar.
Karena pemfaktoran memerlukan banyak daya komputasi dan kami tidak ingin membebani komputer selama berhari-hari, kami memilih menyewa server cloud. Kami memilih server dengan 8 vCPU khusus (seri AMD EPYC 7003) dan RAM 32 GB dari Hetzner, menginstal Ubuntu sebagai OS. Menyiapkan CADO-NFS sangatlah mudah:
git clone cd cado-nfs make
Untuk memastikan server memiliki cukup memori untuk tugas tersebut, kami menambahkan ruang swap sebesar 32 GB:
sudo fallocate -l 32G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
Kami memulai faktorisasi dengan memanggil cado-nfs.py
naskah dengan N sebagai masukan:
./cado-nfs.py 10709580243955269690347257968368575486652256021267387585731784527165077094358215924099792804326677548390607229176966588251215467367272433485332943072098119
Prosesnya memakan waktu sekitar 86 jam di server 8-vCPU kami, berhasil melakukan faktorisasi N ke dalam P Dan Q:
Info:Complete Factorization / Discrete logarithm: Total cpu/elapsed time for entire Complete Factorization 2.20529e+06/309865 (3d 14:04:25) 97850895333751392558280999318309697780438485965134147739065017624372104720767 109447953515671602102748820944693252789237215829169932130613751100276125683257
Meskipun memilih server yang lebih kuat atau mendistribusikan beban kerja ke beberapa sistem (sebuah proses yang disederhanakan oleh CADO-NFS) dapat mempercepat tugas, kami tidak terdesak waktu dan tidak keberatan menunggu.
Membangun Kunci Pribadi RSA
Setelah menentukan P Dan Qkami memiliki semua komponen yang diperlukan untuk membuat kunci pribadi RSA. Prosesnya melibatkan penggunaan Python dan perpustakaan PyCryptodome:
$ python3 >>> from Crypto.PublicKey import RSA >>> from Crypto.Util.number import inverse >>> p = 97850895333751392558280999318309697780438485965134147739065017624372104720767 >>> q = 109447953515671602102748820944693252789237215829169932130613751100276125683257 >>> e = 65537 >>> n = p * q >>> phi = (p-1) * (q-1) >>> d = inverse(e, phi) >>> key = RSA.construct((n, e, d, p, q)) >>> private_key = key.export_key() >>> print(private_key.decode())
Baris Python ini menampilkan kunci pribadi dalam format PEM, siap digunakan:
-----BEGIN RSA PRIVATE KEY----- MIIBOgIBAAJBAMx7VnoRmk/wFPeFWxrVUde6AJQI51/uPFL2CbiHGMnRSnLjPs72 AgxAVHIe5QrNQ2riR5+7u47Sgh5R5va/d0cCAwEAAQJAPliEv2dKk4DyA54nbwEH mSzfLEOiuD8dKXZW9GpMhou72DYYcc5YD0PeQW0uGGsusnTZXRU3Kd3cmVfeR+np 4QIhANhVpOQ440Gqlda3nqCOAag12jq8ET+qr1G7VL8x9PF/AiEA8flYr5rUO6Io /5HRoHq6p7dA75PRK+7v79o0/ijfTjkCIEdWPpCPfckKomxykllpWnyIfZT+rUVs WHHAL1r480erAiAz3xD87ALtGbESQE8gyM50n5sjAJwJf/odf7h2d4qPOQIhAKwr Nv6s5cQiwbYgm1KND83nrkxe6uFQlu9ilkdwAIY4 -----END RSA PRIVATE KEY-----
Mengirim Surat Uji Bertanda Tangan DKIM Dari @redfin.com
Dengan kunci pribadi RSA yang terintegrasi ke dalam pengaturan OpenDKIM, kami melanjutkan ke tahap pengujian. Kami membuat email sederhana dengan alamat DARI [email protected], lalu mengirimkannya ke berbagai layanan hosting email. Meskipun sebagian besar penyedia dengan benar mengidentifikasi kunci 512-bit sebagai tidak aman dan menolak tanda tangan DKIM kami, tiga penyedia utama — Yahoo Mail, Mailfence, dan Tuta — melaporkan a dkim=pass
hasil.
Berikut tanggapan masing-masing penyedia:
- Gmail: GAGAL
- Pandangan: GAGAL
- Yahoo surat: LULUS
- Zoho: GAGAL
- surat cepat: GAGAL
- surat proton: GAGAL
- Surat: LULUS
- Total: LULUS
- GMX: GAGAL
- Di Mail: GAGAL
Mengingat redfin.com juga memiliki catatan DMARC yang valid (v=DMARC1;p=reject;pct=100;rua=mailto:[email protected];ruf=mailto:[email protected];ri=3600;fo=1;
), lolos pemeriksaan DKIM redfin.com
juga berarti email kami lolos verifikasi DMARC dan memenuhi persyaratan BIMI.
Pikiran Terakhir
Tiga dekade yang lalu, memecahkan kunci publik RSA 512-bit adalah suatu prestasi yang hanya dapat dicapai dengan superkomputer. Saat ini, hal tersebut dapat dilakukan hanya dalam beberapa jam dengan biaya kurang dari US$8 di server cloud. Dan jika Anda memiliki komputer canggih di rumah dengan 16 inti atau lebih, Anda dapat melakukannya dengan lebih cepat dan hemat biaya.
Tidak ada alasan bagus untuk menggunakan kunci 512 atau 768-bit saat ini. Penyedia email harus secara otomatis menolak tanda tangan DKIM apa pun yang dibuat dengan kunci RSA yang lebih pendek dari 1.024 bit. Kami telah memberi tahu Yahoo, Mailfence, dan Tuta tentang temuan kami dan membagikan saran ini kepada mereka.
Pemilik domain juga harus mengambil tindakan dengan meninjau setelan DNS mereka untuk setiap data DKIM usang yang tidak mematuhi standar minimum 1.024-bit. Cara sederhana untuk memeriksa catatan DKIM p
tagnya adalah menghitung karakter Base64: kunci publik RSA 1.024-bit akan memiliki setidaknya 216 karakter.