SegmentSmack と FragmentSmack: ランダムなオフセットのある IP フラグメントと TCP セグメントにより、リモートからサービス拒否 (DoS) 攻撃が引き起こされる可能性がある [CVE-2018-5390、CVE-2018-5391]
Table of Contents
概要
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_thresh
と net.ipv4.ipfrag_low_thresh
(IPv6 では net.ipv6.ipfrag_high_thresh
と net.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 に謝意を表します。
Comments