web-dev-qa-db-ja.com

TCPはUDPより安全なのはなぜですか?

MS SDLプレゼンテーションを読んでいるとき、TCPはUDPより安全であるため、アプリケーションではUDPをTCPで置き換えることをお勧めします。ただし、どちらもトランスポート層のみです。 、 これ以上何もない。

では、なぜTCPがUDPより安全なのですか?

58
sluge

TCPを使用してアプリケーションにデータを送信するには、まず接続を確立する必要があります。接続が確立されるまで、パケットはOS層にのみ到達し、アプリケーションには到達しません。接続を確立するには、開始側に戻るパケットを受信する必要があります。自分のネットワーク上にないIPアドレスを偽造してTCP接続を確立したい場合は、反対側が送信したパケットを傍受できる必要があります。(エンドポイントの「間」、および偽造されたIPアドレスへのパケットが通常行く場所、または他の巧妙なルーティングトリックを実行します。)

UDPには接続がないため、任意のIPアドレスを使用してパケットを偽造でき、アプリケーションに到達するはずです。もちろん、正しい「場所」にいなければ、パケットを取り戻すことはできません。これが問題になるかどうかは、アプリケーションに設定するセキュリティによって異なります。アプリケーション内で特定のIPアドレスを他のIPアドレスよりも信頼する場合は、これが問題になる可能性があります。

したがって、その意味では、TCPはUDPよりも「安全」です。アプリケーションによっては、これがセキュリティに関連する場合とそうでない場合があります。それ自体、UDPを置き換える適切な理由ではありません。 TCPを使用するのは、2つのプロトコルの間に他のトレードオフが関係しているためです。

79
Steve Sether

プレーンUDPは状態を保持せず、ハンドシェイクなどを行います。これは、他のレイヤーで保護がない限り、攻撃者がスプーフィングされたパケットを簡単に送信できることを意味します。

一方、なりすましTCPパケットを送信するには、攻撃者が確立された接続のシーケンス番号とクライアントのポートを推測する必要があります。

27
domen

TCPはUDPよりも安全ではなく、ステートフルであり、各セグメントの確認を必要とするため、「信頼性」が高くなります。 UDPはステートレスであり、クライアントがセグメントを取得するかどうかを認識せずにセグメントを送信するだけです。

どちらも、他にはない特注のセキュリティ機能を備えていません。違いは、各プロトコルのさまざまな要件によって異なります。認識されたセキュリティ上の利点は、意図的なセキュリティ機能ではなく、機能的にプロトコルの機能的な副産物です。

編集:UDPとTCP=には特定の用途があります。これらの用途はどれもセキュリティに関係しません。

どちらのプロトコルも、セキュリティを提供するために他のプロトコルに依存しています。したがって、TCPの攻撃範囲はわずかに小さいかもしれませんが、セキュリティ指向のプロトコルが必要な場合にセキュリティを確保するには、これは重要ではありません。DTLSやgoogle QUICなどのプロトコル。

TCP UDPの方が適しているユースケースの場合、UDPを適切に保護するよりもTCPはほとんどのユースケースで保護が必要です)を実装することを選択すると、あなたが9アイアンが戦いで身を守るためのより良い武器だと思うので...あなたがポケットに銃を持っているとき。

22
TheJulyPlot

TCPはUDPより安全ですか?

はい。ただし、「セキュリティ」について話しているときは、何を話しているのかを明確にし、このステートメントを上位層プロトコルに一般化しないでください。

