컵 오버플로: 프린터에 잉크가 넘칠 경우

Elastic Security Labs는 CUPS 프린팅 시스템의 취약점에 대한 탐지 및 완화 전략을 논의합니다. 이 취약점은 인증되지 않은 공격자가 IPP 및 mDNS를 통해 시스템을 악용하여 Linux, macOS, BSDs, ChromeOS, Solaris와 같은 UNIX 기반 시스템에서 원격 코드 실행(RCE)을 가능하게 합니다.

CUPS 위기: 프린터에서 새어 나오는 보안 허점

Update October 2, 2024

The following packages introduced out-of-the-box (OOTB) rules to detect the exploitation of these vulnerabilities. Please check your "Prebuilt Security Detection Rules" integration versions or visit the Downloadable rule updates site.

  • Stack Version 8.15 - Package Version 8.15.6+
  • Stack Version 8.14 - Package Version 8.14.12+
  • Stack Version 8.13 - Package Version 8.13.18+
  • Stack Version 8.12 - Package Version 8.12.23+

핵심 사항

  • On September 26, 2024, security researcher Simone Margaritelli (@evilsocket) disclosed multiple vulnerabilities affecting the cups-browsed, libscupsfilters, and libppd components of the CUPS printing system, impacting versions <= 2.0.1.
  • 이 취약점을 통해 인증되지 않은 원격 공격자가 IPP(인터넷 인쇄 프로토콜)와 mDNS를 통해 인쇄 시스템을 악용하여 영향을 받는 시스템에서 원격 코드 실행(RCE)을 수행할 수 있습니다.
  • 이 공격은 공용 인터넷 또는 로컬 네트워크를 통해 시작될 수 있으며, 인증 요구 사항 없이 cups-browsed 에서 노출된 UDP 포트 631 를 대상으로 합니다.
  • 이 취약점 체인에는 FoomaticRIPCommandLine 지시문을 통해 임의의 명령을 실행할 수 있는 foomatic-rip 필터가 포함되어 있으며, 2011년 이후 알려진 문제(CVE-2011-2697, CVE-2011-2964)이지만 패치되지 않은 문제입니다.
  • 영향을 받는 시스템에는 대부분의 GNU/Linux 배포판, BSD, ChromeOS 및 Solaris가 포함되며, 이 중 대부분은 cups-browsed 서비스가 기본으로 활성화되어 있습니다.
  • "CUPS를 통한 UNIX 시스템 공격, 제1부"라는 출판물의 제목을 보면 마르가리텔리는 이 주제에 대한 추가 연구를 발표할 것으로 예상할 수 있습니다.
  • Elastic은 조직이 이러한 취약점의 잠재적 악용 가능성을 탐지하고 완화할 수 있도록 보호 및 지침을 제공해 왔습니다.

CUPS RCE 한눈에 보기

On September 26, 2024, security researcher Simone Margaritelli (@evilsocket) uncovered a chain of critical vulnerabilities in the CUPS (Common Unix Printing System) utilities, specifically in components like cups-browsed, libcupsfilters, and libppd. These vulnerabilities — identified as CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, and CVE-2024-47177 — affect widely adopted UNIX systems such as GNU/Linux, BSDs, ChromeOS, and Solaris, exposing them to remote code execution (RCE).

이 문제의 핵심은 CUPS 구성 요소에 입력 유효성 검사가 없기 때문에 공격자가 인터넷 인쇄 프로토콜(IPP)을 악용할 수 있다는 점입니다. 공격자는 인터넷(WAN)을 통해 공격 대상의 UDP 포트 631 로 악성 패킷을 보내거나 로컬 네트워크(LAN) 내에서 DNS-SD/mDNS 광고를 스푸핑하여 취약한 시스템이 악성 IPP 서버에 연결하도록 만들 수 있습니다.

참고로 IPP는 네트워크를 통해 인쇄 작업을 보내고 받는 데 사용되는 애플리케이션 계층 프로토콜입니다. 이러한 통신에는 프린터 상태(용지 걸림, 잉크 부족 등) 및 작업 상태에 관한 정보 전송이 포함됩니다. IPP는 Windows, macOS, Linux를 포함한 모든 주요 운영 체제에서 지원됩니다. 프린터를 사용할 수 있게 되면 프린터는 DNS를 통해 프린터가 준비되었다는 메시지(URI(Uniform Resource Identifier)를 포함하여)를 브로드캐스트합니다. Linux 워크스테이션에서 이 메시지를 받으면 대부분의 Linux 기본 구성에서 OS 내에서 사용할 프린터를 자동으로 추가하고 등록합니다. 따라서 이 경우 악성 프린터는 자동으로 등록되어 인쇄 작업에 사용할 수 있게 됩니다.

