ハッシュ関数の隠れた危険性: 長さ拡張攻撃とサーバー側のセキュリティ リスク

導入

長さ拡張攻撃は、MD5、SHA-1、SHA-2 などの特定の種類のハッシュ関数のプロパティに関連する攻撃です。簡単に言えば、この攻撃は、H(メッセージ) とメッセージの長さがわかれば、メッセージ自体を知らなくても H(メッセージ || パディング || 拡張子) を簡単に計算できるという事実を利用します。このうち「||」は接続を意味し、ハッシュ関数の規定に従って「パディング」が付加されます。

これは、これらのハッシュ関数が入力をブロックにスライスするメルクル・ダムガード構造を使用し、各ブロックのハッシュが前のブロックのハッシュに依存するためです。これは、特定のメッセージのハッシュを計算したら、そこから開始してさらにブロックを追加できる状態になることを意味します。

サーバー側検証モード

脆弱性シナリオの説明を容易にするために、まず、このようなサーバー側認証モードがあると仮定します。つまり、ユーザーがログインしようとすると、サーバーはユーザーの ID、名前、およびパスワードに基づいて特定のハッシュを渡します。サーバーのみが知っている 30 ビットのキー。アルゴリズムによってハッシュ値が生成され、クライアントに送信されます。その後、クライアントがユーザー権限を変更するためのインターフェイスなど、特定のインターフェイスにアクセスしようとすると、サーバーはロール ID、ロール名、ロール権限、およびフロント インターフェイスの同じ 30 ビット キーに基づいて検証用のハッシュを再生成します。 POSTを終了します。アップロードされたハッシュがサーバーによって生成されたハッシュと一致する場合、検証は成功したとみなされ、新しいロールのアクセス許可がデータベースに書き込まれます。

理解を容易にするために、説明に従って記述されたいくつかの簡単なコードを例として示します。

権威を支持します

検証モードの脆弱性により、攻撃者は SecretKey を知らなくてもトランザクション リクエストを再構築することで権限検証をバイパスする可能性があります。不正な攻撃の中心的な考え方は、長さ拡張攻撃の特性を悪用することです。攻撃者はまず元のハッシュ値を取得し、単純な反復アルゴリズムを通じて元のデータの長さを計算する必要があります。この情報が取得されると、元のデータに不正なパラメータが追加され、同じハッシュ アルゴリズムを使用して悪意のあるハッシュが生成される可能性があります。

長さ延長攻撃の原則

長さ拡張攻撃は、一部のハッシュ関数の内部メカニズムが原因で発生します。これらの関数は、入力データを最初に固定長のチャンクに分割し、次に特定の要件を満たすために各チャンクの末尾をパディングすることによって処理します。この設計により、攻撃者は元のメッセージのハッシュと長さを知っていれば、新しいデータをパディングおよび追加することで、新しい有効なハッシュを構築できます。

たとえば、512 ビット ブロックで動作する SHA-256 を考えてみましょう。長さが 512 ビットの倍数でないデータの場合は、パディングが必要です。その充填ルールは次のとおりです。

  1. データの最後に「1」ビットを追加します。

  2. 512 を法とするデータの長さが 448 になるように、特定の数の「0」ビットを追加します (詳細については、「 [1] );

  3. 元のデータの長さを示す 64 ビット長のブロックを最後に追加します。

つまり、「1」の後に m 個の「0」が続き、さらに 64 ビットまたは 128 ビットの整数がメッセージの末尾に追加されて、長さ 512*n のパディング メッセージが生成されます。追加される整数は、元のメッセージの長さです。次に、パディング メッセージはハッシュ関数によって n 個の 512 ビット ブロックに処理されます。

施工方法

この例では、特定のシナリオとして上の図で説明したコードを使用します。データ文字列は data="user_id=1&user_name=aa"、キーは SecretKey="Length_extension\ _攻撃\ _秘密"。サーバーは、アップロードされたデータのデータ フィールドを解析し、区切り文字 & を介して必須パラメータ user_id と user_name を解析します。役割フィールドが存在する場合、サーバーはこのフィールドの値も取得します。次に、サーバーはすべてのフィールドを SecretKey でハッシュし、アップロードされた検証ハッシュと比較します。ハッシュ値が一致する場合、パラメータはルールに準拠しているとみなされ、直接使用されます。

まず、loginHandler インターフェースにログインし、データと SecretKey に基づいて SHA-256 を使用して生成されたハッシュ値 hash="37d310d3465506486431fb2c2eb163f0f470479703f66dc9e5fdead8a3390c68" を取得します。