現在、security[〜#〜] cia [〜#〜]トライアドに関連付けられていることがよくあります。

  • [〜#〜] c [〜#〜]機密性。
  • [〜#〜] i [〜#〜]完全性。
  • [〜#〜] a [〜#〜]可用性。

IPプロトコルのバージョン4は、現在でも最も一般的に使用されていますが、70年代と80年代に開発された非常に古い獣です。

当時、機密性はそれほど重要ではありませんでしたが、真に対象となったのは完全性と可用性を実現することでした(IPプロトコルを生み出したインターネットの祖先であるArpanetネットワークは、サービスの継続性を確保するために設計されました)核戦争の出来事、輸送中のデータを保護するためではありません)。

この光学系では、TCPとUDPの2つのトランスポートプロトコルがIPレイヤー上で開発されました。

TCPは、integrityおよびavailabilityプロパティの両方を保証するように設計されたものでした。これには、3ウェイハンドシェイク、パラメーターネゴシエーション、さまざまな接続状態の処理、透過的なパケットの並べ替え、確認ウィンドウ、再試行メカニズムなど、当時の高度な手法が含まれていました。これにより、送信者は、送信したデータが完全な破損のない形式(つまり、欠落、変更、または順序付けされていない部分)で受信されたことを保証します。

ただし、このプロトコルが対象としたのは技術的な災害であり、転送中のデータの悪意のある改ざんではないことを思い出してください。そのような問題は、当時は完全に範囲外でした。

逆に、UDPは高速プロトコルになるように設計されています。これには上記の機能がないため、オーバーヘッドもありません。特に、送信者がUDPを使用して一部のデータを送信する場合、受信したデータは不完全であるか、順序付けされていないか、まったく受信されない可能性があります。UDPプロトコル自体は、送信者側でも受信者側でもこれを防止または検出するメカニズムを提供しません。

このように、セキュリティのデータの整合性と可用性のプロパティに注目すると、TCPはUDPよりも確かに安全です。

TCPに依存するアプリケーションプロトコルは、UDPに依存するものよりも安全ですか?

確かに違います。

これは、UDPに依存するアプリケーションプロトコルを開発している人々が、UDPプロトコルで欠落している機能のアプリケーションプロトコルの回避策を実装する必要がある場合があるため、より多くの作業が必要になることを意味します。送信されたデータが必ずしも受信されるとは限らないこと、受信されたデータが正しい順序になっていないことなどを考慮する必要があります。これらはすべてよく知られている問題です。

たとえばOpenVPNは、主に制限的なファイアウォールとの互換性のためにTCPをサポートしていますが、デフォルトで実行され、UDP経由で最適に実行されます。 TCPに切り替えることは可能ですが、2つのトランスポート層プロトコルUDPとTCPの違いはOpenVPN自体によって完全に処理されるため、セキュリティは向上しません。 TCPに切り替えると、OpenVPNプロトコルにTCPオーバーヘッドが追加されるだけで、パフォーマンスが低下します。

TCPはUDPより優れていますか?

いいえ、これは完全にアプリケーションプロトコルの設計上の選択です。

UDPは、より生のプロトコルです。mayを正しく注意深く使用すると、TCPよりも優れたパフォーマンスが得られますが、アプリケーションプロトコルの開発と保守が難しくなります。

  • アプリケーションが時間に依存しない場合、TCPは、ホイールを再発明する必要がないため、自然な選択としてそれ自体を課します。
  • アプリケーションが時間に敏感な場合、それぞれに欠点があることを知って、どちらを選択するかを検討する必要があります。potentialに対するTCPのパフォーマンスペナルティcertainlyUDPを使用したより複雑なアプリケーション。

ほとんどのプロトコルは時間に敏感ではないため、TCPが最も広く使用されているプロトコルです。実際、ウェブページを読み込んだり、メールを受信したりしても、10ミリ秒以内に受信しても違いはありません。

前述のOpenVPNに加えて、UDPを使用するプロトコルの2つの古典的な例は、メディアストリーミングとDNSです。

メディアストリーミングでは、ビデオまたはオーディオがスムーズに同期して再生されている限り、1つのビデオフレームまたは数ミリ秒のビデオまたはオーディオが欠落しているかどうかは問題ではありません。そのような場合、TCPが欠落したパケットを検出し、最後の確認応答ウィンドウのコンテンツを再送信するよう送信者に要求したため、繰り返しの一時停止を引き起こしたくありません。

DNSを使用すると、要求と応答は通常非常に短く、名前解決プロセスをできるだけ速くしたいとします(DNSゾーン転送などの時間に依存する応答は長くなり、TCPでも発生します)。名前解決要求をDNSサーバーに再送信することは、要求ごとに本格的な3方向ハンドシェイクを処理するよりも、要求または応答が失われることが非常に少ない回数で高速です。

機密性と悪意のあるスニッフィング/改ざん(およびIPv6)についてはどうですか?

これまで私たちが気にしていたのは、この古いIPv4の精神に則って、伝送速度とデータの整合性+可用性のバランスだけでした。これに加えて機密性を追加したい場合は、これを行うことができますが、前述のように、IPv4は機密性の問題に関係しないため、アプリケーション層で行う必要があります。

最新の本格的なセキュリティ実装はアプリケーション層で実装でき、アプリケーションプロトコルのセキュリティ自体に影響を与えることなくTCPまたはUDP(または両方)プロトコルに依存できます(上記のOpenVPNの例を参照)。

ただし、冒頭で述べたように、IPv4は本当に別のコンピューティング時代から来ています。 IP層でIPSecをネイティブにサポートするIPv6の場合は、後継者となり、より近代的なセキュリティサービスbelowUDPやTCPなどのトランスポートプロトコルを提供します。

これにより、転送中のデータ暗号化をアプリケーションからネットワークレイヤーに委任でき、UDPとTCPの両方でまったく同じセキュリティ保証を提供できます。ただし、ほとんどのシナリオでは、UDPパフォーマンスの向上はIPSecオーバーヘッドによって相殺されるため、IPv6 IPSecが使用されている限り、代わりにUDP TCPを使用する利点があるかどうかはわかりません。

14
WhiteWinterWolf

あんまり。

どちらのプロトコルにも、機密性を提供するための組み込み機能はありません。すべてのセキュリティは、上のプロトコル層(または )によって提供されることになっています。

TCPはUDPよりも複雑なプロトコルであるため、なりすましが少し難しくなりますが、これらの複雑さはめったに深刻な障害にはなりません。

TCPはUDPよりも「信頼性が高い」と言われる場合、セキュリティについては言及していません。TCPは、すべてのセグメントが順序どおりに受信され、失われたセグメントが再送信されます。UDPはこれを保証しません。接続が悪い場合、UDPセグメントはトレースなしで失われるか、間違った順序で到着する可能性があります。この問題の対処方法はアプリケーション次第です。

10
Philipp

TCPは「接続ベース」です。つまり、シーケンス番号の形式で信頼性が組み込まれています。したがって、たとえば、TCP=を介して画像を送信しますが、パケットの1/4がドロップされます。シーケンス番号を持つ接続ベースのプロトコルがあるため、コンピュータはあなたがそのデータが欠落しているため、データの整合性を保つためにそのデータを私に要求します。これは低速ですが、はるかに安全です。また、TCP/IPパケットを偽装するには、そのシーケンス番号をキャッチして悪意のあるパケットを送信する必要があります。真ん中に男がいなければ、それはほとんど不可能です!

UDPは「無接続」プロトコルです。つまり、データを送信して忘れるだけです。データの信頼性や整合性はありませんが、一部のアプリケーションではより高速で効率的です。

7
Joshua Faust

実際には、ファイアウォールネットワークのTCP is easy for police):外部で確立された接続と内部で確立された接続に関連するトラフィック、つまりクライアントとサーバーの役割は明確に区別でき、別のポリシーによって処理されます。たとえば、保護されたネットワーク上のホストが外部Webサーバーにアクセスできるが、外部クライアントへのWebサーバーとして機能できないようにすることができます。UDPサービス(DNSなど)の場合、そのようなポリシーを適用しますトランスポート層の上下の情報を考慮する必要があるため、より多くのインテリジェンスと当て推量が必要です。

4
rackandboneman

TCPはUDPより「安全」ではありません。

  • TCPには暗号化機能自体はありません;
  • TCPパケット送信は信頼できますが、UDPを介して同じようにエミュレートできます。

UDPはIPパケットの上にある薄い層ですが、TCPには、オペレーティングシステムの一部である複雑な標準メカニズムがあります。

QUICプロジェクトを見て、TCP/UDPの違い、およびGoogleがTCPではなくUDPを介して独自の保護されたHTTP/2トランスポート層を作成した理由を調べてみる価値があります。

引用しましょう https://www.chromium.org/quic

TCP + TLS + HTTP2に対するQUICの主な利点は次のとおりです。

  • 接続確立待ち時間
  • 輻輳制御の改善
  • 行頭ブロッキングなしの多重化
  • 前方誤り訂正
  • 接続の移行
3
Arnaud Bouchez

それぞれのセキュリティの見通しからいくつかの長所/短所を設定して見てみましょう。

[〜#〜] udp [〜#〜]

  • (+)UDPオープンポートのスキャンは比較的困難で、ステルススキャンは存在しません(TCPでの接続がSYNを送信することにより))。
  • (-)ネットワークデバイス(ステートフルファイアウォール、NATなど)は、依存するFLAGSがないため、UDP接続の制御に苦労しています。
  • (-)接続が存在しないため、反射攻撃がより一般的です。
  • (-)IPのスプーフィングは簡単で、DoS攻撃で使用されます。

[〜#〜] tcp [〜#〜]

  • (-)ステルススキャンは開いているポートを検出できますTCPポート(開いているポートを検出するためにのみSYNを送信))
  • (+)ネットワークデバイス(ステートフルファイアウォールなど)は、TCP接続を簡単に追跡および制御できます。
  • (+)正しい `シーケンス番号と確認番号を提供する必要があるため、パケットの偽造は容易ではありません。
  • (+)最初のハンドシェイクのため、IPを偽装するのはUDPほど簡単ではありません。
1
Shaboti

現在、TCPはUDPよりも安全ではありません。TCPは、UDPよりも信頼性が高く、TCPはエラーを検出して再送信できますパケット。

安全なデータ転送が必要な場合は、TLSやIPSecなどのフォーマット暗号化の使用を検討しています。

0
morris hoodye

TCPには接続の概念がありますが、UDPにはありません。ただし、接続の概念は、セキュリティの観点からは長所と短所の両方です。接続の主なセキュリティ強度は標準化されていることです。アプリケーション開発者、ネットワーキングギア、ファイアウォールはすべて、接続の確立、パケットの断片化の処理、再送信などの固定の方法に依存できます。さらに、接続コンセプトにより、SSLなどの追加のセキュリティ層を簡単に構築できます。

ただし、TCP接続は、トランスポート層を直接標的とする攻撃(SYNフラッド攻撃など)からの保護を提供しません。UDPを使用すると、理論的にはすべてのパケットを認証してこれらのパケットの一部を軽減できますリスク。

したがって、UDPはTCPよりも「理論的に」安全であると私は主張しますが、私たちはセキュリティが完全ではない世界に住んでいるため、理論上の強さはあまり意味がありません。現実の世界では、両方の方法で例を見つけることができます。一方のプロトコルが、他方のプロトコルが脆弱ではなかった方法で失敗した場合です。

要約すると、どのプロトコルがより「安全」であるかについて、あなたが懸念している脅威と、それらを緩和するために費やすことを望んでいる脅威の量と期間で、質問を限定する必要がある答えはないと思います。それがすべての脅威であり、時間とお金について無限の可能性がある場合、私の理論的な答えは成り立ちます。

0
David Trott