연결 시, 악성 서버는 조작된 IPP 속성을 반환하며, 이 속성은 포스트스크립트 프린터 설명(PPD) 파일에 삽입되어 CUPS에서 프린터 속성을 설명하는 데 사용됩니다. 이렇게 조작된 PPD 파일을 통해 공격자는 인쇄 작업이 트리거될 때 임의의 명령을 실행할 수 있습니다.

이 체인의 주요 취약점 중 하나는 foomatic-rip 필터로, 이 필터는 FoomaticRIPCommandLine 지시어를 통해 임의의 명령 실행을 허용하는 것으로 알려져 있습니다. 이 취약점은 10년이 넘었음에도 불구하고 많은 최신 CUPS 구현에서 패치되지 않은 상태로 남아 있어 위험을 더욱 악화시키고 있습니다.

이러한 취약점은 CVSS 점수가 9.9에 달할 정도로 매우 위험하지만, 컵스 브라우징을 비활성화하고 UDP 포트 631을 차단하고 CUPS를 패치된 버전으로 업데이트하면 완화할 수 있습니다. 많은 UNIX 시스템에서 이 서비스가 기본적으로 활성화되어 있으므로 영향을 받는 조직이 시급히 해결해야 할 문제입니다.

Elastic의 POC 분석

Elastic의 위협 연구 엔지니어들은 처음에 @evilsocket이 작성한 개념 증명 원본이 유출된 것을 찾아냈습니다. 하지만 로컬에서 실행할 수 있다는 점을 고려하여 컵샥스 개념 증명(PoC)을 활용하기로 결정했습니다.

우선 PoC에서는 mDNS/ZeroConf를 사용하여 네트워크에 가짜 프린터 서비스를 생성하고 등록하는 커스텀 파이썬 클래스를 사용했습니다. 이는 주로 가짜 IPP(인터넷 인쇄 프로토콜) 프린터에 대한 제로 컨프 서비스 항목을 생성하여 이루어집니다.

PoC가 실행되면 가짜 프린터 광고를 브로드캐스트하고 IPP 요청을 수신 대기합니다. 취약한 시스템이 브로드캐스트를 확인하면 피해자는 브로드캐스트 메시지에 제공된 URL에서 프린터의 속성을 자동으로 요청합니다. PoC는 CVE 기록으로 잘 알려진 FoomaticRIPCommandLine 매개변수를 포함한 IPP 속성으로 응답합니다. 피해자는 이러한 IPP 속성에서 포스트스크립트 프린터 설명 (PPD) 파일을 생성하고 저장합니다.

이 시점에서 계속 실행하려면 인쇄 작업을 시작하고 가짜 프린터로 보내도록 선택하기 위해 사용자 상호 작용이 필요합니다. 인쇄 작업이 전송되면 PPD 파일은 CUPS에 인쇄 작업 처리 방법을 알려줍니다. 포함된 FoomaticRIPCommandLine 지시어를 사용하면 피해 시스템에서 임의의 명령을 실행할 수 있습니다.

컵샥스 PoC로 익스플로잇을 검토하고 테스트하는 과정에서 취약한 엔드포인트와 실행 프로세스에 대한 몇 가지 주목할 만한 장애물과 주요 세부 사항을 확인했습니다.

임의의 명령을 실행하여 파일을 생성할 때 임의의 명령 실행에 대해 보고된 사용자 및 그룹이 lp, 즉 CUPS 유틸리티를 사용하는 Linux 시스템의 기본 인쇄 그룹이라는 것을 발견했습니다. 따라서 Cupshax PoC/익스플로잇은 CUPS 취약점과 lp 사용자 모두에게 악성 페이로드를 검색하고 실행할 수 있는 충분한 권한이 있어야 합니다. 기본적으로 많은 시스템의 lp 사용자는 리버스 셸과 같은 효과적인 페이로드를 실행할 수 있는 권한을 갖지만, 방화벽 또는 IPtables 적용 정책과 함께 AppArmor 또는 SELinux 정책과 같은 Linux 내에서 사용 가능한 기본 제어를 통해 이러한 페이로드가 효과가 없도록 lp 제한하는 것도 대안이 될 수 있습니다.

많은 기본 구성에서 lp 사용자는 인쇄 서비스에 필요하지 않은 명령(예: telnet)에 액세스할 수 있습니다. 공격 표면을 줄이려면 불필요한 서비스를 제거하고 필요한 경우 lp 사용자가 사용하지 못하도록 제한을 추가하는 것이 좋습니다.

