xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
English Version

多个FTP守护程序中的glob()存在漏洞


发布时间:2001-04-11
更新时间:2001-04-11
严重程度:
威胁程度:远程管理员权限
错误类型:设计错误
利用方式:服务器模式

受影响系统
FreeBSD 4.2  CAN-2001-0247
OpenBSD 2.8  
NetBSD 1.5  
IRIX 6.5.x  
HPUX 11  CAN-2001-0248
Solaris 8  CAN-2001-0249
详细描述
大纲

多个FTP服务程序中包含一个漏洞可以导致本地和远程攻击者能获得ROOT权利,
这些漏洞除下面解释的几个要点外依靠远程攻击者是否有能力在运行FTP守护
程序的机器上建立目录而定。这些漏洞都是有关使用glob()函数相关,并可以
分位下面两个类别:

- glob()扩展漏洞

由glob()扩展的用户输入可以超过预定的长度和对缓冲的管理不善而引发的问题。

-glob()实现漏洞

部分glob()函数的实现存在缓冲溢出,这些漏洞可以通过FTP守护程序使用这些有
问题的实现而被利用。

CVE已经为这个漏洞分配了CVE ID号码,见下。

受影响系统:


FreeBSD 4.2  CAN-2001-0247
OpenBSD 2.8  
NetBSD 1.5  
IRIX 6.5.x  
HPUX 11  CAN-2001-0248
Solaris 8  CAN-2001-0249

怎样探测系统是否存在漏洞

CyberCop Scanner (http://www.pgp.com/products/cybercop-scanner/default.asp)
用户可以使用自动更新来下载一个模块来探测这个漏洞,在CyberCop扫描程序执行
更新的时候,它会输出更新文件的MD5 HASK,这个MD5 HASH用来验证升级包文件
的正确性。MD5 HASH文件名是md5hash.txt,见下地址:

ftp://ftp.nai.com/pub/security/ccscanner55/updates/winnt

漏洞描述

glob()能实现文件名样式匹配,起规则类似UNIX SHELL所使用的规则,它是一个
文件名"发生器",接受代表一组文件名的输入样式和返回匹配这样式的可访问
路径名列表。输入样式使用特殊meta字符*?[]{}~'指定,如'/e*'样式指的是所有
目录和在root文件系统里开头带e的文件。

RFC959定义的文件传输协议(FTP),描述了多个带指定文件或者路径的路径名参
数命令,虽然说明中glob()是不需要的,但多数FTP守护程序实现提供服务器端glob
功能来对这些路径名执行类型扩展,虽然有些FTP服务程序依靠libc实现,但实
际上glob()实现通常存在与FTP守护程序自身中。

远程或者本地用户可以提交输入样式给glob()会导致两种类型的安全漏洞

-glob()扩展漏洞

导致FTP守护程序多个漏洞是FTP程序假设从套接口读入的用户输入长度限制了
字符的数目,一般来讲是521字符,这个假设造成了问题所在,因为多数FTP
守护程序包含开头为~的路径名处理解析规则,这个规则原来的意图是使用参考
的home目录来代替~目录内容,但是,由于字符通过glob()函数来执行,而且FTP
程序也扩展任何统配符,这就导致自套接口读入的字符树木超长而产生普遍的
字符串边界没有很好检查的漏洞。

-glob()实现漏洞

部分glob()在外部工具函数中的实现存在缓冲溢出,这些缓冲溢出可以通过请求
一很长的路径名样式引发或者通过运行提交样式并通过运行glob()两次来实现。

详细的信息

-glob()扩展漏洞

如上面提到的,FTP守护程序接受到涉及一带开头为~的文件名请求时,它一般
通过转化代码来获得整个文件名字符串来解析特定的home目录到全路径,在路径
名字符串总扩展其他META字符可以导致超的输入字符串传递到主要命令处理程序,
依据程序怎样处理它们的输入能导致环境缓冲溢出。

在Solaris中,通过LIST命令可以引发堆缓冲溢出。

HPUX在使用STAT命令的时候会导致栈破坏。

-glob()实现漏洞

基于c-shell的扩展代码存在一个缓冲区溢出问题,当一个攻击
者提交一个模式串,比如一些{}后面加上长度超过execbrc()中
所定义的缓冲区长度的字串,就可以引发这种溢出。

BSD的glob()实现中存在4个缓冲溢出,第一个出现在g_opendir()中,会提供
路径名到堆栈中,它使用g_Ctoc函数执行,这个函数会转换16位字符串到8位
字符串,但其操作类似strcpy。类似的溢出发生在g_lstat()和g_stat()中,
第四个漏洞影响在glob0基于堆栈的保留缓冲,类似的也发生在递归函数glob2()
和glob3()中。

注意这些漏洞不需要所提供目录的最后成分是一合法的文件,因此允许不用拥有
建立目录和文件的能力就能完成。在OpenBSD和NetBSD中不许要可写目录而只要
存在有12个字符的目录名就能成功利用。如果目录名长度是9,FREEBSD系统就
可以不拥有写目录的权利就能成功利用漏洞。

测试代码
尚无

解决方案
各个供应商信息

Compaq Computer Corporation
COMPAQ COMPUTER CORPORATION


-----------------------------
x-ref: J Compaq case id - SSRT1-83

在写这个文档的时间段,COMPAQ正在测试Compaq的FTP服务,开始的测试表明
Compaq的ftp服务不存在漏洞。

FreeBSD, Inc.

FreeBSD存在于glob相关的错误,在FreeBSD 5.0-CURRENT和FreeBSD 4.2-STABLE
已经修补了这个漏洞。

Fujitsu

测试了UXP/V版本显示存在漏洞,JPatcher如下所示:

OS Version,PTF level patch ID
-------------------- --------
UXP/V V20L10 X01021  UX28161
UXP/V V20L10 X00091  UX28160
UXP/V V10L20 X01041  UX15527

IBM公司

在AIX版本中不存在此漏洞

NETBSD

NETBSD已经在2001年三月29号发布了此补丁程序。

publicfile

publicfile没有这些漏洞,彻底避免代码正确请看:
http://cr.yp.to/publicfile.html.

SGI

SGI公司承认存在这个漏洞并且正在调查之中。

相关信息
此信息有COVERT Labs at PGP Security 分布http://www.pgp.com/research/covert/advisories/048.asp