BUGTRAQ ID: 29045
CVE(CAN) ID: CVE-2008-2080
通用数据格式(CDF)是由NASA戈达德航天飞行中心开发的用于存储和操控标量和多维数据的数据格式。
CDF库在打开无效的CDF输入文件时存在栈溢出漏洞,允许攻击者在使用该库的应用程序环境中执行任意指令或导致整个应用程序崩溃。
漏洞存在于src/lib/cdfread64.c文件的以下代码中。Read32s_64函数将数据从文件读取到缓冲区,temp缓冲区大小为MAX_READ32s,但没有检查count参数,因此大于MAX_READ32s的参数可能会触发栈溢出。
/-----------
57 STATICforIDL Logical Read32s_64 (fp, buffer, count)
58 vFILE *fp;
59 Int32 buffer;
60 int count;
61 {
62 #if defined(NETWORKbyteORDERcpu)
63 if (count < 1) return TRUE;
64 if (!READv64(buffer,(size_t)4,(size_t)count,fp)) return FALSE;
65 #else
66 #define MAX_READ32s CDF_MAX_DIMS / This must be the maximum of
67 CDF_MAX_DIMS and
MAX_VXR_ENTRIES
68 (and for any other uses of
69 `Read32s’). */
70 int i; Int32 temp[MAX_READ32s];
71 if (count < 1) return TRUE;
72 if (!READv64(temp,(size_t)4,(size_t)count,fp)) return FALSE;
ReadGDR64还在src/lib/cdfread64.c调用了Read32s_64函数:
/-----------
256 #if defined(STDARG)
257 STATICforIDL CDFstatus ReadGDR64 (vFILE *fp, OFF_T offset, …)
258 #else
259 STATICforIDL CDFstatus ReadGDR64 (va_alist)
260 va_dcl
261 #endif
262 {
.
.
.
301 if (!Read32_64(fp,&(fp->GDR64->rNumDims))) return CRE;
302 if (!Read32_64(fp,&(fp->GDR64->NzVars))) return CRE;
303 if (!Read64_64(fp,&(fp->GDR64->UIRhead))) return CRE;
304 if (!Read32_64(fp,&(fp->GDR64->rfuC))) return CRE;
305 if (!Read32_64(fp,&(fp->GDR64->rfuD))) return CRE;
306 if (!Read32_64(fp,&(fp->GDR64->rfuE))) return CRE;
307 if (!Read32s_64(fp,fp->GDR64->rDimSizes,
308 (int)fp->GDR64->rNumDims)) return CRE;
在307行使用fp->GDR64->rNumDims变量作为count参数调用了有漏洞的函数。由于这个变量是在301行从文件中加载的,因此是可控的。
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
<a href=“http://cdf.gsfc.nasa.gov/index.html” target=“_blank”>http://cdf.gsfc.nasa.gov/index.html</a>
http://www.coresecurity.com/?action=item&id=2260