防护方案:BIND DoS漏洞分析
近日,互联网系统协会ISC 发布紧急补丁(CVE-2015-5477),修复隐藏在开源软件BIND中named的严重安全漏洞。远程攻击者通过发起畸形的TKEY查询,可对DNS服务器造成DoS拒绝服务。BIND是目前部署在域名服务器中应用广泛的开源软件之一,支持各种 UNIX 平台和 Windows 平台
声明:昨日BIND 9 DoS漏洞通告发布时,后台数据尚在更新中,导致全球分布数据出错,现已更正。特别感谢 @余弦 同学的反馈。
Content
- BIND漏洞
- 漏洞验证
- 配置ISC BIND服务
- 启动metasploit环境
- 服务崩溃
- 漏洞分析
- dns_tkey_processquery函数
- dns_message_findname函数
- 二次调用dns_message_findname
- 补丁对比
- 防护方案
- 漏洞加固
- 升级BIND 9服务版本
- 安装BIND 9补丁
- 产品防护
- 漏洞加固
内容摘要
7月10日,ISC发现BIND 9可能存在DoS漏洞,开始向CVE申请ID。 1. 7月28日,互联网系统协会ISC发布紧急通告,BIND 9版本可能存在TKEY查询引发的DoS漏洞;
2. 当日,ISC同步发布了BIND 9升级版本修复该漏洞。绿盟科技威胁响应中心获知该信息后,响应工作随即启动;
3. 7月29日,分析工作结束,绿盟科技漏洞库NSVD发布安全漏洞通告,并将信息第一时间通告用户;
4. 8月5日,绿盟科技入侵防护产品NIPS各版本规则升级包就绪,发布分析过程及防护方法。
绿盟科技威胁响应中心持续关注匿名者攻击事件的进展,如果您需要了解更多信息,请联系:
- 绿盟科技威胁响应中心微博
- http://weibo.com/threatresponse
- 绿盟科技微博
- http://weibo.com/nsfocus
- 绿盟科技微信号
BIND漏洞
近日,互联网系统协会ISC发布紧急补丁(CVE-2015-5477),修复隐藏在开源软件BIND中named的严重安全漏洞。远程攻击者通过发起畸形的TKEY查询,可对DNS服务器造成DoS拒绝服务。BIND是目前部署在域名服务器中应用广泛的开源软件之一,支持各种UNIX 平台和Windows 平台。
可能的影响
- 此次漏洞影响BIND的版本较多。截止2015年8月5日,根据绿盟科技广谱平台数据统计显示,全球基于BIND构建的DNS服务大概有123万,其中美国、法国、德国、俄罗斯及中国为受影响稠密区域,中国占比约4.2%。
- 目前该PoC已经在互联网广泛流传,而BIND构建的DNS服务修补速度一般较慢
- 攻击者可能利用这个漏洞瘫痪某个区域的DNS服务器解析,使得大面积用户无法上网
- 攻击者通过瘫痪并伪造一个新的DNS服务器,发起DNS欺骗攻击,诱使用户访问恶意网站
受影响版本
ISC BIND 9.1.0 ->9.8.x,9.9.0 -> 9.9.7-P1,9.10.0 -> 9.10.2-P2
历史情况
近期ISC BIND漏洞较为频繁,大家需要关注相关绿盟科技漏洞库漏洞公告
- 2015-07-10 ISC BIND ‘isselfsigned()’拒绝服务漏洞(CVE-2015-4620)
- 2015-02-27 ISC BIND远程拒绝服务漏洞(CVE-2015-1349) = 2014-12-11 ISC BIND远程拒绝服务漏洞(CVE-2014-8500)
漏洞验证
下面的验证过程是基于ubuntu及BIND – 9.9.5 rc2
配置ISC BIND服务
首先安装BIND 9服务;BIND 9是开源项目,为了能够查看服务崩溃时的堆栈情况及能调试该漏洞,在安装该服务时启动调试模式。安装好后配置named.conf ,rndc.conf等配置文件,启动named.conf中解析地址填写ubuntu的地址如下:
“`
zone “0.8.10.in-addr.arpa” IN { type master; file “/etc/bind/10.8.0.zone”; allow-update { none ; }; };
“`
同时需要配置一个dns域名,比如 www.nsfocus.com
zone “nsfocus.com” IN {
type master;
file “/etc/bind/nsfocus..com.zone”;
allow-update { none; };
};`
完成其他的配置比如10.8.0.zone,127.0.0.zone等配置信息。配置完成后启动该服务。测试是否启动成功,可以采用如下命令行,只要系统返回该域名对应的地址,即确认启动成功。
“` dig www.nsfocus.com *short
“`
启动metasploit环境
在metasploit环境中配置CVE-2015-5477的模块,配置完成后,启动抓包软件,之后启动该模块,如图:
服务崩溃
在所有环境准备好后,启动CVE-2015-5477模块,从运行结果来看,该模块已经正常发起了攻击,并且显示攻击成功:
查看抓取的数据包情况:
从抓包情况来看,metaploit模块发出了一个DNS请求数据包,使用TKEY类型的查询服务。查看服务BIND崩溃后的堆栈情况,如下图:
从BIND9崩溃情况来看,崩溃的函数在dns_messgae_findname中,该函数调用断言函数isc_assertion_failed判断失败,而导致程序崩溃。
漏洞分析
从上图中可知,在metaploit的CVE-2015-5477模块发送一个畸形DNS的TKEY查询请求后,导致BIND9服务在处理畸形数据时调用dns_tkey_processquery -> dns_mssage_findname -> isc_assertion_failed 函数,进而导致程序退出。为了能弄清程序退出的具体原因,需要分析BIND9源码中的dns_tkey_processquery和dns_mssage_findname函数。
dns_tkey_processquery函数
从dns_tkey_processquery名称可知,该函数是对类型为TKEY的dns请求做解析,即对下图中结构做解析:
查看BIND9源码,如下图所示:
从dns_key_processquery函数可知,在函数内部两次调用了dns_message_findname;其中dns_message_findname函数大致意思是根据第二个参数DNS_SECTION_ADDITIONAL查找匹配的第三个参数qname,如果找到就放在第六个参数name中,并将返回结果保存到result中;第一次调用dns_message_findname时,传入的第二个参数是DNS_SECTION_ADDITIONAL,第三个参数查询的字符串,如果找到对应的字符串就放入name中,结合数据包,如图所示:
dns_message_findname函数
继续看看dns_message_findname函数的实现:
看看该函数,函数作用已经说过了。第一次调用时在DNS_SECTION_ADDITIONAL结构中查找和参数qname相同的字符串。
图中标1处:在dns_message_findname函数中先是判断name是否为空,图中标1的位置在第一次调用dns_message_findname之前,name=null,如上图,但是在调用dns_message_findname函数里面,此时的name已经变成了调用之前name的地址,也就是说,参数中的name是调用之前name的地址,所以在dns_message_findname函数内部标1的位置满足条件即name!=NULL,*name==NULL,所以此时在标1处不会出现断言错误。
图中标2处:在运行到图中标2处,函数findname 根据传入的参数在DNS_SECTION_ADDITIONAL结构中查找qname对应的字符串,刚好有该字符串,所以这里返回了成功,也就是ISC_SUCCESSED:。
图中标3处:在运行到图中标3处,测试name!=NULL,*name=foundname,也就是给调用dns_message_findname之前的那个name赋了值。
图中标4处:在运行到图中标4处,通过dns_message_findtype函数查找在DNS_SECTION_ADDITIONAL结构有没有对应的TKEY类型。从下图可以在DNS_SECTION_ADDITIONAL结构中的类型为TXT类型,所以这里会返回错误。
从第一次调用dns_message_findname结果来看,如果queries结构和additional结构中的name字段相同,但是additional结构的type字段只要不是TKEY就会返回错误。
二次调用dns_message_findname
由于第一次调用dns_message_findname函数失败,根据dns_message_findname函数的流程会进入第二次调用dns_message_findname函数如下图所示:
从代码中看出在第一次调用dns_message_findname之前name=NULL,经过上面的分析,在经过第一次调用后name已经赋了值(见图1.1中标3的位置)。那么在第二次进入dns_message_findname函数后,运行到图1.1中标1的位置中时,断言REQUIRE (name == NULL) ;name已经有值,测试的断言就会不成立导致程序退出。
补丁对比
从官方给出的补丁对比来看,在第二次调用dns_message_findname之前再次将name置空,这样在第二次运行断言语句时*name=NULL,也就不会出现崩溃的现象。
漏洞检测
此漏洞的检测方式可以使云端扫描、产品检测等。如果用户使用业务中已经部署了相关的漏洞扫描系统,请将漏洞扫描系统升级到最新版本后,尽快开始对业务系统进行扫描,尤其是受此次BIND漏洞影响的业务系统平台进行一次漏洞扫描。以绿盟远程安全评估系统(NSFOCUS Remote Security Assessment System ,简称:NSFOCUS RSAS)为例,当您部署该产品后,请先对产品进行升级:
- RSAS v6系列产品升级到系统插件版本V6.0R02F00.0118;
- RSAS v5系列产品升级到系统版本为051367;
- AAS系列产品升级到系统版本为051147
- 绿盟工控漏洞扫描系统V6.0R00F02.0118 及V5051367
- 产品升级链接: http://update.nsfocus.com/aurora/index.html
漏洞确认
如果漏洞扫描结果中出现下图的漏洞信息,即可确认当前环境中存在该漏洞,建议您尽快修复或制定防护计划,以免遭受攻击。
防护方案
在了解漏洞成因之后,那么防护工作也就知道该如何做了。参考上面的信息,大家需要尽快制定并启动应对方案,包括漏洞加固、DDoS防护、应用防护,最后我们还提供了一套解决方案,以便用户可以进行整体防护体系的搭建。
漏洞加固
升级BIND 9服务版本
ISC 已经在下列版本中修复了此安全漏洞,BIND 9.9.7-P2 及BIND 9.10.2-P3。如果条件允许,建议尽快升级BIND 9的版本。官方下载地址在: http://www.isc.org/downloads/同时,各大主流Linux发行版也已经提供了相应安全补丁。
安装BIND 9补丁
如果您的业务环境暂时无法升级服务版本,那么可以考虑对现有版本安装补丁。您可以在ISC官方网站中找到本次漏洞的说明,可以获取到最新的补丁下载,请尽快安装相关补丁。官方补丁: https://kb.isc.org/article/AA-01272
产品防护
如同木桶效应一般,业务环境的加固只是依赖于漏洞加固是不够的,整体安全等级的提升以及应对未来的攻击,安全产品是必不可少的一环。在如下部署环境中,以绿盟网络入侵防护系统(Network Intrusion Prevention System,简称NIPS)为例,对业务系统部署NIPS,可以提供BIND DoS漏洞攻击防护。
目前NIPS已经推出567、568、569各版本的规则升级包,请所有使用绿盟产品的用户尽快升级产品规则。绿盟科技已在软件升级公告中提供规则升级包,规则可以通过产品界面的在线升级进行。如果您的业务系统暂时还无法升级规则包,那么可以在软件升级页面中,找到对应的产品,通过下载升级包,以离线方式进行升级。
相关升级信息请访问:
威胁情报
威胁情报的获取及响应都体现了防御能力的建设程度,威胁情报服务体系至少包含了威胁监测及响应、数据分析及整理、业务情报及交付、风险评估及咨询、安全托管及应用等各个方面,涉及研究、产品、服务、运营及营销的各个环节,绿盟科技通过研究、云端、产品、服务等立体的应急响应体系,向企业和组织及时提供威胁情报,并持续对对匿名者攻击事件进行关注,保障客户业务的顺畅运行。
如果您对我们提供的内容有任何疑问,或者需要了解更多的信息,可以随时通过在微博、微信中搜索绿盟科技联系我们,欢迎您的垂询!
关于绿盟科技
北京神州绿盟信息安全科技股份有限公司(简称 绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。
基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。
北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。