安全研究

安全漏洞
gmanedit多个缓冲区溢出漏洞

发布日期:2008-09-06
更新日期:2008-09-09

受影响系统:
Gmanedit Gmanedit 0.4.1-1
描述:
BUGTRAQ  ID: 31040

Gmanedit是类似于HTML编辑器的GNOME用户手册编辑器。

Gmanedit中存在多个缓冲区溢出漏洞,在启动向导后如果在手册的标题或名称中输入了超长行的话,或提供了超长的COMMAND=参数,或对编辑器提供了200kb的文件,就可以触发这些溢出,导致执行任意代码。

以下是callbacks.c文件中的有漏洞代码段:

    638         gchar command[50],*datos;
    639         gint exitstatus;
    640
    641 /* I read conf file ~/.gmaneditrc */
    642        
    643         strcpy(temp, "/tmp/gmanedit.XXXXXX");
    644         mkstemp (temp);
    645         datos=ReadConfFromFile("COMMAND");
    646
    647         if (datos==NULL)
    648         {
    ...
    651         }
    652         else
    653         {
    654                 strcpy(command,datos);
    655                 strcat(command," -l ");
    656                 strcat(command,temp);
    657         }      

来自ReadConfFromFile的缓冲区可能超长:

    862 static gchar *ReadConfFromFile(gchar *variable)
    863 {
    864   FILE *f;
    865   gchar readed[100];
    866   gchar *home;
    867   gchar *tok;
    868  
    869 // Intento de abrir el fichero con la configuración personalizada  
    870   home = getenv("HOME");
    871   strcpy(readed,home);
    872   strcat(readed,"/.gmaneditrc");
    ...
    880   while (fgets(readed,80,f) != NULL)
    881   {
    882 // Lo siguiente quita los retornos de carro de las líneas leidas
    883      if (readed[strlen(readed)-1] == '\n')
    884         readed[strlen(readed)-1] = '\0';
    885        
    886      if ((readed[0] != '#') && (!strncmp(variable,readed,strlen(variable))))
    887      {
    888         tok = strtok(readed,"=");
    889         tok = strtok(NULL,"=");
    890         fclose(f);
    891         return(tok);

这个bug的起因是readed处的指针在函数离开后不再有效,但在某些情况下仍可用。由于未经边界检查便滥用了strcpy/strcat,代码中的其他位置也可能存在类似的问题。

在读取用户手册文件时如果将文本转换为utf8,就可能触发缓冲区溢出。

以下是callbacks.c文件中的有漏洞代码段:

   1148 static void open_man_file(gchar *manfile)
   ...
   1156         gchar *utf8;
   1157         gchar * buffer = (gchar*)malloc(BUFFER_SIZE);
   1158
   1159
   ....
   1179         if ((f=gzopen((gchar *)manfile,"rb"))!=NULL)
   1180         {
   1181           while(!gzeof(f))
   1182           {
   1183                 bytes_read=gzread(f,buffer,BUFFER_SIZE);
   1184                 if (bytes_read>0)
   1185                 {
   1186                         utf8 = NULL;
   1187                         if (g_utf8_validate(buffer, -1, NULL) == FALSE)
   1188                         {
   1189                                 utf8 = g_locale_to_utf8(buffer, -1, NULL, NULL, NULL);
   1190                         }
   1191                         if (utf8 != NULL)
   1192                                 strncpy(buffer,utf8,strlen(utf8));
   1193                         gtk_text_buffer_insert_at_cursor(tb, buffer ,bytes_read);

1189行将用户手册缓冲区转换为utf8时,所生成的缓冲区可能大于之前的区域选项缓冲区。1192行的strncpy调用使用strlen(utf8)作为上边界,因此在某些情况下可能出现堆溢出。

<*来源:Fran&ccedil;ois Wendling (frwendling@free.fr
  
  链接:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=497835
*>

建议:
厂商补丁:

Gmanedit
--------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://gmanedit.sourceforge.net/

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