SegmentSmack と FragmentSmack: ランダムなオフセットのある IP フラグメントと TCP セグメントにより、リモートからサービス拒否 (DoS) 攻撃が引き起こされる可能性がある [CVE-2018-5390、CVE-2018-5391]

更新 -

概要

SegmentSmack および FragmentSmack と呼ばれる 2 つのセキュリティー上の欠陥が最近、Linux カーネルで見つかりました。

SegmentSmack と呼ばれる脆弱性は、Linux カーネルが特別に細工された TCP パケットを処理する方法において見つかりました。リモートの攻撃者はこの脆弱性を利用して、実行中の TCP セッション内に特別に細工されたパケットを送信することで、tcp_collapse_ofo_queue() および tcp_prune_ofo_queue() 関数への時間と計算がかかる呼び出しをトリガーすることができます。これは CPU の飽和状態につながり、これにより受信ネットワークトラフィックの帯域幅が比較的狭い場合にシステムでサービス拒否が発生する可能性があります。最悪のシナリオでは、攻撃者は 2 kpps 未満の攻撃トラフィックで、影響を受けるホストまたはデバイスを停止させることができます。サービス拒否の状態を維持するには、到達可能なオープンポートに双方向の TCP セッションを継続する必要があります。そのため、偽の IP アドレスを使用して攻撃を実行することはできません。

4 つのストリームを用いた攻撃により、4 つの CPU コアが完全に飽和したような状態になり、ネットワークパケットの処理に遅延がもたらされます。

$ top
%Cpu25 :  0.0 us,  0.0 sy,  0.0 ni,  1.4 id,  0.0 wa,  0.0 hi, 98.5 si,  0.0 st
%Cpu26 :  0.0 us,  0.0 sy,  0.0 ni,  1.4 id,  0.0 wa,  0.0 hi, 98.6 si,  0.0 st
%Cpu28 :  0.0 us,  0.3 sy,  0.0 ni,  0.7 id,  0.0 wa,  0.0 hi, 99.0 si,  0.0 st
%Cpu30 :  0.0 us,  0.0 sy,  0.0 ni,  1.4 id,  0.0 wa,  0.0 hi, 98.6 si,  0.0 st
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   141 root      20   0       0      0      0 R  97.3  0.0   1:16.33 ksoftirqd/26
   151 root      20   0       0      0      0 R  97.3  0.0   1:16.68 ksoftirqd/28
   136 root      20   0       0      0      0 R  97.0  0.0   0:39.09 ksoftirqd/25
   161 root      20   0       0      0      0 R  97.0  0.0   1:16.48 ksoftirqd/30

Linux カーネルが断片化された IPv4 と IPv6 のパケットを再構築する方法において、FragmentSmack と呼ばれる脆弱性が見つかりました。リモートの攻撃者はこの脆弱性を利用して、特別に細工されたパケットを送信することで、時間と計算がかかる断片化と再構築のアルゴリズムをトリガーすることが可能になります。これは CPU の飽和状態につながり、これによりシステムでサービスが拒否される可能性があります。

Intel(R) Xeon(R) D-1587@1.70GHz CPU と 合計 32 個のコアを持つ物理システムで 30 kpps の攻撃が行われると、コアが完全に飽和したような状態になります。

top - 08:59:45 up  1:34,  2 users,  load average: 0.39, 0.15, 0.08
%Cpu9  :  0.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,100.0 si,  0.0 st
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   54 root      20   0       0      0      0 R  99.7  0.0   0:47.53 ksoftirqd/9

単一の IP ホストからの攻撃は、パケットが別の IP アドレスから送信されるように偽装することで、複数の CPU コアを飽和状態にすることができます。Linux カーネルは、CPU コアにおけるこのような IP の断片化と再構築のスケジュールに、複雑なアルゴリズムを使用します。したがって、このような再構築は別の CPU コアに分散できますが、SegmentSmack の脆弱性と比較すると、実現するのはかなり難しくなります。このような攻撃が 2 つの偽の IP アドレスから行われると、2 つのコアが完全な飽和状態であるように見えますが、攻撃者がこの攻撃を達成することはより難しくなります。

