Bug #1345
Assertion Failure (SIGABRT) in Exiv2:RafImage::readMetadata() in Libexiv2
100%
Description
Hi,
I found a failure assertion event in libevix2(0.26 001a00, 64 bit). To reproduce,
$ exiv2 input_file
The input that triggered the failure is attached.
GDB output:
====
@(gdb) r
Starting program: /usr/local/bin/exiv2 outd/crashInputs/exiv2-2018-04-14T11-14-49.310776.exi
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Program received signal SIGABRT, Aborted.
0x00007ffff6e29c37 in _GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 0x00007ffff6e29c37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1 0x00007ffff6e2d028 in __GI_abort () at abort.c:89
#2 0x00007ffff7432535 in __gnu_cxx::_verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007ffff74306d6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4 0x00007ffff7430703 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5 0x00007ffff7430922 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6 0x00007ffff7430e0d in operator new(unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7 0x00007ffff7430ea9 in operator new[](unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#8 0x00007ffff782a4fc in Exiv2::RafImage::readMetadata() () from /usr/local/lib/libexiv2.so.26
#9 0x000000000041bdfd in Action::Print::printSummary() ()
#10 0x000000000041e1a8 in Action::Print::run(std::string const&) ()
#11 0x0000000000406bba in main ()
@
I am not sure if this is a new issue as I have seen several issues involving readMetadata(), but none of them were for RafImage::readMetadata(). So i thought of reporting.
Thanks
-sanjay
Files
History
Updated by Robin Mills over 3 years ago
- Category set to image format
- Status changed from New to Assigned
- Assignee set to Robin Mills
- Target version set to 0.27
- % Done changed from 0 to 10
- Estimated time set to 4.00 h
Thanks for reporting this. I've reproduced this and will investigate.
Updated by Robin Mills over 3 years ago
- % Done changed from 10 to 50
- Estimated time changed from 4.00 h to 2.00 h
Thanks for reporting this. The fix is in src/rafimage.cpp. Exiv2 supports about 20 different file formats (TIFF, JPEG, PNG, RAF etc) and every format has a metadata parser derived from Image::readMetadata(). Your fuzzed file has broken the raf parser, so I've added additional range checks:
537 rmills@rmillsmbp:~/gnu/github/exiv2/exiv2 $ git diff src/rafimage.cpp
diff --git a/src/rafimage.cpp b/src/rafimage.cpp
index f709d544..8315a824 100644
--- a/src/rafimage.cpp
+++ b/src/rafimage.cpp
@@ -290,6 +290,11 @@ namespace Exiv2 {
clearMetadata();
+ // Ensure there is enough data to read the header
+ long size = io_->size();
+ if ( size <= (84+8) ) {
+ throw Error(Exiv2::kerCorruptedMetadata);
+ }
io_->seek(84,BasicIo::beg);
byte jpg_img_offset [4];
io_->read(jpg_img_offset, 4);
@@ -298,6 +303,13 @@ namespace Exiv2 {
long jpg_img_off = Exiv2::getULong((const byte *) jpg_img_offset, bigEndian);
long jpg_img_len = Exiv2::getULong((const byte *) jpg_img_length, bigEndian);
+ // Ensure jpg lies within the file
+ if( (jpg_img_off < 0 && jpg_img_off >= size)
+ || (jpg_img_len < 12 && (jpg_img_off + jpg_img_len) >= size )
+ ){
+ throw Error(Exiv2::kerCorruptedMetadata);
+ }
+
DataBuf buf(jpg_img_len - 12);
io_->seek(jpg_img_off + 12,BasicIo::beg);
io_->read(buf.pData_, buf.size_ - 12);
538 rmills@rmillsmbp:~/gnu/github/exiv2/exiv2 $ I will raise an issue on GitHub about this and it will be fixed and tracked there. I'll close this issue when the GitHub version is resolved.Updated by Robin Mills about 3 years ago
- Status changed from Assigned to Closed
- % Done changed from 50 to 100
Fixed in 'master' and should be included in Exiv2 v0.27 RC2 available on 2018-11-15 http://exiv2.dyndns.org
559 rmills@rmillsmbp:~/gnu/github/exiv2/master/build $ exiv2 -pa --verbose ~/Downloads/*.exi File 1/1: /Users/rmills/Downloads/exiv2-2018-04-14T11-14-49.310776.exi Uncaught exception: std::bad_alloc 560 rmills@rmillsmbp:~/gnu/github/exiv2/master/build $