1、引言
在今年的两会上,《政府采购法实施条例》正式实施。虽然安全行业迎来了数据库国产化的春天,但现今Oracle依旧是中国政府机关,使用最广泛的数据库。其安全性受到广泛关注。
Oracle数据库必须使用TNS Listener(数据库监听器)来完成数据库和客户端之间的通讯。因此TNS
Listener的漏洞成了很多黑客的主要目标。这些TNS
Listener的漏洞如果不及时处理,将对用户的信息资产造成重大损失,同时也使许多敏感信息处于危险境地。本文主要对TNS
Listener的漏洞带来的安全威胁和防护措施进行介绍,希望管理者和数据库的维护人员能够提高警惕,加强针对TNS Listener漏洞的防护措施。
2、TNS Listener面临的威胁
根据安华金和数据库安全实验室统计,2001年至2012年间,针对TNS LISTENER的漏洞有15个,其中高危漏洞9个中危漏洞6个。TNS
Listener漏洞总数并不多,但其具备威胁大,跨越数据库版本多,适合通过网络远程攻击的特点。本文将针对这15个TNS漏洞按照攻击原理进行分类,并最终给出对应防护技术。
2.1、TNS Listener 漏洞分类
TNS
Listener作为ORACLE的必备组件,TNS
Listener不仅定义了数据库和客户端之间的通讯协议,更负责对客户端进行身份验证(确认客户端用于通讯的用户名和密码是否合法)。根据TNS这2条主要功能可以把漏洞分成三大类:
第一类漏洞,TNS
Listener被触发缓冲区重写,导致服务器无法响应客户端。造成通讯失败。简单说就是使TNS
Listener崩溃。例如漏洞CVE-2007-5507就是这个类型的代表。
第二类漏洞,绕过TNS身份验证,获得合法数据库账号和密码。这个类型具体可以分三种:
1.通过劫持TNS信息,把oracle的登录信息劫持到攻击者机器,获取敏感信息,甚至获取oracle管理员账号密码。具体请参考安华金和数据库安全实验室发表的《Oracle数据库漏洞隐患无需user/password快速入侵
》一文。
2.直接对在TNS中加密的oracle登录密钥进行破解具体请参考安华金和数据库安全实验室发表《破解oracle9i、oracle10g、oracle11g密码》一文。
3.在远程登陆过程中对服务器进行sql注入。利用某些特殊函数,创建新的数据库账号,并为新账号创建DBA权限。例如漏洞CVE-2006-0552就是这个类型的代表。
第三类漏洞,通过缓冲区溢出控制数据库所在操作系统。这个类型具体可分两种方式:
1.直接通过向TNS
Listener发送含有异常字段的包,当oracle调用含有异常字段的包的时候,触发缓冲区溢出。具体可以参考安华金和数据库安全实验室发表《通过OracleTNS漏洞攻占oracle所在操作系统,进而入侵oracle》一文。
2.向TNS
Listener发送含有异常数据的包,直接触发缓冲区溢出,夺取数据库所在操作系统控制权限。例如漏洞CVE-2002-0965就是这个类型的代表。
其中第三类漏洞在15个漏洞中分布最广泛。下面我们按照类型进行原理介绍。
2.2、TNS Listener服务崩溃漏洞(第一类)
第一类漏洞中的代表是CVE-2007-5507。GIOP格式的消息中的DWORD被用来描述后面的字段的长度。当DWORD被恶意的修改后,如果DWORD所指出的长度比实际的字段的长度要长。TNS
Listener会按照DWORD的数值来分配内存,把实际的字段考入。再读取的时候按照DWPRD的长度去读取,就会导致读取失败。TNS
Listener服务崩溃,无法接受客户端的请求。导致服务器无法响应客户端。
2.3、TNS 劫持(第二类第一种)
该问题几乎存在于Oracle的所有版本,并且Oracle至今仅是发布了警告性通知,并未提供解决方案。TNS劫持的核心点在于监听会按照目标数据库名递送到名称正确的数据库。通过远程注册的方法可以让一个监听下同时存在2个同名数据库(1个黑客的机器1个目标机器)。监听将自动按照负载均衡把每次访问发送到负载低的数据库上,进行连接访问。也就是说有高过一半的几率TNS
Listener有可能把客户端的请求错误的发送到黑客的机器上。黑客的机器再配置listener_name
=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=目标机器IP)(PORT=目标机器端口)))
就可以变成客户端和目标机器的中间站。自己发送信息给目标机器,让目标机器误以为是客户端发送的信息。
2.4、破解TNS默认加密方式(第二类第二种)
虽然11g在登录信息加密上做了较大改善。但算法主体思想还是客户端和数据库分别以Oracle_hash为基础生成S_AUTH_SESSKEY和C_AUTH_SESSKEY。客户端对传过来的S_AUTH_SESSKEY。做AES192解密处理拿到server_sesskey。把server_sesskey和自己的client_sesskey做md5生成combine。用combine生成 AUTH_PASSWORD。服务器端最后用combine对AUTH_PASSWORD解密。对比密码,如果一致登陆成功。所以oracle的默认加密算法基本已经被破。一旦登录包被截获则可能直接被离线暴力破解出用户名和密码。
2.5、远程非法创建新DBA权限用户(第二类第三种)
这种漏洞是利用的协议认证的机制,在Oracle
Database的登录过程时,远程攻击者在登录过程中对服务器进行SQL注入攻击。协议认证由两个步骤组成,包含有两个不同的客户端请求和两个服务器响应。第一个请求仅包含有用户名,而第二个请求包含有用户名和乱码的口令。第二个请求(下图)还包含有"名称-值"对列表,描述客户端的各种属性,其中AUTH_ALTER_SESSION就是这个sql注入的目标。AUTH_ALTER_SESSION的值中可以包含有任意SQL语句。并且AUTH_ALTER_SESSION是以Oracle访问控制机制之外的SYS用户环境执行的,因此通过将AUTH_ALTER_SESSION值改为创建用户语句,并给予新用户DBA权限。简单说就是,攻击者可以通过这类的漏洞创建新的数据库帐号并为帐号创建DBA权限。
2.6通过TNS夺取操作系统(第三类)
通过缓冲区溢出攻占数据库所在操作系统的控制权。以CVE-2002-0965为例,
上图为正常的的会话,CVE-2002-0965就是把上图中的SERVICE_NAME用超过20字节的字符串代替。导致TNS在调RVICE_NAME的时候出现缓冲区溢出,缓冲区溢出后调用写好的shellcode。夺取操作系统权限(具体可以参考安华金和数据库实验室发辫的《windows缓冲区溢出原理(栈)》一文)。
buff
="超过20字节的串"
sploit="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=#{rhost}(PORT=#{rport}))
(CONNECT_DATA=(SERVICE_NAME=#{buff})(CID=(PROGRAM=MSF))))"
上面按照2001年到2012年间15个漏洞,总结了TNS
Listener漏洞主要被利用的5种方式。(类型3的2种子类方式一样,只是缓冲区溢出的用法有差别,这里就不作区分了)
3、TNS Listener漏洞防护技术
TNS
Listener作为oracle的核心组件和安全门户。如果被黑客用上述任何一种方式入侵都很可能产生,类似2013年CSDN公司用户信息大规模泄漏事件。而且由于TNS
Listener位置的特殊性,对TNS Listener的防护手段有别于其他数据库组件的安全防护手段。对TNS
Listener的防护手段主要分为四个层次:
第一层是:通过数据库弱口令扫描产品和定期更换安全密码进行预防。
第二层是:对TNS
Listener进行密码设置防止远程注册被黑客利用。(阻止来自网络的非法注册)
最三层是:通过下载官方补丁或者使用含有VPATH的防火墙产品对已知漏洞进行修复。
最后一层:是通过数据局保险箱对数据库进行全库或者敏感字段加密。保证即便TNS
Listener被攻破,核心数据依旧不会泄露。
3.1、数据库弱口令检查(第一层)
大多数黑客通过TNS
Listener入侵数据库并非因为漏洞,而是通过默认口令、弱口令、撞库等方式。数据库弱口令扫描工具就是专门用来检测oracle的账号口令安全强度。利用探测到的账号以数据库管理员特权身份或其他特权身份进入被扫描的数据库系统,从内部检查数据库的认证、授权与系统完整性等内部配置信息,全面地分析、评估数据库的安全弱点和安全风险。
3.2、定期更换oracle推荐的密码(第一层)
针对第二类第二种,截获通讯包线下暴力破解。虽然这个密码是通过模拟oracle加密的过程算出来的。但是本质上还是需要足够大的密码库进行比对。所以只要定期更换长度和复杂度满足oracle官方要求的密码,就基本可以应付线下暴力破解问题。关键是不要用不满足oracle的密码,和长期不换密码。
3.3、TNS Listener加密(第二层)
虽然TNS
Listener默认是不设置密码的,但是其本身是支持加密的。加密后可以杜绝外来黑客对TNS
Listener进行的非法注册。从根本上杜绝了第二类中的第一种漏洞。
TNS Listener加密方法如下:
LSNRCTL>
start
LSNRCTL> change_password
Old password:
New
password:
Reenter new password:
Connecting to
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test)(PORT=1521)))
Password changed
for listener_demo92
The command completed successfully
LSNRCTL>
save_config
Connecting to
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test)(PORT=1521)))
TNS-01169: The
listener has not recognized the password
LSNRCTL> set password
3.4、下载对应官方补丁包(第三层)
TNS Listener是oracle
的重要组件,所以尽可能第一时间安装Oracle公司会定期地公布的补丁包,这些补丁包也会修复TNS
Listener中存在的漏洞。有些数据库漏洞扫描工具能够扫描出这些缺陷,并提醒用户下载补丁包。当然更为安全的策略,是定期到Oracle官方网站上进行访问,看是否有新的补丁包发布并进行安装。
3.5、数据库防火墙(第三层)
当然有些生产或测试环境因为种种原因无法对数据库进行补丁升级,那么建议在数据库服务器和应用服务器之间加入带有虚拟补丁(可以起到打oracle升级包效果)功能的数据库防火墙产品。这样既不对数据库服务器有任何变化,还同时能阻止黑客使用未修复的TNS
Listener漏洞。数据库防火墙还可以通过设置对SQL语句、客户端IP地址、应用服务请求等进行人为禁止。为数据库搭建可信的安全访问环境。
当数据库防火墙被部署于上图所示的位置的时,将把数据库从整个网络环境中隔离出去。禁止一切对数据库的非法侦测。
3.6、数据库加密(最后一层)
最坏的情况是黑客通过TNS
Listener的漏洞,获取了数据库本地操作系统权限或是数据库DBA权限。批量导出数据库内存储的核心信息。为了保护那些核心信息,我们可以通过数据库保险箱对整个数据库进行加密操作。只要未获取加密时对应的KEY。即便是DBA权限也只能看到的是加密后的乱码无法从中获取有用信息。从源头上保护了数据库中存储的敏感信息。
3.7、小结
本文提供了四个层次的防护手段。这四个层次涵盖了六种应对TNS
Listener安全威胁的防护手段。如果管理者或管理员能把这六种防护手段结合使用,将杜绝TNS Listener带来的安全威胁。
4、结束语
本文分析了TNS Listener漏洞带来的五种安全威胁:TNS
Listener服务崩溃漏洞(第一类)、TNS
劫持(第二类第一种)、破解TNS默认加密方式(第二类第二种)、远程非法创建新DBA权限用户(第二类第三种)、通过TNS夺取操作系统(第三类)。同时提出了四层防护手段:数据库弱口令检查、定期更换oracle推荐的密码、TNS
Listener加密、下载对应官方补丁包、数据库防火墙、数据库加密。当然对TNS
Listener漏洞的安全威胁和防护的研究,需要持续不断地进行下去,更关键的是要不断地普及防护意识和技术,才能有效保护政府部门的信息安全。