|
|
Message-ID: <CANMVOuyFeA7z+LyzQ44MY8TCdDyw9_YRLcW35UguOhjre-6MwA@mail.gmail.com>
Date: Sat, 28 Feb 2015 14:13:48 -0600
From: Brian Carpenter <brian.carpenter@...il.com>
To: oss-security@...ts.openwall.com
Subject: CVE request: pngcrush 1.7.83 crash bug (most likely exploitable)
Good afternoon, I found a crash bug in pngcrush that is most likely
exploitable and wanted to get a CVE assignment for it. I've already been in
contact with the pngcrush author and this bug has been fixed in pngcrush
v1.7.84 (which was released today, no mention of this in the changelog
though: http://sourceforge.net/p/pmt/news/2015/02/pngcrush-1784-released/).
It was found with AFL (http://lcamtuf.coredump.cx/afl) and I compiled
pngcrush as follows:
Edited Makefile to point to afl-gcc binary then ran AFL_HARDEN=1 make -j12.
Command line: ./pngcrush -fix -force test203 /dev/null
Debian 7, Kernel 2.13-38+deb7u7, GCC 4.9.2, pngcrush 1.7.83, uses libpng
1.6.16 and zlib 1.2.8
Here is the Valgrind output:
| pngcrush 1.7.83
| Copyright (C) 1998-2002, 2006-2015 Glenn Randers-Pehrson
| Portions copyright (C) 2005 Greg Roelofs
| This is a free, open-source program. Permission is irrevocably
| granted to everyone to use this version of pngcrush without
| payment of any fee.
| Executable name is pngcrush
| It was built with libpng version 1.6.16, and is
| running with libpng version 1.6.16 - December 22, 2014
Reading 0000 chunk.
==24444== Invalid write of size 1
==24444== at 0x440B4C: pngcrush_measure_idat (pngcrush.c:7407)
==24444== by 0x441674: measure_idats (pngcrush.c:7341)
==24444== by 0x4035CB: main (pngcrush.c:4302)
==24444== Address 0x7feffeadf is just below the stack ptr. To suppress,
use: --workaround-gcc296-bugs=yes
==24444==
==24444== Invalid write of size 1
==24444== at 0x440B4F: pngcrush_measure_idat (pngcrush.c:7407)
==24444== by 0x441674: measure_idats (pngcrush.c:7341)
==24444== by 0x4035CB: main (pngcrush.c:4302)
==24444== Address 0x7feffeade is just below the stack ptr. To suppress,
use: --workaround-gcc296-bugs=yes
==24444==
==24444== Invalid write of size 1
==24444== at 0x440B57: pngcrush_measure_idat (pngcrush.c:7407)
==24444== by 0x441674: measure_idats (pngcrush.c:7341)
==24444== by 0x4035CB: main (pngcrush.c:4302)
==24444== Address 0x7feffeadd is just below the stack ptr. To suppress,
use: --workaround-gcc296-bugs=yes
==24444==
==24444== Invalid write of size 1
==24444== at 0x440B5B: pngcrush_measure_idat (pngcrush.c:7407)
==24444== by 0x441674: measure_idats (pngcrush.c:7341)
==24444== by 0x4035CB: main (pngcrush.c:4302)
==24444== Address 0x7feffeadc is just below the stack ptr. To suppress,
use: --workaround-gcc296-bugs=yes
==24444==
==24444== Invalid write of size 1
==24444== at 0x440B5F: pngcrush_measure_idat (pngcrush.c:7407)
==24444== by 0x441674: measure_idats (pngcrush.c:7341)
==24444== by 0x4035CB: main (pngcrush.c:4302)
==24444== Address 0x7feffeadb is just below the stack ptr. To suppress,
use: --workaround-gcc296-bugs=yes
==24444==
==24444== Invalid write of size 1
==24444== at 0x440B63: pngcrush_measure_idat (pngcrush.c:7407)
==24444== by 0x441674: measure_idats (pngcrush.c:7341)
==24444== by 0x4035CB: main (pngcrush.c:4302)
==24444== Address 0x7feffeada is just below the stack ptr. To suppress,
use: --workaround-gcc296-bugs=yes
==24444==
==24444== Invalid write of size 1
==24444== at 0x440B67: pngcrush_measure_idat (pngcrush.c:7407)
==24444== by 0x441674: measure_idats (pngcrush.c:7341)
==24444== by 0x4035CB: main (pngcrush.c:4302)
==24444== Address 0x7feffead9 is just below the stack ptr. To suppress,
use: --workaround-gcc296-bugs=yes
==24444==
==24444== Invalid write of size 1
==24444== at 0x440B6B: pngcrush_measure_idat (pngcrush.c:7407)
==24444== by 0x441674: measure_idats (pngcrush.c:7341)
==24444== by 0x4035CB: main (pngcrush.c:4302)
==24444== Address 0x7feffead8 is just below the stack ptr. To suppress,
use: --workaround-gcc296-bugs=yes
==24444==
==24444==
==24444== Process terminating with default action of signal 11 (SIGSEGV):
dumping core
==24444== Access not within mapped region at address 0x7FEFFAFFF
==24444== at 0x440B4C: pngcrush_measure_idat (pngcrush.c:7407)
==24444== by 0x441674: measure_idats (pngcrush.c:7341)
==24444== by 0x4035CB: main (pngcrush.c:4302)
==24444== If you believe this happened as a result of a stack
==24444== overflow in your program's main thread (unlikely but
==24444== possible), you can try to increase the size of the
==24444== main thread stack using the --main-stacksize= flag.
==24444== The main thread stack size used in this run was 8388608.
Segmentation fault
Here is the GDB output:
| pngcrush 1.7.83
| Copyright (C) 1998-2002, 2006-2015 Glenn Randers-Pehrson
| Portions copyright (C) 2005 Greg Roelofs
| This is a free, open-source program. Permission is irrevocably
| granted to everyone to use this version of pngcrush without
| payment of any fee.
| Executable name is pngcrush
| It was built with libpng version 1.6.16, and is
| running with libpng version 1.6.16 - December 22, 2014
| Copyright (C) 1998-2004, 2006-2015 Glenn Randers-Pehrson,
| Copyright (C) 1996, 1997 Andreas Dilger,
| Copyright (C) 1995, Guy Eric Schalnat, Group 42 Inc.,
| and zlib version 1.2.8, Copyright (C) 1995-2013,
| Jean-loup Gailly and Mark Adler.
| It was compiled with gcc version 4.9.2.
Reading 0000 chunk.
Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers-----------------------------------]
RAX: 0x7fffffffccfb --> 0xffffff00007fff00
RBX: 0x78d250 --> 0x0
RCX: 0x7fffff7fefff
RDX: 0x3
RSI: 0x17
RDI: 0xffffffffff80231f
RBP: 0x0
RSP: 0x7fffffffcc80 --> 0x0
RIP: 0x440b4c (<pngcrush_measure_idat+13388>: mov BYTE PTR [rcx],0x0)
R8 : 0x78d010 --> 0xfbad2488
R9 : 0x7fffffffcce0 --> 0x0
R10: 0x0
R11: 0x7ffff78bf3d0 (<__fread_chk>: mov QWORD PTR [rsp-0x10],r12)
R12: 0x7fffffffcce0 --> 0x0
R13: 0x1
R14: 0x7fffffffe622 ("test203-min")
R15: 0x7fffffffe62e ("/dev/null")
EFLAGS: 0x10217 (CARRY PARITY ADJUST zero sign trap INTERRUPT direction
overflow)
[-------------------------------------code-------------------------------------]
0x440b3b <pngcrush_measure_idat+13371>: mov rcx,QWORD PTR [rsp+0x8]
0x440b40 <pngcrush_measure_idat+13376>: mov rdx,QWORD PTR [rsp]
0x440b44 <pngcrush_measure_idat+13380>: lea rsp,[rsp+0x98]
=> 0x440b4c <pngcrush_measure_idat+13388>: mov BYTE PTR [rcx],0x0
0x440b4f <pngcrush_measure_idat+13391>: mov BYTE PTR [rcx-0x1],0x0
0x440b53 <pngcrush_measure_idat+13395>: sub rcx,0x8
0x440b57 <pngcrush_measure_idat+13399>: mov BYTE PTR [rcx+0x6],0x0
0x440b5b <pngcrush_measure_idat+13403>: mov BYTE PTR [rcx+0x5],0x0
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffcc80 --> 0x0
0008| 0x7fffffffcc88 --> 0x0
0016| 0x7fffffffcc90 --> 0x0
0024| 0x7fffffffcc98 --> 0x0
0032| 0x7fffffffcca0 --> 0x0
0040| 0x7fffffffcca8 --> 0x0
0048| 0x7fffffffccb0 --> 0x0
0056| 0x7fffffffccb8 --> 0x0
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
pngcrush_measure_idat () at pngcrush.c:7407
7407 buff[ib] = 0;
gdb-peda$ exploit
Description: Access violation on destination operand
Short description: DestAv (8/22)
Hash: 261ee37f9396108d2dafcfd615209cb5.261ee37f9396108d2dafcfd615209cb5
Exploitability Classification: EXPLOITABLE
Explanation: The target crashed on an access violation at an address
matching the destination operand of the instruction. This likely indicates
a write access violation, which means the attacker may control the write
address and/or value.
Other tags: AccessViolation (21/22)
I've attached the test case but here is a hexdump:
0000000 4d8a 474e 0a0d 0a1a 0000 0000 3030 3030
0000010
Regards,
Brian 'geeknik' Carpenter
https://twitter.com/geeknik
Content of type "text/html" skipped
Download attachment "test203.gz" of type "application/x-gzip" (41 bytes)
Powered by blists - more mailing lists
Please check out the Open Source Software Security Wiki, which is counterpart to this mailing list.
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.