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>
暂无评论