RHSB-2022-001 Polkit 권한 상승 - (CVE-2021-4034)

Public Date: January 12, 2022, 19:39
Updated February 15, 2022, 14:14 - Chinese, Simplified 영어 (English) French Japanese
Resolved 상태
Important Impact

Insights vulnerability analysis

View exposed systems

Red Hat은 pkexec에서 발견된 인증된 사용자가 권한 상승 공격을 수행할 수 있는 취약점을 인지하고 있습니다.

polkit 패키지는 권한이 없는 프로세스가 Linux 시스템에서 권한 있는 프로세스와 통신할 수 있도록 하는 정책을 정의하고 처리하도록 설계되었습니다. polkit의 일부인 pkexec는 polkit 정책 정의에 따라 사용자가 setuid 기능을 활용하여 다른 사용자로 명령을 실행할 수 있도록 하는 툴입니다. pkexec에서 발견된 취약점으로 인해 권한이 없는 로컬 공격자가 프로세스의 매개 변수 벡터를 잘못 처리하여 권한을 상승시키고 인증 및 정책을 우회할 수 있습니다. 

고객의 주요 위험은 권한이 없는 사용자가 영향을 받는 시스템에 대한 관리 권한을 얻을 수 있다는 점입니다. 공격자는 공격을 수행하려면 대상 시스템에 대한 로그인 액세스 권한이 있어야 합니다.

이 문제는 CVE-2021-4034로 지정되어 있으며 중요 (Important) 보안 영향을 미치는 것으로 분류하고 있습니다.

영향을 받는 Red Hat 제품 버전은 다음과 같습니다. "영향을 받음"은 제품의 코드에 이러한 취약점이 존재하며 제품의 사용 또는 완화와 관계없이 제품에 취약점이 있는 경우 이를 해결할 수 있음을 의미합니다.

  • Red Hat Enterprise Linux 6

  • Red Hat Enterprise Linux 7

  • Red Hat Enterprise Linux 8

  • Red Hat Virtualization 4

Red Hat Enterprise Linux (RHEL CoreOS 포함)에서 지원되는 모든 Red Hat 제품도 잠재적으로 영향을 받을 수 있습니다. 여기에는 다음이 포함됩니다.

  • polkit 패키지를 제공하는 RHEL을 기반 제품 컨테이너입니다. 이러한 이미지는 정기적으로 업데이트되며 이 보안 취약점을 수정할 수 있는지 여부를 나타내는 컨테이너 상태는 Red Hat Container Catalog의 일부인 Container Health Index에서 확인할 수 있습니다.

  • RHEL 채널에서 소프트웨어 패키지를 가져오는 제품입니다. (Red Hat OpenShift Container Platform, Red Hat OpenStack Platform, Red Hat Virtualization 등과 같은 계층화된 제품 포함) 이러한 제품 환경에서 기본 RHEL polkit 패키지가 최신 버전인지 확인합니다.

현재 사용 중인 시스템에 보안 취약점이 있는지 확인하려면 아래의 진단 섹션을 참조하십시오. 이러한 문제를 자동으로 해결할 수 있는 Ansible playbook도 제공됩니다.

pkexec 프로그램이 전달된 인수의 수를 올바르게 확인하지 못했습니다. 이 문제로 인해 결국 환경 변수를 명령으로 실행하려고 하는 시도로 이어집니다. 이 문제를 악용하면 pkexec가 권한 있는 사용자로 임의의 코드를 실행하여 공격자에게 로컬 권한 상승을 부여할 수 있습니다. 자세한 내용은 CVE-2021-4034를 참조하십시오.

Red Hat 제품 보안 팀은 영향을 받는 고객에게 polkit 패키지가 출시되는 데로 즉시 업데이트할 것을 강력히 권장합니다. 즉시 업데이트할 수 없는 고객의 경우 다음 단계를 실행하여 문제를 완화할 수 있습니다.