또한 lp 사용자에게는 로그인 셸이 없기 때문에 이 기술을 통해 대화형 리버스 셸이 즉시 지원되지는 않지만, 몇 가지 창의적인 전략으로 PoC를 통해 이를 구현할 수 있었습니다. 일반적인 PoC는 /tmp/ 에 파일을 작성하여 익스플로잇을 테스트하는데, 대부분의 경우 쉽게 탐지할 수 있습니다. 이 파일을 작성하는 사용자는 lp 이므로 공격자가 페이로드를 다운로드하여 디스크에 저장하는 경우에도 유사한 동작이 나타납니다.

이러한 관찰과 함께, 셸을 실행하는 원격 측정에서 매우 드물게 상위 프로세스인 foomatic-rip 가 관찰되었습니다.

'컵샥스' POC 실행하기

이러한 취약점의 영향을 입증하기 위해 리버스 셸에 페이로드를 사용하는 리빙 오프 더 랜드 기법과 원격 페이로드 검색 및 실행이라는 두 가지 시나리오를 수행해 보았습니다. 이러한 조치는 공격 그룹이 취약한 시스템이 확인되면 흔히 시도하는 방법입니다. 아직 초기 단계이기 때문에 광범위한 악용이 관찰되지는 않았지만, 아래에 설명된 시나리오 중 일부가 재현될 가능성이 높습니다.

처음에 Cupshax PoC를 실행하려고 시도했을 때 lp 사용자에게 할당된 기본 사용자 그룹, 즉 시스템에 원격으로 액세스해야 하는 사용자에게 공통적으로 적용되는 속성인 대화형 로그온에 대한 제한으로 인해 여러 가지 사소한 장애물에 부딪혔습니다. 그러나 이는 영향을 받은 호스트 시스템에서 원격 페이로드를 다운로드하고 컴파일 및 실행하는 기능에는 영향을 미치지 않았습니다:

리버스 셸 호출에 대한 지속적인 테스트가 수행되었으며, 아래에서 성공적으로 시연되었습니다:

영향 평가

  • 심각도: 이러한 취약점은 논란의 여 지가 있지만 최고 9.9점까지 CVSS 점수가 부여되며, 이는 매우 심각한 심각성을 나타냅니다. CUPS의 광범위한 사용과 이러한 취약점을 원격으로 익스플로잇할 수 있는 기능으로 인해 이는 매우 위험한 문제입니다.
  • 영향을 받는 대상은 누구인가요? 이 취약점은 주요 GNU/Linux 배포판과 영향을 받는 CUPS 구성 요소를 실행하는 ChromeOS 및 BSD와 같은 기타 운영 체제를 포함한 대부분의 UNIX 기반 시스템에 영향을 미칩니다. 공용 또는 네트워크에 노출된 시스템이 특히 위험에 노출되어 있습니다. 추가 지침 및 알림은 패치가 제공되면 공급업체에서 추가 해결 단계와 함께 제공될 가능성이 높습니다. CUPS는 보통 로컬호스트에서 수신하지만, 쇼단 보고서는 75,000개 이상의 CUPS 서비스가 인터넷에 노출되어 있다고 강조합니다.
  • 잠재적 피해: 일단 익스플로잇되면 공격자는 시스템을 제어하여 임의의 명령을 실행할 수 있습니다. 환경에 따라 데이터 유출, 랜섬웨어 설치 또는 기타 악의적인 행위로 이어질 수 있습니다. 공격자가 내부 네트워크 액세스 없이도 이를 악용할 수 있기 때문에 WAN을 통해 프린터에 연결된 시스템은 특히 위험에 노출되어 있습니다.

해결 방법

evilsocket이 강조한 바와 같이 몇 가지 해결 권장 사항이 있습니다.

  • cups-browsed 서비스를 비활성화하고 제거합니다. 예를 들어 Red HatUbuntu의 권장 사항을 참조하세요.
  • CUPS 패키지가 배포에 사용할 수 있는 최신 버전으로 업데이트되었는지 확인하세요.
  • 업데이트가 불가능한 경우 잠재적으로 영향을 받을 수 있는 호스트에서 UDP 포트 631 및 DNS-SD 트래픽을 차단하고 앞서 언급한 권장 사항을 조사하여 호스트의 lp 사용자 및 그룹 구성을 더욱 강화하세요.

탄력적인 보호 기능

이 섹션에서는 현재 공개된 취약점과 관련된 의심스러운 활동을 발견하기 위해 고안된 탐지 및 헌팅 쿼리에 대해 살펴봅니다. 이러한 쿼리는 프로세스 동작과 명령 실행 패턴에 집중함으로써 본격적인 공격으로 확대되기 전에 잠재적인 익스플로잇 시도를 식별하는 데 도움이 됩니다.

