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.

Sumber

Krystian Wiśniewski
Krystian Wiśniewski is a dedicated Sports Reporter and Editor with a degree in Sports Journalism from He graduated with a degree in Journalism from the University of Warsaw. Bringing over 14 years of international reporting experience, Krystian has covered major sports events across Europe, Asia, and the United States of America. Known for his dynamic storytelling and in-depth analysis, he is passionate about capturing the excitement of sports for global audiences and currently leads sports coverage and editorial projects at Agen BRILink dan BRI.