중요 보안 결함: glibc의 getaddrinfo() 함수에서 발생하는 스택 버퍼 오버플로우 취약점 (CVE-2015-7547)
glibc 패키지에 있는 표준 라이브러리는 시스템의 여러 프로그램에서 사용됩니다. 디스크 및 메모리 공간을 절약하고 쉽게 업그레이드할 수 있도록 하기 위해 일반적인 시스템 코드가 하나의 장소에 보관되어 프로그램 간에 공유됩니다. 이 패키지에는 모든 GNU/Linux 프로그램들이 연결에 사용하는 표준 C 라이브러리가 들어 있습니다. glibc과 함께 제공되는 libresolv 라이브러리는 호스트 이름과 IP 주소 간의 변환에 사용되는 함수를 제공합니다. nss_dns는 glibc 구성 요소로 DNS 검색을 수행하기 위해 libresolv를 사용하는 NSS (Name Service Switch) 서비스 모듈을 제공합니다.
배경 정보
스택 기반 버퍼 오버플로우는 libresolv에 있는 듀얼 A/AAAA DNS 쿼리를 수행하는 코드에서 발견되었습니다. 원격 공격자가 특수하게 조작된 DNS 응답을 만들어 libresolv를 중단하거나 library를 실행하는 사용자의 권한으로 잠재적으로 코드를 실행할 수 있습니다. 버퍼 오퍼플로우는 libresolv에 있는 send_dg (UDP 쿼리의 경우) 및 send_vc (TCP 쿼리의 경우) 함수에서 발생합니다. 이 문제는 libresolv가 nss_dns NSS 서비스 모듈에서 호출될 때에만 발생합니다. 본 결함은 CVE-2015-7547에 지정되어 있습니다.
AF_UNSPEC 주소 체계로 getaddrinfo를 호출하는 애플리케이션이 영향을 받게 되며 Red Hat Enterprise Linux 6.4에서는 AF_INET6 주소 체계를 사용하는 애플리케이션의 경우도 영향을 받게 됩니다. 기존 gethostbyname 함수 또는 res_search (getaddrinfo이 아닌)와 같은 libresolv 함수를 사용하는 애플리케이션은 영향을 받지 않습니다.
본 결함은 Red Hat Enterprise Linux 5 또는 이전 버전에 탑재된 glibc 버전에는 영향을 미치지 않습니다. 이는 Red Hat Enterprise Linux 6 및 7에 탑재된 glibc 버전에 영향을 미칩니다.
영향
Red Hat 제품 보안팀은 이러한 문제를 심각한 영향을 미치는 것으로 평가하고 있습니다.
완화 방법
기본 libresolv 설정에서 UDP 기반 벡터는 신뢰할 수 있는 네트워크에서 신뢰할 수 있는 프로토콜을 준수하는 DNS 리졸버를 사용하여 완화될 수 있습니다. 올바른 리졸버는 glibc 리졸버가 기본값으로 EDNS0를 사용하지 않고 대용량 응답을 요청하지 않기 때문에 이러한 취약점을 악용하는데 필요한 대용량 응답을 생산하지 않습니다.
TCP 기반 벡터는 개별 DNS 응답 크기를 1023 바이트 이하로 제한하는 신뢰할 수 있는 네트워크 상의 신뢰할 수 있는 재귀 리졸버에 의해 완화될 수 있습니다. 하지만 이러한 기능은 DNS 프로토콜을 파괴할 수 있기 때문에 일반적인 DNS 리졸버 구현이 아닙니다. (대부분의 리졸버에 의해 제공되는 버퍼 크기 설정 옵션은 TCP가 아닌 UDP에만 적용됩니다.) 응답 크기를 제한하지 않고 AAAA 응답을 거부하는 것도 취약점을 완화시킬 수 없습니다.
시스템에서 IPv6가 지원되지 않더라도 듀얼 A/AAAA 검색은 수행되기 때문에 영향을 받는 시스템에서 IPv6 지원을 비활성화하는 것으로 취약점을 완화할 수 없습니다.
영향을 받는 제품 및 해결 방법
Red Hat Enterprise Linux 6 및 7에 포함된 모든 glibc 패키지 버전은 이러한 취약점의 영향을 받습니다. 아래 표에서 이러한 문제를 해결하기 위한 각 보안 권고 관련 링크를 참조하십시오:
해결 방법
제품 | 권고 |
---|---|
Red Hat Enterprise Linux 6 | RHSA-2016:0175 |
Red Hat Enterprise Linux 7 | RHSA-2016:0176 |
Red Hat Enterprise Linux 6.2 Advanced Update Support | RHSA-2016:0225 |
Red Hat Enterprise Linux 6.4 Advanced Update Support | RHSA-2016:0225 |
Red Hat Enterprise Linux 6.5 Advanced Update Support | RHSA-2016:0225 |
Red Hat Enterprise Linux 6.6 Extended Update Support | RHSA-2016:0225 |
Red Hat Enterprise Linux 7.1 Extended Update Support | RHSA-2016:0225 |
업데이트를 적용한 후 시스템을 다시 부팅하거나 영향을 받는 모든 서비스를 다시 시작해야 합니다:
본 취약점은 시스템에 있는 수많은 애플리케이션에 영향을 미치므로 모든 애플리케이션의 보안을 위한 가장 안전하고 권장되는 방법은 업데이트된 glibc 패키지를 사용하고 시스템을 다시 시작하는 것입니다.
업데이트를 적용한 후 전체 시스템을 다시 시작할 수 없는 경우 다음 명령을 실행하여 시스템에서 [메모리내] 이전 glibc 버전을 사용하고 있는 모든 실행 중인 프로세스 (서비스로 제한하지 않음) 목록을 확인할 수 있습니다.
lsof +c0 -d DEL | awk 'NR==1 || /libc-/ {print $2,$1,$4,$NF}' | column -t
결과 목록에서 외부에 노출되는 서비스를 확인하고 이를 다시 시작합니다. 이러한 방법은 임시적인 해결 방법으로 사용할 수 있지만 Red Hat 에 의해 지원되지 않으며 문제가 야기될 경우 문제 해결 시도 전에 시스템을 재부팅하도록 요청받게 됩니다.
FAQ
1. SELinux는 이러한 보안 결함을 차단합니까?
적절한 SELinux 정책에 공격자가 공격할 수 있는 일부 시스템 손상을 포함시키고 공격자에 대한 시스템 액세스를 제한할 수 있지만 DNS는 수 많은 애플리케이션 및 시스템 구성 요소에 사용되므로 SELinux 정책은 이러한 문제에 대해 제한된 제약만을 제공합니다.
2. 신뢰할 수 있는 DNS 리졸버는 이러한 문제에 대한 보안을 제공할 수 있습니까?
기본값으로 프로토콜 준수 설정의 신뢰할 수 있는 리졸버는 잠재적 공격에 구문적으로 잘 구성된 DNS 응답이 포함될 수 있기 때문에 이러한 문제를 완화시킬 수 없습니다.
3. 정적으로 링크된 바이너리는 이러한 결함으로 인해 영향을 받습니까?
Red Hat은 glibc의 정적 링크를 지원하지 않습니다. 하지만 고객이 glibc-static
패키지를 사용하여 정적으로 링크된 애플리케이션을 구축한 경우 이 애플리케이션은 nss_dns 및 libresolv의 시스템 복사본을 사용하므로 업데이트된 glibc 패키지 설치로 이러한 취약점을 해결할 수 있습니다.
감사의 글
본 취약점은 Google 보안 팀 및 Red Hat에 의해 발견되었습니다.
Comments