cairo是软件开发者Carl Worth和Behdad Esfahbod共同研发的一个跨平台的开源矢量图形函数库,它支持在多个背景下做2D绘图,并提供高质量的显示和打印输出。 Cairo在处理畸形格式的PNG图像时存在漏洞,本地攻击者可能利用此漏洞控制用户系统。 Cairo的cairo-png.c文件的cairo_image_surface_create_from_png()函数支持从PNG图形文件创建新的图形面。该函数会调用read_png()解析输入文件名,然后分配内存容纳所生成的图形面: cairo-png.c: read_png() .. png_get_IHDR (png, info, &png_width, &png_height, &depth, &color_type, &interlace, NULL, NULL); .. pixel_size = 4; data = malloc (png_width * png_height * pixel_size); .. png_width和png_height来自libpng的IHDR,默认下在libpng的pngconf.h中对图形宽度和高度做了如下限制: # define PNG_USER_WIDTH_MAX 1000000L # define PNG_USER_HEIGHT_MAX 1000000L 因此任何小于1000000的宽度和高度都可以通过libpng的限制,在read_png()函数中触发整数溢出。
cairo是软件开发者Carl Worth和Behdad Esfahbod共同研发的一个跨平台的开源矢量图形函数库,它支持在多个背景下做2D绘图,并提供高质量的显示和打印输出。 Cairo在处理畸形格式的PNG图像时存在漏洞,本地攻击者可能利用此漏洞控制用户系统。 Cairo的cairo-png.c文件的cairo_image_surface_create_from_png()函数支持从PNG图形文件创建新的图形面。该函数会调用read_png()解析输入文件名,然后分配内存容纳所生成的图形面: cairo-png.c: read_png() .. png_get_IHDR (png, info, &png_width, &png_height, &depth, &color_type, &interlace, NULL, NULL); .. pixel_size = 4; data = malloc (png_width * png_height * pixel_size); .. png_width和png_height来自libpng的IHDR,默认下在libpng的pngconf.h中对图形宽度和高度做了如下限制: # define PNG_USER_WIDTH_MAX 1000000L # define PNG_USER_HEIGHT_MAX 1000000L 因此任何小于1000000的宽度和高度都可以通过libpng的限制,在read_png()函数中触发整数溢出。