Kernel Local Privilege Escalation "Dirty COW" - CVE-2016-5195

Public Date: October 26, 2016, 09:34
갱신됨 November 2, 2016, 14:34 - Chinese, Simplified 영어 (English) French Japanese
Resolved 상태
Important Impact

Red Hat 제품 보안팀은 Linux 커널에서 취약점을 인지하고 있으며 이는 CVE-2016-5195 로 지정되어 있습니다. 본 취약점은 2016년 10월 19일에 공지되었으며 중요한 영향 을 미치는 것으로 평가되고 있습니다. 본 문제는 미디어에서 "Dirty COW"라고 보도되고 있습니다.

배경 정보

읽기 전용 메모리 맵핑의 COW(Copy-On-Write) 장애를 다루는 Linux 커널의 메모리 하위 시스템과 관련하여 경합 상태가 발견되었습니다. 권한이 없는 로컬 사용자가 본 결함을 악용하여 읽기 전용 메모리 맵핑에 대한 쓰기 권한을 획득하여 시스템에서 자신의 권한을 상승시킬 수 있습니다.

이는 공격자가 기존 setuid 파일을 수정하여 권한을 승격할 수 있도록 악용될 수 있으며 이러한 취약점이 악용된 사례는 이미 보고되어 있습니다. 이는 최신 Linux 배포판 대부분에 영향을 줍니다.

Red Hat 제품 보안팀은 본 취약점이 이번 업데이트에서 중요한 영향 을 미치는 것으로 평가하고 있습니다.

영향을 받는 제품

영향을 받는 Red Hat 제품 버전은 다음과 같습니다:

  • Red Hat Enterprise Linux 5
  • Red Hat Enterprise Linux 6
  • Red Hat Enterprise Linux 7
  • Red Hat Enterprise MRG 2
  • Red Hat Openshift Online v2
  • Red Hat Virtualization (RHEV-H/RHV-H)

공격 내용 및 영향

본 결함을 통해 로컬 시스템 계정이 있는 공격자는 적절한 권한 없이 수정할 수 없는 표준 권한 메커니즘을 무시하고 디스크 바이너리를 변경할 수 있습니다. 이는 실행 파일의 페이지를 mmapp으로 메모리에 맵핑하면서 madvise(MADV_DONTNEED) 시스템 호출을 처리함으로 발생될 수 있습니다.

취약성 진단

시스템의 취약성 여부 확인

대응 방법

영향을 받는 커널 버전을 실행하고 있는 모든 Red Hat 고객의 경우 패치 릴리즈 후 커널을 업데이트할 것을 권장합니다. 영향을 받는 패키지와 권장 완화 방법은 아래에 설명되어 있습니다. 커널 업데이트를 적용하려면 시스템을 다시 시작해야 합니다.

영향을 받는 제품 업데이트

Red Hat Enterprise Linux 7.2 이상을 사용하는 고객의 경우 kpatch를 사용할 수 있습니다. kpatch 액세스를 위한 지원을 요청하십시오.

kpatch에 대한 자세한 내용은 다음에서 확인하십시오: RHEL 7에서 라이브 커널 패칭 (kpatch)이 지원됩니까?


제품 패키지 권고/업데이트
Red Hat Enterprise Linux 7 kernel RHSA-2016:2098
Red Hat Enterprise Linux 7 kernel-rt RHSA-2016:2110
Red Hat Enterprise Linux 7.1 Extended Update Support* kernel RHSA-2016:2118
Red Hat Enterprise Linux 6 kernel RHSA-2016:2105
Red Hat Enterprise Linux 6.7 Extended Update Support* kernel RHSA-2016:2106
Red Hat Enterprise Linux 6.6 Extended Update Support* kernel RHSA-2016:2128
Red Hat Enterprise Linux 6.5 Advanced Update Support** kernel RHSA-2016:2120
Red Hat Enterprise Linux 6.4 Advanced Update Support** kernel RHSA-2016:2133
Red Hat Enterprise Linux 6.2 Advanced Update Support** kernel RHSA-2016:2132
Red Hat Enterprise Linux 5 kernel RHSA-2016:2124
Red Hat Enterprise Linux 5.9 Long Life kernel RHSA-2016:2126
Red Hat Enterprise Linux 5.6 Long Life kernel RHSA-2016:2127
RHEL Atomic Host kernel 보류 중
Red Hat Enterprise MRG 2 kernel-rt RHSA-2016:2107
Red Hat Virtualization (RHEV-H/RHV-H) kernel 보류 중

