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...
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>