SegmentSmack 및 FragmentSmack: 임의의 오프셋이 있는 IP 단편화 및 TCP 세그먼트로 원격 서비스 거부(DoS) 공격 가능 취약점 [CVE-2018-5390, CVE-2018-5391]

업데이트됨 -

개요

최근 Linux 커널에서 SegmentSmack and FragmentSmack이라는 두 가지 보안 취약점이 발견되었습니다.

Linux 커널의 특수하게 조작된 TCP 패킷을 처리하는 방식에서 SegmentSmack이라는 취약점이 발견되었습니다. 이 취약점을 사용하여 공격자는 원격에서 시간과 계산식이 많이 소요되는 호출을 tcp_collapse_ofo_queue() 및 tcp_prune_ofo_queue() 함수로 전송시킬 수 있게 됩니다. 이 과정에서 특수하게 조작된 패킷을 현재 진행 중인 TCP 세션으로 보내게 되면 들어오는 네트워크 트래픽의 상대적으로 작은 대역폭으로 인해 CPU에서 과부하가 발생하고 DOS공격이 가능하게 됩니다. 최악의 경우 공격자는 공격 트래픽이 2 kpps 미만의 영향을 받는 호스트 또는 장치를 지연시킬 수 있습니다. 열려있는 포트로의 지속적인 양방향 TCP 세션을 유지해야만 DOS 상태를 지속할 수 있으므로 스푸핑된 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 과부하로 이어질 수있는 특수하게 조작 된 패킷을 보내 시스템에서 DOS를 유발할 수 있습니다.

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 단편화를 재결합합니다. 이로 인해 재결합된 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

영향을 받는 제품

Linux 커널 네트워크 스택에서 사용되는 알고리즘 때문에 SegmentSmack 및 FragmentSmack 공격이 가능하므로 새로운 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 Power
  • Red Hat Enterprise Linux Atomic Host
  • Red Hat Enterprise MRG 2
  • Red Hat Virtualization 4

RHEL-5는 이러한 취약점의 영향을 훨씬 적게 받습니다. 테스트 결과 1Mpps의 고속 공격 (바이트 또는 비트가 아닌 패킷)만으로도 CPU 코어 1 개를 간신히 과부하 상태로 만들 수 있었습니다. 따라서 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 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 영업팀 또는 해당 지역 영업 담당자에게 [문의] (https://www.redhat.com/en/contact-sales) 하시기 바랍니다. What is the Red Hat Enterprise Linux Extended Update Support Subscription?를 참조하십시오.

**이 패치에 액세스하려면 활성 AUS 서브스크립션이 필요합니다. 사용 계정에 활성 AUS 서브스크립션이 없을 경우 보다 자세한 내용은 Red Hat 영업팀 또는 해당 지역 영업 담당자에게 [문의] (https://www.redhat.com/en/contact-sales) 하시기 바랍니다. What is Advanced mission critical Update Support (AUS)?를 참조하십시오.

*** 이 패치에 액세스하려면 활성 TUS 서브스크립션이 필요합니다. 사용 계정에 활성 TUS 서브스크립션이 없을 경우 보다 자세한 내용은 Red Hat 영업팀 또는 해당 지역 영업 담당자에게 [문의] (https://www.redhat.com/en/contact-sales) 하시기 바랍니다.

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.3 Extended Update Support* kernel RHSA-2018:2785
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 kernel RHSA-2018:2948

*이 패치에 액세스하려면 활성 EUS 서브스크립션이 필요합니다. 사용 계정에 활성 EUS 서브스크립션이 없을 경우 보다 자세한 내용은 Red Hat 영업팀 또는 해당 지역 영업 담당자에게 [문의] (https://www.redhat.com/en/contact-sales) 하시기 바랍니다. What is the Red Hat Enterprise Linux Extended Update Support Subscription?를 참조하십시오.

**이 패치에 액세스하려면 활성 AUS 서브스크립션이 필요합니다. 사용 계정에 활성 AUS 서브스크립션이 없을 경우 보다 자세한 내용은 Red Hat 영업팀 또는 해당 지역 영업 담당자에게 [문의] (https://www.redhat.com/en/contact-sales) 하시기 바랍니다. What is Advanced mission critical Update Support (AUS)?를 참조하십시오.

*** 이 패치에 액세스하려면 활성 TUS 서브스크립션이 필요합니다. 사용 계정에 활성 TUS 서브스크립션이 없을 경우 보다 자세한 내용은 Red Hat 영업팀 또는 해당 지역 영업 담당자에게 [문의] (https://www.redhat.com/en/contact-sales) 하시기 바랍니다.

완화 방법

고정 커널을 설치하는 것 외에 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 코어 시스템에 적용할 경우 고속 공격 (~ 500kpps) 활동이 현저하게 저하됩니다.

ipfrag_high_thresh가 262144 바이트로 설정되어 있기 때문에 두 개의 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

감사 인사

Red Hat은 본 문제에 대해 보고해 주신 Department of Communications and Networking 및 Nokia Bell Labs, Aalto University의 Juha-Matti Tilli님에게 감사의 말씀을 전합니다.