man-in-the-middle 攻撃の実装 (CNG の例)

CNG (Cryptography Next Generation) のセキュリティで保護された通信の例では、第三者 (Mallory) が 2 つの通信エンド ポイン間 (Alice および Bob) に自身を侵入させる man-in-the-middle 攻撃を示します。

CNG 例では、名前付きパイプを使用してプロセス間通信を行います。Alice は常に名前付きパイプ サーバーとして動作し、Bob は常に名前付きパイプ クライアントとして動作します。Mallory は、Alice に対してはクライアント ロールを (Bob に偽装)、Bob に対してはサーバー ロールを (Alice に偽装) 装います。これを置換といい、典型的な man-in-the-middle 攻撃です。

このシナリオの詳細については、「キーとメッセージの交換手順 (CNG の例)」を参照してください。

CNG 例では、"偽装" という言葉を用いて、Bob が Mallory に、または Alice が Mallory に置換されたことを表します。ただし、偽装には、NamedPipeServerStream.RunAsClient(PipeStreamImpersonationWorker) メソッドのドキュメントで説明するように、名前付きパイプに関連する固有の意味もあります。

デジタル署名

デジタル署名は、man-in-the-middle 攻撃を防ぐために頻繁に使用されます。通常、署名キーは、公開キー基盤 (PKI) によって提供および保持されます。PKI は、コンピューターに対してローカルに使用されることはほとんどありません。通常は、セキュリティ団体、管理団体、または証明機関によってサポートされます。このようなインフラストラクチャの使用については、この例の対象外です。代わりに、例では、CNG クラスを使用してローカル デジタル署名キーを作成する方法を示します。

挿入ポイント

man-in-the-middle 攻撃では、シグナル チェーンに挿入ポイントが必要になります。これは、メッセージを処理する物理的なハードウェア装置に障害が発生したときに現れることがあります。たとえば、配線の切り替え時や再接続時、通信サーバーが侵害を受けるときや、電気的に再構築されるときなどが考えられます。しかし、より可能性が高い手法では、ネットワークを管理するソフトウェアの再構築時が利用されます。たとえば、ポートの再割り当てや再接続時、ソフトウェアの挿入ポイントが通信アプリケーション上に確立されるときなどが考えられます。

小さい抜け穴

ファイルが書き込みモードで開かれると、他のアプリケーションでの使用に対してロックされます。同様に、パイプ クライアントがパイプ サーバーに接続すると、クライアントが排他的に使用するためにパイプはロックされた状態になり、クライアントが接続を解除するまでロックの状態が続きます。

確立されたクライアント/サーバー チャネルに侵入するのは非常に難しいことです。ただし、CNG 例では、Mallory は、Alice と Bob 間のメッセージを簡単に傍受し変更できます。実際には、Mallory は確立されたパイプ チャネルに侵入していません。代わりに、Mallory は、会社の通信プロトコルで見落とされていた小さい抜け穴を利用しています。

Alice および Bob は、プライベート チャネルの名前を共有するのに PublicChannel パイプを使用し、その後に営業情報の送信用にプライベート チャネルを使用するように指示されていました。これらの指示があったため、Mallory はプライベート チャネルの名前を取得し、Alice と Bob の間に自身を侵入させます。次の 2 つのセクションで方法について説明します。

[タイミング]

多くの場合、man-in-the-middle 攻撃が成功するためには、タイミングなど、微妙な事柄に依存します。CNG 例ではこの概念を示します。

Mallory は、会社が開発した新しいインスタント メッセージング (IM) ソフトウェアが名前付きパイプに依存していることを知っていました。Alice と Bob が PublicChannel というパイプを開くこともわかっています。また、Alice は 2 番目のパイプ名を Bob に送信することも把握しています。Alice と Bob は PublicChannel パイプを閉じてから、営業情報の交換に 2 番目のパイプを開いて使用します。

営業情報を持ち出すには、Mallory は Alice からの 2 番目のパイプの名前を入手し、Bob がそれを受け取るのを阻止する必要があります。これを実行するには、Bob より前に PublicChannel パイプのクライアント エンドを開くだけです。

ソース コードには、この傍受を実行するために、Bob の Run メソッドの System.Threading.Thread.Sleep(200) ステートメントで 200 ミリ秒の待機を使用しています。この例では man-in-the-middle 攻撃を具体的に示すのが目的であるため、wait ステートメントは意図的に非常にわかりやすいステートメントになっています。実際には、セキュリティ シナリオを分析するのは、きわめて複雑です。これには、ソフトウェア アプリケーション、送信プロトコル、ネットワーク認証、ユーザー アカウント、ログ、アクセス許可、ユーザー トレーニング、トラフィック監視、その他の分析手法などが組み合わされています。

これらの高度な方法にもかかわらず、ネットワーク サーバー上の単に 200 ミリ秒の伝達の遅延が簡単に数か月も見過ごされることもあります。最終的に傍受ができなくなるまで CNG 例のバージョンが 5 つに分かれて作成された理由はこのためです。

Substitution

2 番目のパイプの名前 (AliceAndBobChannel) を傍受することで、Mallory は Alice と Bob の通信を傍受し、相互に送信されるメッセージを変更できます。これがこの置換の実行方法です。

  1. Alice は、サーバー モードで PublicChannel パイプを開き、Bob が接続するのを待機します。

  2. Mallory はクライアント モードで PublicChannel パイプに接続し、Alice からの 2 番目のパイプの名前 (AliceAndBobChannel) を受信します。

  3. Alice と Mallory は、PublicChannel パイプを閉じます。

  4. Alice はサーバー モードで AliceAndBobChannel パイプを開き、Mallory はクライアント モードでそれに接続します。

  5. Mallory は PublicChannel パイプを介しサーバーとして Bob に接続し、Bob はクライアントとして接続します。

  6. Mallory は Bob にパイプ名 AliceAndBobChannel1 (Mallory が名前をわずかに変更しています) を送信します。Bob は、この情報を Alice から受信しているものと信用しています。

  7. Mallory および Bob は、PublicChannel パイプの接続を解除します。

  8. Mallory はサーバーとして AliceAndBobChannel1 パイプを開き、Bob はクライアントとしてそれに接続します。

Mallory はここで Alice と Bob の間に自身を侵入させることに成功しました。

Mallory は Alice にはクライアントとして (AliceAndBobChannel パイプを介して)、Bob にはサーバーとして (AliceAndBobChannel1 パイプを介して) 振舞い続けます。Mallory が期待していたとおり、メッセージを読み込み、変更し、再送信できるようになりました。Alice も Bob も自分たちのメッセージが傍受され、変更されていることには気付いていません。

多くの場合、man-in-the-middle 攻撃には巧妙さが必要です。発見を逃れるため、Mallory は目立たないように、営業情報をわずかしか変更しないようにします。顕著な変更はしていません。

まとめ

man-in-the-middle を発見するには、時間、根気、十分な注意が必要です。この例では、200 ミリ秒の 1 回の待機を問題としています。わずか 1 秒の 5 分の 1 でも営業部門全体が危険さらされることになります。

参照

概念

暗号サービス

.NET Framework の暗号モデル

暗号サービス

その他の技術情報

暗号タスク