CVE:CVE-2008-2080
CNNVD:CNNVD-200805-038
通用数据格式(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行从文件中加载的，因此是可控的。
solution:Upgrade nasa_goddard_space_flight_center common_data_format to a higher version than 3.2,2.0,2.1,2.2,2.3,2.4,2.5,2.6,2.7,3.0,3.1,and avoid the version (,3.2],2.0,2.1,2.2,2.3,2.4,2.5,2.6,2.7,3.0,3.1