FreeBSD OPIE实现__opiereadrec()函数单字节栈溢出漏洞

2010-05-31T00:00:00
ID SSV:19715
Type seebug
Reporter Root
Modified 2010-05-31T00:00:00

Description

BUGTRAQ ID: 40403 CVE ID: CVE-2010-1938

FreeBSD就是一种运行在Intel平台上、可以自由使用的开放源码Unix类系统。

FreeBSD所使用的OPIE认证系统中readrec.c文件的__opiereadrec()函数存在单字节栈溢出漏洞,在启用了栈保护的情况下,攻击者可以远程导致使用OPIE的服务进程崩溃。以下是有漏洞的代码段:

"/src/contrib/opie/opie.h" / Maximum length of a principal (read: user name) /

define OPIE_PRINCIPAL_MAX 32

"./src/contrib/opie/libopie/readrec.c" int __opiereadrec FUNCTION((opie), struct opie opie) { ... ... { char c, principal[OPIE_PRINCIPAL_MAX]; int i;

if (c = strchr(opie->opie_principal, ':'))
  *c = 0;

[1] if (strlen(opie->opie_principal) > OPIE_PRINCIPAL_MAX) [2] (opie->opie_principal)[OPIE_PRINCIPAL_MAX] = 0;

[3] strcpy(principal, opie->opie_principal); ... ... } ... ... ret: if (f) fclose(f); return rval; }

[1]处函数检查受控变量opie->opie_principal的长度。如果长度大于OPIE_PRINCIPAL_MAX(32字节),程序就会在这个位置写入空字节。实际上字符串确实为32字节长。

漏洞出现在[3]。strcpy()将最多可为32字节的受控变量拷贝到了也为32字节长的principal缓冲区中,但由于strcpy()在拷贝了 32字节后还要向字符串末尾添加一个空字节,因此可以触发单字节溢出。越界发生在*(principal+32)位置。

FreeBSD 8.0 FreeBSD 7.3 FreeBSD 7.2 FreeBSD 7.1 FreeBSD 6.4 厂商补丁:

FreeBSD

FreeBSD已经为此发布了一个安全公告(FreeBSD-SA-10:05)以及相应补丁: FreeBSD-SA-10:05:OPIE off-by-one stack overflow 链接:ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-10:05.opie.asc

补丁下载:

执行以下步骤之一;

1) 将有漏洞的系统升级到6-STABLE、7-STABLE或8-STABLE,,或修改日期之后的RELENG_8_0、RELENG_7_3或 RELENG_7_2、RELENG_7_1、RELENG_6_4安全版本。

2) 如果要通过源码路径升级有漏洞的系统:

以下补丁确认可应用于FreeBSD 6.4、7.1、7.2、7.3和8.0系统。

a) 从以下位置下载相关补丁,并使用PGP工具验证附带的PGP签名。

fetch http://security.FreeBSD.org/patches/SA-10-05/opie.patch

fetch http://security.FreeBSD.org/patches/SA-10-05/opie.patch.asc

b) 以root执行以下命令:

cd /usr/src

patch < /path/to/patch

cd /usr/src/lib/libopie

make obj && make depend && make && make install

3) 如果要通过二进制补丁升级有漏洞的系统:

freebsd-update fetch

freebsd-update install

                                        
                                            
                                                Connected to localhost.
Escape character is '^]'.
220 127.cx FTP server (Version 6.00LS) ready.
user cx
331 Password required for cx.
user AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Connection closed by foreign host.
127#