次にクラックの難易度を見ていきます。テスト状況を例に挙げると、長さ拡張攻撃の原理に従って、H(メッセージ) とメッセージの長さがわかっていれば、長さ拡張攻撃を通じて新しいデータを追加できます。元のメッセージ = SecretKey + データ、現在は H(message) を持っています。新しいハッシュ値を構築するために必要なのはメッセージの長さだけです。 SecretKey は 30 ビットのキーであるため、実際のメッセージの長さはわずか 30 回の反復でわかります。したがって、新しいハッシュ値を簡単に構築できます。管理者権限を使用する必要があるため、悪意のあるフィールド「&role=admin」を元のデータに結合する必要があります。

長さ拡張攻撃の機能を使用すると、SecretKey を知らなくても新しいデータを追加し、新しいハッシュ値を生成できます。ここでは、この関数がすでに実装されているライブラリを使用します。 [2] テストを完了するために。次に、ツールを使用して新しいハッシュ値を生成します。

adminActionHandler のインターフェース検証では、アップロードされた user_id、user_name、role に基づいてハッシュを検証するため、今回アップロードしたデータは user_id=1, user_name=aa\x80\x00\x00\x00 になります。次の図に示すように、\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x70 と role=admin を指定します。

ハッシュ値は 84ae4ae437eeabf3bd8a26294392770b86f64a81998194156ac003d58a21acd0 です。その後、adminActionHandler インターフェイスを呼び出すことができます。データを受信した後、サーバーはアップロードされたハッシュを sha256 (SecretKey + fakeData) と比較し、検証に合格した後、いくつかの機密操作が実行されます。このようにして、長さ拡張攻撃を利用してサーバー側の検証を回避することに成功し、不正操作を実現しました。

その他の考えられる攻撃シナリオ

1. ファイルの整合性検証: キーとファイルの内容を連結してハッシュすることによってファイルの整合性が検証される場合、攻撃者はファイルを展開して有効なハッシュを生成し、それによって整合性チェックをバイパスする可能性があります。 ;

2. Web アプリケーションのセキュリティ: Web アプリケーションでは、ユーザーが送信したデータを検証するために長さ拡張攻撃の影響を受けやすいハッシュ関数が使用されている場合、攻撃者はこれを利用して悪意のあるデータを送信する可能性があります。

3. デジタル署名: 一部のデジタル署名スキームでは、秘密キーとメッセージを連結してハッシュすることによって署名が生成される場合、攻撃者はメッセージを拡張して有効な署名を生成する可能性があります。

**4. パスワードの保存: **一般的ではありませんが、キー (ソルトなど) とパスワードを連結してハッシュすることによってパスワードが保存されている場合、攻撃者は長さ拡張攻撃パスワードを使用して解読を試みる可能性があります。

予防方法

1. SHA-3 などの長さ拡張攻撃に対して脆弱でないハッシュ関数を選択します

**2. HMAC を使用する: **HMAC は入力としてキーとメッセージを必要とします。出力結果はキーとメッセージの両方に依存するため、攻撃者はキーを知らなければ長さ拡張攻撃を実行できません。

**3. 権限検証の強化: **多要素認証の使用など、サーバー側に追加の権限検証手順を追加します。

一般的に使用されるいくつかのハッシュ アルゴリズムの特徴を次に示します。

| アルゴリズム | 衝突耐性 | 選択されたプレフィックス衝突攻撃 | プリイメージ耐性 | 長さ拡張攻撃 | | --- | --- | --- | --- | --- | | MD5 | 2^18 | 2^39 | 2^123.4 | 脆弱性| | SHA-1 | 2^61.2 | 2^63.4 | 2^160 | 脆弱性 | | SHA-256 (SHA-2) | 2^65.5 | - | 2^254.9 | 脆弱性| | SHA-512 (SHA-2) | 2^32.5 | - | 2^511.5 | 脆弱性| | SHA-3 | 2^50 | - | 不明 | 脆弱性なし | | BLAKE2s | 2^112 | - | 2^241 | 脆弱性なし| | BLAKE2b | 2^224 | - | 2^481 | 脆弱性なし |

#### 結論

長さ拡張攻撃に対する効果的な防御策は、SHA-3 や BLAKE2 など、そのような攻撃に影響されないハッシュ関数を使用することです。さらに、HMAC (キー付きハッシュ メッセージ認証コード) 構造を通じて保護することもできます。これらの対策により、システムのセキュリティが効果的に向上し、データの整合性とアプリケーションの安定性が確保されます。

参考リンク:

[1]

[2]

原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • コメント
  • 共有
コメント
0/400
コメントなし
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)