리눅스 서비스 중단 (Denial of Service) 을 야기시키는 systemd 취약점 발견

게시일: 2017-12-15 l 작성자: Trend Micro

많은 리눅스 배포판이 최근 systemd 에서 발견된 결함으로 위험에 노출되어 있다는 사실이 밝혀졌습니다. DNS Resolver 의 결함은 취약한 시스템에 대한 DoS (Denial-of-service) 서비스 거부 공격을 유발할 수 있습니다. 이 취약점은 취약한 시스템이 공격자가 제어하는 DNS 서버에 DNS 쿼리를 전송함으로써 악용됩니다. 그런 다음 DNS 서버는 조작된 쿼리를 다시 돌려보내어 systemd 를 무한루프로 실행되도록 하여 시스템의 CPU 사용량이 100% 가 되도록 만듭니다. 해당 취약점은 CVE-2017-15908 입니다.

사용자가 공격자의 제어 하에 DNS 서버를 쿼리하도록 하는 방법은 여러 가지가 있지만, 멀웨어 또는 소셜 엔지니어링을 사용하여 사용자 시스템이 공격자가 제어하는 도메인을 방문하도록 하는 것이 가장 쉬운 방법입니다.

취약점에 대한 가장 효과적인 대책은 systemd 에 있는 결함에 패치를 적용하는 것 입니다. 트렌드마이크로는 처음 이 취약점을 올해 7월에 발견하여 ZDI (Zero-Day Initiative) 를 통해 해당 벤더에 보고하였습니다. 다른 연구원들 또한 같은 취약점을 올해 10월에 발견하여 Canonical 에 보고하였습니다. 이에 따라 10월 말 Ubuntu 와 같은 다양한 리눅스 배포판에 수정 사항이 적용되었으며, 다행스럽게도 현재까지 이 취약점에 대한 공격은 알려진 바가 없습니다.

취약점 분석

시간이 지남에 따라 DNS 에 새로운 기능 및 특성이 추가되어 더 안전하게 발전하고 있습니다. RFC 4034에 정의된 NSEC (Next Secure) 레코드는 DNS Security Extensions (DNSSEC) 에 추가된 새로운 유형의 리소스 레코드 중 하나입니다.

취약점은 NSEC bitmap 에서 pseudo-type 을 표현하는 비트를 처리하는 과정에서 발생합니다. 아래 이미지를 통해 코드 섹션과 스택 프레임을 확인하실 수 있습니다. 강조 처리된 라인 “continue” 는 “while loop” 가 무한루프에 진입하는 위치를 보여줍니다. dns_packet_read_type_window() 는 resolved-dns-packet.c 파일 내에서 구현됩니다.


그림 1. 무한루트와 스택프레임 소스코드

위의 함수 dns_packet_read_type_window() 는 레코드 타임에 DNS_TYPE_NSEC 일때 dns_packet_read_rr() 로부터 호출됩니다. 아래 이미지를 통해 resolved-dns-packet.c 파일 내에 있는 dns_packet_read_rr() 의 코드 섹션을 확인하실 수 있습니다.


그림 2. DNS packets reading 소스코드

실험

취약점을 테스트 하기 위해 자체적으로 DNS 서버를 만들어 악성 형태의 응답을 보내도록 설정했습니다. 악성 응답에는 아래 그림에서 보이는 것처럼 취약점을 유발하도록 설계된 NSEC 레코드가 포함되어 있습니다.


그림 3. 특별 제작된 DNS 응답의 패킷 캡쳐

systemd 를 실행하는 시스템이 DNS 확인을 위해 시스템을 사용하면 특별 제작된 DNS 패킷을 받게 되며, 아래에 보이는 것처럼 CPU 사용률은 100% 가 됩니다.


그림 4. 최대 CPU 사용률

대응방법

서두에 언급된 바와 같이 해당 취약점에 대한 수정이 배포되었음으로, 가능한 한 빨리 보유한 시스템에 적용하는 것이 좋습니다.

시스템 관리자는 악성 패킷을 차단하도록 수동으로 설정할 수 있습니다. 유입되어 들어오는 DNS 응답은 RFC 4034 의 Section 4에 지정된 대로 리소스 레코드가 포함되어 있는지 확인해야합니다.

들어오는 DNS 응답 트래픽을 모니터링하고 응답 섹션의 DNS RR 에 DNS 및 NSEC RR 을 정의하는 RFC 4034 Section 4에 지정된 타입의 레코드가 포함되어 있는지 검색합니다. 또한 첨부된 bitmap 이 처리되고 pseudo-types 가 포함되어 있다면 차단해야 합니다.

[원문: systemd Vulnerability Leads to Denial of Service on Linux]