컵스드 또는 푸마틱-리프 셸 실행

첫 번째 탐지 규칙은 Linux 시스템에서 foomatic-rip 에서 생성되고 즉시 셸을 실행하는 프로세스를 대상으로 합니다. 정상적인 인쇄 작업에는 셸 실행이 거의 필요하지 않으므로 이러한 동작은 악의적인 활동을 나타내는 강력한 지표가 될 수 있습니다. 참고: 임의의 명령 실행이 가능한 경우 셸이 항상 공격자의 목표가 될 수는 없습니다.

process where host.os.type == "linux" and event.type == "start" and
 event.action == "exec" and process.parent.name == "foomatic-rip" and
 process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") 
 and not process.command_line like ("*/tmp/foomatic-*", "*-sDEVICE=ps2write*")

이 쿼리는 저희가 수행한 모든 33 PoC 시도를 감지할 수 있었습니다:

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/execution_cupsd_foomatic_rip_shell_execution.toml

프린터 사용자(lp) 셸 실행

이 감지 규칙은 기본 프린터 사용자(lp)가 인쇄 프로세스를 처리한다고 가정합니다. 이 사용자를 지정하면 범위를 좁히는 동시에 상위 프로세스 목록을 넓혀 cupsd 을 포함할 수 있습니다. 현재 cupsd 을 통해 RCE가 악용될 수 있다는 징후는 없지만, 가능성을 배제할 수는 없습니다.

process where host.os.type == "linux" and event.type == "start" and
 event.action == "exec" and user.name == "lp" and
 process.parent.name in ("cupsd", "foomatic-rip", "bash", "dash", "sh", 
 "tcsh", "csh", "zsh", "ksh", "fish") and process.name in ("bash", "dash", 
 "sh", "tcsh", "csh", "zsh", "ksh", "fish") and not process.command_line 
 like ("*/tmp/foomatic-*", "*-sDEVICE=ps2write*")

사용자 이름 lp 에 집중하여 범위를 넓혀 이전과 마찬가지로 33 PoC 실행을 모두 탐지했습니다:

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/execution_cupsd_foomatic_rip_lp_user_execution.toml

CUPS 푸마틱 립 차일드를 통한 네트워크 연결

이 규칙은 의심이 가는 행동인 foomatic-rip 의 하위 프로세스에서 시작된 네트워크 연결을 식별합니다. 합법적인 작업에는 일반적으로 아웃바운드 연결을 설정하는 이러한 프로세스가 포함되지 않으므로 탐지된 모든 활동을 면밀히 검토해야 합니다. 사용 중인 환경에서 이러한 통신이 예상되는 경우 불필요한 알림을 피하기 위해 대상 IP를 적절히 제외해야 합니다.