1. 다음과 같은 필수 systemtap 패키지 및 종속 항목을 설치합니다. https://access.redhat.com/solutions/5441

    2. polkit 디버그 정보를 설치합니다.

    debuginfo-install polkit

    3. 다음 systemtap 스크립트를 생성하고 이름을 pkexec-block.stp로 지정합니다.

    probe process("/usr/bin/pkexec").function("main") {

    if (cmdline_arg(1) == "")

    raise(9);

    }

    4. 실행 중인 커널에 systemtap 모듈을 로드합니다.

      stap -g -F -m stap_pkexec_block pkexec-block.stp

      5. 모듈이 로드되었는지 확인합니다.

        lsmod | grep -i stap_pkexec_block

        stap_pkexec_block 434176 0

        6. 수정 사항이 포함된 버전으로 polkit 패키지가 업데이트되면 다음을 실행하여 systemtap 생성된 커널 모듈을 제거합니다.

          rmmod stap_pkexec_block

          rmmod 명령을 사용한 후에는 시스템을 재부팅할 필요가 없습니다.

          참고: 시스템을 재부팅하면 systemtap에서 생성한 모듈을 커널에 다시 로드해야 합니다. 이렇게 하려면 완화 스크립트가 생성된 디렉터리로 이동하여 4단계와 5단계를 수행합니다.

          위의 완화 조치가 적용되면 pkexec가 적법한 사용 사례에 대해 예상대로 계속 작동합니다.

          참고: 이 완화 기능은 보안 부팅(Secure Boot)이 활성화된 시스템에는 작동하지 않습니다. SystemTap이 생성된 커널 모듈에 커널 키링에 등록된 키로 서명하기 위해 외부 컴파일 서버가 필요합니다.

          새 프로세스를 시작할 때 Linux 커널은 모든 명령 인수를 포함하는 배열(argv), 환경 변수를 포함하는 배열(envp), 인수 수를 나타내는 정수 값(argc)을 생성합니다. Linux 커널은 연속적인 방식으로 메모리에 매개 변수 배열과 환경 변수 배열을 배치합니다. 또 다른 기본 동작은 인수 배열의 첫 번째 값에 실행 가능한 이름(예: pkexec 실행 파일의 경우 pkexec)을 포함하는 방법이며 이는 사용자가 프로세스로 전송한 모든 인수가 이 값 뒤에 위치함을 의미합니다.

          pkexec는 인수의 수를 확인하지 않으며 항상 인수가 최소 1이고 두 번째 값은 NULL이거나 pkexec가 권한 있는 사용자로 실행하는 명령이라고 가정합니다. 공격자가 매개 변수 배열을 강제로 비우는데 성공하면 pkexec는 실행할 애플리케이션으로 환경 배열의 콘텐츠를 해석합니다. 공격자는 이러한 변수를 조작하여 특정 값과 페이로드를 포함하도록 이를 악용할 수 있으며, 인증 요청없이 권한 있는 사용자로 실행할 수 있습니다.

          직접적인 영향을 받는 Red Hat 서비스는 다음과 같습니다. 

          • OpenShift Dedicated (OSD) 

          • Azure RedHat OpenShift (ARO) 

          polkit을 사용하려면 사용자가 그래픽 또는 CLI를 사용하여 인증 에이전트로 작동하는 polkit으로 서비스를 받아야 하기 때문에 서비스에 미치는 영향은 낮습니다. OSD에서 그래픽 사용은 관련이 없습니다. CLI 사용에서 사용자는 OC 명령을 사용하여 OSD 클러스터에 인증합니다.

          또한 OSD는 프로덕션 클러스터에서 polkit을 특별히 사용하지 않습니다. OSD에서 timedatex는 테스트 OSD 클러스터 마스터 중 하나에 있는 polkit에 종속되어 있습니다. 따라서 OSD/ARO의 경우 영향이 적습니다.

          영향을 받는 Red Hat 제품 버전을 실행 중인 모든 Red Hat 고객은 에라타를 사용할 수 있는 즉시 해당 제품을 업데이트할 것을 권장합니다. 

          사용 가능한 업데이트를 즉시 적용하고 필요에 따라 완화 조치를 활성화하십시오.  

          제품

          구성 요소

          권고/업데이트 [1]

          Red Hat Enterprise Linux 8 

          polkit

          RHSA-2022:0267

          Red Hat Enterprise Linux 8.4.0 Extended Update Support [2]

          polkit

          RHSA-2022:0266

          Red Hat Enterprise Linux 8.2.0 Extended Update Support [2]

          polkit

          RHSA-2022:0265

          Red Hat Enterprise Linux 8.1.0 Update Services for SAP Solutions, Advanced Update Support [3],[4]

          polkit

          RHSA-2022:0268

          Red Hat Enterprise Linux 7

          polkit

          RHSA-2022:0274

          Red Hat Enterprise Linux 7.7 Update Services for SAP Solutions, Advanced Update Support [3],[4]

          polkit

          RHSA-2022:0273

          Red Hat Enterprise Linux 7.6 Update Services for SAP Solutions, Advanced Update Support [3],[4]

          polkit

          RHSA-2022:0271

          Red Hat Enterprise Linux 7.4 Advanced Update Support [4]

          polkit

          RHSA-2022:0272

          Red Hat Enterprise Linux 7.3 Advanced Update Support [4]

          polkit

          RHSA-2022:0270

          Red Hat Enterprise Linux 6 Extended Life-cycle Support [5]

          polkit

          RHSA-2022:0269

          Red Hat Virtualization 4 for Red Hat Enterprise Linux 8

          polkit

          RHSA-yyyy : xxxx

          Red Hat Virtualization 4 for Red Hat Enterprise Linux 7

          polkit

          RHSA-yyyy : xxxx


          [1] 업데이트가 릴리스된 후 권고/업데이트 링크가 추가됩니다.

          [2] Red Hat Enterprise Linux Extended Update Support (EUS)서브스크립션이란 무엇입니까?

          [3]Advanced mission critical Update Support (AUS)란 무엇입니까?

          [4]Red Hat Enterprise Linux SAP Solutions 서브스크립션이란 무엇입니까?

          [5] 이 패치에 액세스하려면 활성 ELS (Extended Life-cycle Support) 서브스크립션이 필요합니다.  해당 계정에 활성 ELS 서브스크립션이 없는 경우 Red Hat 영업 부서 또는 영업 담당자에게 문의하십시오.

          진단 스크립트를 사용하여 현재 사용 중인 시스템에 보안 취약점이 있는지 확인합니다. 정규 스크립트임을 확인하려면 OpenPGP 분리 서명을 다운로드합니다. GPG 서명을 확인하는 방법은 고객 포털에서 확인할 수 있습니다.

          현재 버전: 1.0

          위에 설명된 완화 기능을 자동화하는 Ansible Playbook도 사용할 수 있습니다. 이 플레이북은 systemtap을 사용하는 데 필요한 패키지를 설치하고, 인수 없이 pkexec 명령을 사용하지 못하도록 systemtap 스크립트를 생성하고 설치합니다. 이러한 완화 조치는 재부팅 후 다시 적용해야 하며 플레이북을 다시 실행하여 수행할 수 있습니다.

          플레이북을 사용하려면 완화 조치를 적용할 호스트의 Ansible 인벤토리 이름으로 HOSTS 추가 변수를 정의합니다. 예를 들면 다음과 같습니다.

          ansible-playbook -e HOSTS=web,ns1,mail CVE-2021-4034_stap_mitigate.yml

          OpenPGP 분리 서명을 다운로드하여 Playbook의 진위 여부를 확인할 수 있습니다. GPG 서명을 확인하는 방법은 고객 포털에서 확인할 수 있습니다. 

          현재 버전: 1.1

          Q: 수정 사항을 적용한 후 시스템이 보안 취약점의 영향을 받지 않도록 하려면 서비스 또는 시스템을 다시 시작해야 합니까?

          A: 서비스를 다시 시작하거나 시스템을 재부팅할 필요가 없습니다. 수정 사항은 polkit 제품군의 툴인 pkexec에 적용됩니다. 단일 인스턴스가 실행되므로 업데이트가 적용되면 다음번에 pkexec가 실행될 때 패치된 애플리케이션을 로드해야 합니다. 업데이트가 적용되면 업데이트 프로세스가 polkit 서비스를 다시 시작합니다.

          Q: 권장 완화 조치를 적용한 후 시스템 또는 서비스를 다시 시작해야 합니까?  

          A: 완화 조치를 적용한 후에는 시스템을 다시 시작할 필요가 없습니다. SystemTap이 커널 모듈이 로드되었는지 확인합니다.

          Q: 완화 조치로 pkexec 바이너리에서 setuid 권한을 제거하는 것이 안전합니까?

          A: 시스템 손상을 유발할 수 있으므로 Red Hat은 setuid 비트를 제거하는 것을 권장하지 않습니다. pkexec 바이너리에서 setuid 권한을 제거하면 제대로 작동하지 않게 됩니다. 즉, pkexec 실행에 의존하는 모든 애플리케이션이 작동을 중지하고 예기치 않은 시스템 오류 및 동작을 유발할 수 있습니다. 이 취약점에 대한 Qualys 권고에는 잠재적인 완화 조치로 setuid를 제거하는 것으로 나와있지만, 이는 시스템 손상을 일으키지 않는 실행 가능한 완화 조치가 아닌 것으로 확인되었습니다. Red Hat은 pkexec 기능에 부정적인 영향을 미치지 않는 대체 완화 방법을 제공합니다. 사용된 모든 완화 조치는 릴리스되는 패치를 적용할 수 있을 때 까지 단기적으로만 사용해야 합니다.

          Q: OpenShift Container Platform에 미치는 영향은 무엇입니까?

          A: OpenShift Container Platform (OCP)에서 polkit 패키지는 RHCOS에 포함되어 있으며 클러스터 노드에 사용됩니다. OCP 노드에 대한 액세스는 클러스터 관리자만 사용할 수 있습니다. 다른 누군가가 OCP 노드에 직접 연결할 수 있다면 이미 root 사용자가 되는 것이므로 polkit 패키지에 보안 취약점이 있는지 여부는 중요하지 않게 됩니다.

          polkit 패키지는 클러스터 관리자가 OCP 클러스터를 관리하는 데 사용하는 여러 OCP 컨테이너 이미지로도 사용할 수 있습니다. 이러한 이미지는 권한 있는 컨테이너로 실행되므로 해당 컨테이너에 액세스할 수 있는 모든 사용자는 이미 전체 관리자 액세스 권한을 갖습니다.

          Q: Docker를 사용하여 Red Hat Enterprise Linux 7.x를 실행하고 있습니다. 다시 시작한 후 네트워크를 통해 컨테이너에 더 이상 액세스할 수 없습니다. 어떻게 해야 합니까?

          A: Docker가 시작되면 net.ipv4.ip_forward를 1로 설정하여 네트워크를 통해 컨테이너에 액세스할 수 있도록 하는데 필요한 IP 전달이 허용됩니다. 그러나 시스템 구성에서는 이러한 설정이 유지되지는 않습니다. polkit 패키지를 업데이트할 때 polkit 서비스가 Red Hat Enterprise Linux 서버에서 자동으로 다시 시작되고 커널 구성을 다시 로드하도록 시스템 트리거를 종료합니다. 이렇게 하면 설정이 유지되지 않는 sysctl 항목이 재정의되어 네트워크를 통해 Docker 컨테이너에 액세스할 수 없게 됩니다. 이러한 동작을 방지하려면 시스템 관리자가 net.ipv4.ip_forward에 필요한 값이 sysctl 구성 파일에 유지되도록 해야 합니다. 이 절차에 대한 자세한 내용은 Red Hat Enterprise Linux에서 sysctl 변수를 설정하는 방법을 참조하십시오.

          Red Hat은 이 취약점을 보고해 주신 Qualys Research Team에 감사드립니다.

          https://access.redhat.com/security/cve/CVE-2021-4034

          https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt

          How to use GPG to verify signed content from Product Security

          Comments