* 이러한 패치에 액세스하려면 활성 EUS 서브스크립션이 필요합니다.

사용 계정에 EUS 서브스크립션이 없을 경우 보다 자세한 내용은 Red Hat 영업팀 또는 해당 영업 담당자에게 문의 하시기 바랍니다.

Red Hat Enterprise Linux Extended Update Support 서브스크립션이란?

**RHEL 6.X AUS에서 이러한 패치에 액세스하려면 활성 AUS 서브스크립션이 필요합니다.

완화 방법

SYSTEMTAP을 통한 해결 방법 구축 및 사용 방법

systemtap을 통해 취약한 시스템 호출을 가로채는 systemtap 스크립트를 사용하여 커널 모듈 (예: 드라이버)을 생성합니다. 이는 수정된 커널이 영향을 받은 시스템에서 시작될 때 까지 임시 솔루션으로 사용됩니다. 이 솔루션은 재부팅해야 할 필요가 없으며 RHEL 5, 6, 7에 적용됩니다.

모든 커널에 적용할 수 있는 모듈을 만드는 것은 불가능합니다. 심지어 제품군 (예: 모든 RHEL5, 6, 7)이라도 불가능합니다. 각 커널 버전마다 커널 (uname -r)의 .ko를 생성해야 합니다.

요구 사항

systemtap 모듈 빌드에는 다음과 같은 패키지가 필요합니다:

  • systemtap-client
  • systemtap-devel
  • gcc (및 종속 패키지)
  • kernel-devel-`uname -r`
  • kernel-debuginfo-`uname -r`
  • kernel-debuginfo-common-`uname -r`

경고: 'kernel' 패키지는 실행 중인 커널과 동일한 버전이어야 합니다. 최신 버전을 다운로드하면 systemtap이 작동하지 않을 수 있습니다. 실행 중인 커널과 정확히 동일한 버전을 다운로드하시기 바랍니다.

debuginfo 패키지 받는 방법

다음의 지식 베이스 https://access.redhat.com/solutions/9907 에서 참조하시기 바랍니다.

모듈 빌드 방법

1. 패키지 설치 후 다음의 내용이 포함된 dirtycow.stp라는 파일을 만듭니다.

probe kernel.function("mem_write").call ? {
        $count = 0
}

probe syscall.ptrace {  // includes compat ptrace as well
        $request = 0xfff
}

probe begin {
        printk(0, "CVE-2016-5195 mitigation loaded")
}


probe end {
        printk(0, "CVE-2016-5195 mitigation unloaded")
}
										

2. 파일을 저장합니다. 다음 명령을 사용하여 파일을 컴파일합니다:

# stap -g -p 4 -m dirtycow_`uname -r|tr -cd [:digit:]` dirtycow.stp
dirtycow_26183985.ko
											

위의 예에서 .ko 파일에는 커널 버전 식별 번호가 있습니다. 이경우 2.6.18-398.el5가 됩니다. 이 모듈은 debugs/debuginfos/systemtap을 설치하지 않고 정확히 동일한 커널 버전의 다른 시스템에서 사용할 수 있습니다. 동일한 커널을 사용하여 서버에 파일을 복사하고 다음 단계로 이동합니다.

3. 다음 명령 insmod <.ko file>을 실행하여 모듈을 로드합니다. 예:

# insmod dirtycow_26183985.ko
												

4. 다음을 실행하여 모듈이 로드되었는지 확인합니다:

# lsmod| grep dirty
dirtycow_26183985   101688  0
													

5. 모듈을 언로드하려면 rmmod 명령을 사용하거나 시스템을 다시 시작합니다.

중요

  • 재부팅 후 모듈은 남아 있지 않게 됩니다: 시스템 부팅 후 다시 로드되지 않습니다.
  • 재부팅 후 수동으로 모듈을 다시 로드해야 합니다.
  • 커널이 업데이트 또는 수정되어 있을 경우 이 모듈은 새로운 커널에 로드되지 않습니다.
  • 수정하지 않고 다른 커널에 부팅할 경우 새로운 호환 모듈이 로드되어야 합니다.
  • 수정된 커널 모듈을 로드할 필요가 없습니다.

보다 자세한 완화 방법은 버그 1384344 에서 참조하십시오.

Comments