Glibc getaddrinfo()栈缓冲区溢出漏洞
发布日期:2016-02-19
CVE ID:CVE-2015-7547
受影响的软件及系统:
====================
Glibc 2.9 - 2.22
未受影响的软件及系统:
======================
Glibc 2.23
综述:
======
Glibc 2.9-2.22的版本中的getaddrinfo()函数存在一个栈缓冲区溢出漏洞,攻击者可以利用此漏洞执行任意代码。
由于Glibc是基础的C运行库,大量应用都可能受此问题影响,建议尽快升级。
分析:
======
glibc是GNU发布的libc库,即c运行库,几乎其它任何运行库都会依赖于glibc。
glibc 2.9-2.22版本的DNS客户端解析器在使用getaddrinfo()库函数时存在一个栈缓冲区漏洞。getaddrinfo()函数使用AF_UNSPEC协议族时,会触发底层解析器代码并行发送2个针对A记录和AAAA记录的查询请求,glibc开始会在栈上分配一个2048字节的缓冲区用来存储DNS请求的应答数据,如果应答数据超过2048字节,将会分配新的堆缓冲区来存储。libnss_dns.so.2中的send_dg(UDP)和send_vc(TCP)函数在缓冲区管理上存在错误,导致超长数据没有被写入新分配的堆缓冲区,而是被写入了2048字节的栈缓冲区,造成缓冲区溢出。攻击者可能导致DNS客户端崩溃或者在DNS客户端所在主机上执行任意代码。
利用此漏洞需要受影响应用调用getaddrinfo()函数,并且攻击者可以控制传递给该函数的恶意域名,攻击者需要伪造一个负责解析恶意域名的DNS服务器。
如果应用会从用户那里获取域名,并调用了getaddrinfo()进行解析,就有可能受此问题影响,造成远程执行代码,例如ssh/sudo/curl等。
解决方法:
==========
* 在防火墙或者本地的DNS解析器中限制DNS响应数据的长度小于2048。
厂商状态:
==========
GNU已经在glibc 2.23的开发版本中修复此漏洞。
目前各大Linux发行版厂商均已修复此漏洞,请尽快进行升级:
RedHat: https://rhn.redhat.com/errata/RHSA-2016-0175.html
Ubuntu:
Debian: https://www.debian.org/security/2016/dsa-3481
CentOS:
https://lists.centos.org/pipermail/centos-announce/2016-February/021668.html
https://lists.centos.org/pipermail/centos-announce/2016-February/021672.html
GNU C Library:
附加信息:
==========
1. https://www.sourceware.org/ml/libc-alpha/2016-02/msg00416.html
2. https://googleonlinesecurity.blogspot.com/2016/02/cve-2015-7547-glibc-getaddrinfo-stack.html
GNU glibc 爆 gethostbyname 缓冲区溢出漏洞