top - 10:10:36 up 34 min,  2 users,  load average: 0.51, 0.29, 0.15
%Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,100.0 si,  0.0 st
%Cpu7  :  0.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,100.0 si,  0.0 st
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   24 root      20   0       0      0      0 R 100.0  0.0   1:50.69 ksoftirqd/3
   44 root      20   0       0      0      0 R 100.0  0.0   1:07.11 ksoftirqd/7

影響を受ける製品

SegmentSmack と FragmentSmack の攻撃は、Linux カーネルネットワークスタックで使用されるアルゴリズムによって可能となります。つまり、適度に新しい Linux カーネルバージョンを採用するすべての Red Hat 製品が影響を受けます。

  • Red Hat Enterprise Linux 6
  • Red Hat Enterprise Linux 7
  • Red Hat Enterprise Linux 7 for Real Time
  • Red Hat Enterprise Linux 7 for ARM64
  • Red Hat Enterprise Linux 7 for IBM Power9
  • Red Hat Enterprise Linux 7 for IBM SystemZ
  • Red Hat Enterprise Linux Atomic Host
  • Red Hat Enterprise MRG 2
  • Red Hat Virtualization 4

RHEL-5 がこれらの脆弱性から受ける影響度は大幅に低くなっています。つまり、弊社のテストでは、1Mpps (バイトやビットではなくパケット) での高速攻撃のみが、かろうじて 1 つの CPU コアを飽和状態にすることができました。このため、RHEL5 における脆弱性の重大度は中程度となっています。

解決策

SegmentSmack

現段階では、修正されたカーネル以外の効果的な回避策または軽減策はありません。Red Hat は、Bugzilla チケット 1601704 で修正を追跡しています。Red Hat Enterprise Linux カーネルの更新は、利用可能となり次第リリースされます。

#

影響を受ける製品

の更新

製品名 パッケージ アドバイザリー/更新
Red Hat Enterprise Linux 7 kernel RHSA-2018:2384
Red Hat Enterprise Linux 7 for Real Time kernel-rt RHSA-2018:2395
Red Hat Enterprise Linux 7.4 Extended Update Support* kernel RHSA-2018:2776
Red Hat Enterprise Linux 7.3 Extended Update Support* kernel RHSA-2018:2785
Red Hat Enterprise Linux 7.2 AUS**/TUS*** kernel RHSA-2018:2790
Red Hat Enterprise Linux 6 kernel RHSA-2018:2390
Red Hat Enterprise Linux 6.7 Extended Update Support* kernel RHSA-2018:2645
Red Hat Enterprise Linux 6.6 AUS**/TUS*** kernel RHSA-2018:2924
Red Hat Enterprise Linux 6.5 Advanced Update Support** kernel RHSA-2018:2933
Red Hat Enterprise Linux 6.4 Advanced Update Support** kernel RHSA-2018:2791
Red Hat Enterprise Linux 7 for ARM64/Power9/SystemZ kernel RHSA-2018:2948
Red Hat Enterprise MRG 2 kernel-rt RHSA-2018:2789
Red Hat Virtualization 4 rhvm-appliance RHSA-2018:2402
Red Hat Virtualization 4 redhat-virtualization-host RHSA-2018:2403

*このパッチを取得するには 有効な EUS サブスクリプションが必要です。 お持ちのアカウントに有効な EUS サブスクリプションがない場合は、Red Hat の営業部門または営業担当者に お問い合わせ ください。「Red Hat Enterprise Linux Extended Update Support サブスクリプションとは何ですか?」も参照してください。

**このパッチを取得するには 有効な AUS サブスクリプションが必要です。お持ちのアカウントに有効な AUS サブスクリプションがない場合は、Red Hat の営業部門または営業担当者に お問い合わせ ください。「What is Advanced mission critical Update Support (AUS)?」も参照してください。

***このパッチを取得するには 有効な TUS サブスクリプションが必要です。お持ちのアカウントに有効な TUS サブスクリプションがない場合は、Red Hat の営業部門または営業担当者に お問い合わせ ください。

FragmentSmack

Red Hat は、Bugzilla チケット 1609664 で修正を追跡しています。Red Hat Enterprise Linux カーネルの更新は、利用可能となり次第リリースされます。

#

影響を受ける製品

の更新

