gmanedit多个缓冲区溢出漏洞

2008-09-12T00:00:00
ID SSV:4033
Type seebug
Reporter Root
Modified 2008-09-12T00:00:00

Description

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)作为上边界,因此在某些情况下可能出现堆溢出。

Gmanedit 0.4.1-1 Gmanedit


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

<a href=http://gmanedit.sourceforge.net/ target=_blank>http://gmanedit.sourceforge.net/</a>