ravynsoft / ravynos

A BSD-based OS project that aims to provide source and binary compatibility with macOS® and a similar user experience.
https://www.ravynos.com
Other
5.68k stars 192 forks source link

Heap Buffer Overflow in Onyx2D - stbi_jpeg_load_from_memory #438

Open francobel opened 4 months ago

francobel commented 4 months ago

The vulnerable function stbi_jpeg_load_from_memory in file O2ImageDecoder_JPEG_libjpeg.m is used to decompress jpegs and create a raw bitmap version of the image.

In stbi_jpeg_load_from_memory, the values for cinfo.image_width and cinfo.image_height are retrieved directly from a jpeg file's header.

cinfo.image_width and cinfo.image_height can be manipulated by editing the header of the jpeg file being processed. They are two bytes each in the image's header so their values can range from 0x0000 to 0xFFFF. These variables are multiplied by wantedPixelSize which has a value of 4.

When these three values are multiplied together they can exceed the limit of a 32-bit unsigned integer, leading to an integer overflow vulnerability. This product is used to set the size of the outputImage buffer, which will store the decompressed jpeg. When the sizing arguments overflow, the buffer becomes too small to store the decompressed data.

The program writes the decompressed image to the buffer using the jpeg_read_scanlines function. If an integer overflow occurs, the function ends up writing to out-of-bounds memory due to the buffer's small size. This causes data in memory adjacent to the buffer to be overwritten.

An attacker is in control of the image's height, width, and contents. This allows an attacker to craft an exploit to overwrite data in memory with data they control.

mszoek commented 3 months ago

Thanks for the report! Is there a recommended fix for this, or should I just add a check for the buffer size before decompressing?