製品名 パッケージ アドバイザリー/更新
Red Hat Enterprise Linux 7 kernel RHSA-2018:3083
Red Hat Enterprise Linux 7 for Real Time kernel-rt RHSA-2018:3096
Red Hat Enterprise Linux 7.5 Extended Update Support* kernel RHSA-2018:3459
Red Hat Enterprise Linux 7.4 Extended Update Support* kernel RHSA-2018:3540
Red Hat Enterprise Linux 7.3 Extended Update Support* kernel RHSA-2018:2785
Red Hat Enterprise Linux 7.2 AUS**/TUS*** kernel RHSA-2018:3590
Red Hat Enterprise Linux 6 kernel RHSA-2018:2846
Red Hat Enterprise Linux 6.7 Extended Update Support* kernel RHSA-2018:2925
Red Hat Enterprise Linux 6.6 AUS**/TUS*** kernel RHSA-2018:2924
Red Hat Enterprise Linux 6.5 Advanced Update Support** kernel RHSA-2018:2933
Red Hat Enterprise Linux 6.4 Advanced Update Support** kernel RHSA-2018:2791
Red Hat Enterprise Linux 7 for ARM64/Power9/SystemZ kernel RHSA-2018:2948
Red Hat Enterprise MRG 2 kernel-rt RHSA-2018:3586

*このパッチを取得するには 有効な EUS サブスクリプションが必要です。 お持ちのアカウントに有効な EUS サブスクリプションがない場合は、Red Hat の営業部門または営業担当者に お問い合わせ ください。「Red Hat Enterprise Linux Extended Update Support サブスクリプションとは何ですか?」も参照してください。

**このパッチを取得するには 有効な AUS サブスクリプションが必要です。お持ちのアカウントに有効な AUS サブスクリプションがない場合は、Red Hat の営業部門または営業担当者に お問い合わせ ください。「What is Advanced mission critical Update Support (AUS)?」も参照してください。

***このパッチを取得するには 有効な TUS サブスクリプションが必要です。お持ちのアカウントに有効な TUS サブスクリプションがない場合は、Red Hat の営業部門または営業担当者に お問い合わせ ください。

軽減策

修正されたカーネルをインストールする以外に、net.ipv4.ipfrag_high_threshnet.ipv4.ipfrag_low_thresh (IPv6 では net.ipv6.ipfrag_high_threshnet.ipv6.ipfrag_low_thresh) sysctl パラメーターのデフォルト値である 4MB および 3MB を (それぞれ) 256 kB と 192 kB、もしくはそれ以下に変更します。その結果、ハードウェアと環境によっては、攻撃中における CPU の飽和状態がある程度または大幅に低下します。 たとえば、この軽減策が上記の 32 コアのシステムに適用されると、高速攻撃 (~500 kpps) の実行に気付かなくなりました。

しかし、ipfrag_high_thresh が 262144 バイトに設定されていることから、パフォーマンスに何らかの影響が及ぶ可能性があります。この方法だと、同時に再構築キューに置くことができるのは、2 つの 64K フラグメントのみだからです。たとえば、大きいサイズの UDP パケットに依存するアプリケーションは、破損する恐れがあります。

以下のシンプルなスクリプトを使用すると、デフォルト値をすばやく低い値に変更したり、低い値をデフォルト値に戻すことができます。

#!/bin/sh
if [ "x$1" == "xlow" ]; then
    echo Settinig limits low:
    sysctl -w net.ipv4.ipfrag_low_thresh=196608
    sysctl -w net.ipv4.ipfrag_high_thresh=262144
    sysctl -w net.ipv6.ip6frag_low_thresh=196608
    sysctl -w net.ipv6.ip6frag_high_thresh=262144
    echo
elif [ "x$1" == "xdef" ]; then
    echo Settinig limits default:
    sysctl -w net.ipv4.ipfrag_high_thresh=4194304
    sysctl -w net.ipv4.ipfrag_low_thresh=3145728
    sysctl -w net.ipv6.ip6frag_high_thresh=4194304
    sysctl -w net.ipv6.ip6frag_low_thresh=3145728
    echo
fi
echo Current values:
sysctl net.ipv4.ipfrag_low_thresh
sysctl net.ipv4.ipfrag_high_thresh
sysctl net.ipv6.ip6frag_low_thresh
sysctl net.ipv6.ip6frag_high_thresh

謝辞

この脆弱性をご報告いただいた Aalto University (Department of Communications and Networking) の Juha-Matti Tilli 氏および Nokia Bell Labs に謝意を表します。