深刻なセキュリティ: GnuTLS は OpenSSL に従い、タイミング攻撃のバグを修正

深刻なセキュリティ: GnuTLS は OpenSSL に従い、タイミング攻撃のバグを修正

ソースノード: 1956368

先週、私たちはたくさんのことについて書きました メモリ管理のバグ これは、人気のある OpenSSL 暗号化ライブラリの最新のセキュリティ アップデートで修正されました。

これらのメモリのバグに加えて、バグと呼ばれるバグについても報告しました。 CVE-2022-4304: RSA 復号化における Oracle のタイミング.

このバグでは、同じ暗号化されたメッセージをサーバーで何度も発射しますが、データの末尾のパディングを変更してデータを無効にし、ある種の予測不可能な動作を引き起こします…

…プロセスのデータ転送部分にかかる時間を確実に推測できるネットワーク上のターゲットに近いと仮定すると、一貫した時間はかかりません.

すべてのデータが均等に処理されるわけではありません

リクエストを開始し、応答にかかる時間を測定し、ネットワーク データの低レベルの送受信に費やされた時間を差し引くと、サーバーがリクエストを処理するために内部計算を行うのにかかった時間がわかります。 .

ネットワークでどれくらいの時間が費やされているかわからない場合でも、多くのリクエストを開始して大量のサンプルを収集することで、往復時間の変動を探すことができます。

ネットワークのオーバーヘッドがほぼ一定であると想定できるほどネットワークの信頼性が高い場合は、統計的手法を使用して、どの種類のデータ変更がどのような余分な処理遅延を引き起こすかを推測できる場合があります。

このことから、繰り返される各リクエスト内で秘密に保たれているはずの元の暗号化されていないデータの構造、またはコンテンツについて何かを推測することができます。

平文を XNUMX バイトしか抽出できなくても、それは起こりません。

いわゆる タイミング攻撃 何百万もの偽のパケットを送信し、XNUMX バイトの平文データだけを復元できるようにすべてのパケットの時間を計らなければならない場合でも、この種の処理は常に面倒です。

…ネットワークは、ほんの数年前よりも高速で予測可能であり、はるかに多くの負荷を処理できるためです。

何百万もの危険なパケットがスパムとして送信され、たとえば次の XNUMX 時間で、親指のように目立つと思うかもしれません。

しかし、「XNUMX 時間あたり XNUMX 万個のパケットが通常より多いか少ないか」は、もはや特に大きな変動ではありません。

GnuTLS の同様の「オラクル」バグ

さて、OpenSSL で最後に修正されたバグのタイミングのバグを報告した同じ人が、 GnuTLS の同様のバグ ほぼ同時に。

これにはバグ識別子があります CVE-2023-0361.

GnuTLS は OpenSSL ほど普及しておらず、広く使用されているわけではありませんが、IT 資産や自分のコンピューターでさえ、GnuTLS を使用したり組み込んだりするプログラムが多数あるでしょう。FFmpeg、GnuPG、Mplayer、QEMU などがあります。 、Rdesktop、Samba、Wget、および Wireshark です。

皮肉なことに、GnuTLS のタイミングの欠陥は、そもそもタイミング攻撃エラーをログに記録するはずだったコードに現れました。

コードの違いからわかるように (差分) 以下で、プログラマーは条件 (if ... then) 復号化エラーのチェックと処理に使用される操作では、タイミングの変動が生じる可能性があります。これは、CPU は通常、コードが「分岐」命令の後にどの方向に進むかによって、異なる時間がかかるためです。

(CPU は、パフォーマンスを向上させるために繰り返し実行されるコードを記憶またはキャッシュする傾向があり、頻繁に実行されないコードの実行速度が検出可能なほど遅くなる傾向があるため、一方の方向に進むことが多く、他方の方向にはめったに進まない分岐では特にそうです。)

3.7.8 に対する gnutls-3.7.9/lib/auth/rsa.c のコード差分

しかし、プログラマーは、攻撃が発生している可能性があることをログに記録したいと考えていました。 if (ok) 上記のテストは失敗し、に分岐します else { ... } のセクションから無料でダウンロードできます。

この時点で、コードは _gnutls_debug_log() その作業を行うにはかなりの時間がかかる可能性があります。

したがって、コーダーは意図的な呼び出しを挿入しました _gnutls_no_log() セクションに then { ... } コードの一部で、「攻撃」がない場合でもログに記録するふりをして、コードがどちらの方向にも費やす時間を均等にしようとします。 if (ok) 分岐命令は取ることができます。

しかし、どうやら XNUMX つのコード パスは、使い果たした時点では十分に似ていませんでした (または、おそらく _gnutls_debug_log() 機能だけでは、さまざまな種類のエラーを処理するのに十分な一貫性がありませんでした)、攻撃者は、XNUMX 万回ほど試行した後に、復号化の兆候を識別し始める可能性があります。

何をするか?

プログラマーの場合: ここでのバグ修正は単純で、「少ないほどよい」という原則に従いました。

上記のピンク色のコードは、いずれにせよ非常に有用な攻撃検出データを提供しないと見なされましたが、ビルド設定に関係なく、そこにないコードが誤ってコンパイルされる可能性がないという理由で、単純に削除されました…

…そして、コンパイルされていないコードは、偶然であれ設計であれ、決して実行できません。

GnuTLS ユーザーの場合: 最近リリースされたバージョン 3.7.9 そして「新商品フレーバー」 3.8.0 この修正と、他のさまざまな修正が含まれています。

Linux ディストリビューションを実行している場合は、お持ちの GnuTLS の中央管理された共有ライブラリ バージョンの更新と、独自のバージョンを提供するアプリを確認してください。

Linux では、次の名前のファイルを検索します。 libgnutls*.so 周りにある共有ライブラリを見つけて、 gnutls-cli ライブラリに含まれていることが多いコマンド ライン ユーティリティのコピーを見つけます。

あなたは走れる gnutls-cli -vv どのバージョンの libgnutls 動的にリンクされています:

 $ gnutls-cli -vv gnutls-cli 3.7.9 <-- 私の Linux ディストリビューションは先週の金曜日に更新されました (2023-02-10)

タイムスタンプ:

より多くの 裸のセキュリティ