安全研究

安全漏洞
NASA Common Data Format多个缓冲区溢出漏洞

发布日期:2009-07-21
更新日期:2009-07-22

受影响系统:
NASA CDF 3.2.4
不受影响系统:
NASA CDF 3.3
描述:
BUGTRAQ  ID: 35754
CVE(CAN) ID: CVE-2009-2850

通用数据格式(CDF)是由NASA戈达德航天飞行中心开发的用于存储和操控标量和多维数据的数据格式。

CDF库的ReadAEDRList64()函数中用于从CDF文件中读取属性项的列表,属性项存储在了由条目编号索引的列表中。相关的代码如下:

./cdf32_1-dist/src/lib/cdfread64.c:
------------------------------------------------
STATICforIDL CDFstatus ReadAEDRList64 (vFILE *fp,
                                         struct AEDRstructExt64 ***AEDRList,
                                         OFF_T AEDRHead,
                                         Int32 MaxEntry)
{
...
  struct AEDRstructExt64 *TempAEDR;
  Int32 LastAEDRNum = -1;
  Int32 i;
  OFF_T temp;
...
[1]      *AEDRList = cdf_AllocateMemory((MaxEntry + 1) *
                                 sizeof(struct AEDRstructExt64**), NULL);
....
  while (NxtAEDR != 0 && LastAEDRNum != MaxEntry)
  {
[2]   TempAEDR = cdf_AllocateMemory(sizeof(struct AEDRstructExt64), NULL);
...
[3]    if (!Read32_64(fp,&(TempAEDR->AEDR.Num))) return CRE;
...
[4]    (*AEDRList)[TempAEDR->AEDR.Num] = TempAEDR;
  }
  return pStatus;
}
-------------------------------------------------------------------------

[1]处代码创建一个分配在堆上分配给AEDRList变量的AEDRstructExt64结构数组,TempAEDR结构([2])也分配在了堆上,之后在while()循环中使用从所解析的CDF文件中读取属性。

Read32_64()函数([3])用于从CDF文件流读取整数并将其存储在TempAEDR->AEDR.Num中,在[4]处这个值用作了指定AEDRList中存储TempAEDR结构地址的索引。由于没有对TempAEDR->AEDR.Num值执行过滤检查,如果CDF文件中包含有大于所分配AEDRList项数目的值,就可以覆盖AEDRList数组后的任意堆数据,所写入的值是TempAEDR结构的地址。这可以被进一步利用,因为攻击者可以控制TempAEDR结构的内容,嵌入恶意代码。

由于TempAEDR->AEDR.Num被用作了索引,攻击者可以向高于AEDRList的地址写入4个字节。这个索引被添加到了AEDRList地址,因此攻击者还可以通过指定很大的值在加法运算中覆盖整数,有效的写入到进程所映射的任意地址。

此外SearchForRecord_r_64()、LastRecord64()、CDFsel64()等函数中还存在其他一些溢出。

<*来源:Leon Juranic (ljuranic@LSS.hr
  
  链接:http://secunia.com/advisories/35940/
        http://marc.info/?l=bugtraq&m=124818819410578&w=2
*>

建议:
厂商补丁:

NASA
----
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://cdf.gsfc.nasa.gov/html/CDF_v330.html

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