sequence by host.id with maxspan=10s
  [process where host.os.type == "linux" and event.type == "start" 
   and event.action == "exec" and
   process.parent.name == "foomatic-rip" and
   process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish")] 
   by process.entity_id
  [network where host.os.type == "linux" and event.type == "start" and 
   event.action == "connection_attempted"] by process.parent.entity_id

부모/자식 관계를 캡처하여 네트워크 연결이 잠재적으로 손상될 수 있는 애플리케이션에서 시작되는지 확인합니다.

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/command_and_control_cupsd_foomatic_rip_netcon.toml

CUPS 푸마틱-리프 자식에 의한 파일 생성

이 규칙은 푸마틱-rip의 하위 프로세스에서 시작된 의심스러운 파일 생성 이벤트를 탐지합니다. 현재 모든 개념 증명에는 /tmp/ 에 있는 파일에 쓰는 기본 테스트 페이로드가 있으므로 이 규칙은 이를 포착합니다. 또한 공격자가 악성 페이로드를 다운로드한 후 파일을 생성하는 시나리오를 탐지할 수 있습니다.

sequence by host.id with maxspan=10s
  [process where host.os.type == "linux" and event.type == "start" and 
   event.action == "exec" and process.parent.name == "foomatic-rip" and 
   process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish")] by process.entity_id
  [file where host.os.type == "linux" and event.type != "deletion" and
   not (process.name == "gs" and file.path like "/tmp/gs_*")] by process.parent.entity_id

이 규칙은 기본 cupsd 동작을 고려하기 위해 /tmp/gs_* 을 제외하지만, 보안을 강화하려면 알림에 더 많은 노이즈가 발생할 수 있다는 점을 염두에 두고 이 제외를 제거하도록 선택할 수 있습니다.

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/execution_cupsd_foomatic_rip_file_creation.toml

푸마틱-립 또는 컵스드 부모로부터의 의심스러운 실행

이 규칙은 foomatic-ripcupsd 의 하위 프로세스에서 실행되는 의심스러운 명령줄을 탐지합니다. 지속성 메커니즘, 파일 다운로드, 인코딩/디코딩 작업, 리버스 셸, GTFOBins를 통한 공유 객체 로딩 등 잠재적으로 악의적인 활동을 식별하는 데 중점을 둡니다.

process where host.os.type == "linux" and event.type == "start" and 
 event.action == "exec" and process.parent.name in 
 ("foomatic-rip", "cupsd") and process.command_line like (
  // persistence
  "*cron*", "*/etc/rc.local*", "*/dev/tcp/*", "*/etc/init.d*", 
  "*/etc/update-motd.d*", "*/etc/sudoers*",
  "*/etc/profile*", "*autostart*", "*/etc/ssh*", "*/home/*/.ssh/*", 
  "*/root/.ssh*", "*~/.ssh/*", "*udev*", "*/etc/shadow*", "*/etc/passwd*",
    // Downloads
  "*curl*", "*wget*",

  // encoding and decoding
  "*base64 *", "*base32 *", "*xxd *", "*openssl*",

  // reverse connections
  "*GS_ARGS=*", "*/dev/tcp*", "*/dev/udp/*", "*import*pty*spawn*", "*import*subprocess*call*", "*TCPSocket.new*",
  "*TCPSocket.open*", "*io.popen*", "*os.execute*", "*fsockopen*", "*disown*", "*nohup*",

  // SO loads
  "*openssl*-engine*.so*", "*cdll.LoadLibrary*.so*", "*ruby*-e**Fiddle.dlopen*.so*", "*Fiddle.dlopen*.so*",
  "*cdll.LoadLibrary*.so*",

  // misc. suspicious command lines
   "*/etc/ld.so*", "*/dev/shm/*", "*/var/tmp*", "*echo*", "*>>*", "*|*"
)

위의 규칙에서와 같이 명령줄을 예외로 만들면 오탐의 우려 없이 cupsd 부모도 감지하도록 범위를 넓힐 수 있습니다.

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/execution_cupsd_foomatic_rip_suspicious_child_execution.toml

Elastic의 공격 탐색

사전 빌드된 콘텐츠가 게시된 것 외에도, Elastic의 공격 탐색은 사용자 환경의 경보를 분석하고 대규모 언어 모델(LLM)을 활용하여 위협을 식별함으로써 컨텍스트와 인사이트를 제공할 수 있습니다. 다음 예제에서 공격 발견은 활동에 대한 간략한 요약과 타임라인을 제공합니다. 그런 다음 동작을 공격 체인에 매핑하여 영향을 받는 단계를 강조하고 경보를 분류하는 데 도움을 줍니다.

결론

최근 CUPS 취약점 공개는 진화하는 위협 환경을 강조하며 인쇄와 같은 서비스 보안의 중요성을 강조합니다. CVSS 점수가 높은 이 문제는 특히 이러한 결함이 원격으로 얼마나 쉽게 악용될 수 있는지를 고려할 때 즉각적인 조치가 필요합니다. 이 서비스는 일부 UNIX OS(공급망 기반)에 기본적으로 설치되어 있지만 프린터 작업을 트리거하려면 수동 사용자 상호 작용이 필요합니다. 사용자들은 경계를 늦추지 말고 사냥을 계속하며 위험을 과소평가하지 않는 것이 좋습니다. 이 위협은 사용자 상호작용을 요구하지만, 스피어 피싱 문서와 결합하면 피해자가 악성 프린터를 사용하여 인쇄하도록 강요할 수 있습니다. 또는 @evilsocket이 지적한 대로 기존 프린터를 조용히 교체하거나 새 프린터를 설치하는 것이 더 나을 수도 있습니다.

초기 공개는 파트 1로 분류되었기 때문에 더 많은 정보가 공개될 것으로 예상됩니다. 궁극적으로 가시성 및 탐지 기능은 이러한 시스템에 대한 방어 전략의 최전선에서 공격자가 간과한 취약점을 악용할 수 없도록 보장합니다.

주요 참고 자료

이 게시물에서 설명된 기능이나 성능의 출시와 일정은 Elastic의 단독 재량에 따라 결정됩니다. 현재 제공되지 않는 기능이나 성능은 예정된 시간에 출시되지 않을 수도 있으며 아예 제공되지 않을 수도 있습니다.