On Fri, 2018-01-26 at 07:34 +0100, zyx wrote: > I see. It looks like I did something wrong when testing the change. > When trying once again now I can confirm what you see, the change > does > fix the CVE. I do not know what I did wrong the last time, I'm sorry > about that. > > I committed the patch as revision 1872: > http://sourceforge.net/p/podofo/code/1872
Hi, I reverted the main part of the above change, because it causes use-after-free in test/unit/podofo-test, more details below. I left most of the (more or less unrelated) changes of the above change also due to conflicting changes in the sources which happened meanwhile. That means that CVE-2017-8054 is not fixed since revision 1881: http://sourceforge.net/p/podofo/code/1881 Bye, zyx P.S.: the reported use-after-free was due to rVal holding the array it had been freeing inside the operator=(). Info from Address Sanitizer: ==9812==ERROR: AddressSanitizer: heap-use-after-free on address 0x606000e23ca0 at pc 0x7f53c345914a bp 0x7ffeb1f284c0 sp 0x7ffeb1f284b0 READ of size 8 at 0x606000e23ca0 thread T0 #0 0x7f53c3459149 in PoDoFo::PdfVariant::operator=(PoDoFo::PdfVariant const&) ..../src/base/PdfVariant.cpp:346 #1 0x7f53c37d8c91 in PoDoFo::PdfPagesTree::GetPageNodeFromArray(int, PoDoFo::PdfArray const&, std::deque<PoDoFo::PdfObject*, std::allocator<PoDoFo::PdfObject*> >&) ..../src/doc/PdfPagesTree.cpp:491 #2 0x7f53c37d5903 in PoDoFo::PdfPagesTree::GetPageNode(int, PoDoFo::PdfObject*, std::deque<PoDoFo::PdfObject*, std::allocator<PoDoFo::PdfObject*> >&) ..../src/doc/PdfPagesTree.cpp:354 #3 0x7f53c37d424a in PoDoFo::PdfPagesTree::DeletePage(int) ..../src/doc/PdfPagesTree.cpp:282 #4 0x717d3e in PagesTreeTest::testDeleteAll(PoDoFo::PdfMemDocument&) ..../test/unit/PagesTreeTest.cpp:306 #5 0x7171c7 in PagesTreeTest::testDeleteAllCustom() ..../test/unit/PagesTreeTest.cpp:290 #6 0x726e00 in void std::__invoke_impl<void, void (PagesTreeTest::*&)(), PagesTreeTest*&>(std::__invoke_memfun_deref, void (PagesTreeTest::*&)(), PagesTreeTest*&) /usr/include/c++/7/bits/invoke.h:73 #7 0x7269e7 in std::__invoke_result<void (PagesTreeTest::*&)(), PagesTreeTest*&>::type std::__invoke<void (PagesTreeTest::*&)(), PagesTreeTest*&>(void (PagesTreeTest::*&)(), PagesTreeTest*&) /usr/include/c++/7/bits/invoke.h:95 #8 0x72669f in void std::_Bind<void (PagesTreeTest::*(PagesTreeTest*))()>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/include/c++/7/functional:467 #9 0x72605f in void std::_Bind<void (PagesTreeTest::*(PagesTreeTest*))()>::operator()<, void>() /usr/include/c++/7/functional:551 #10 0x725482 in std::_Function_handler<void (), std::_Bind<void (PagesTreeTest::*(PagesTreeTest*))()> >::_M_invoke(std::_Any_data const&) /usr/include/c++/7/bits/std_function.h:316 #11 0x65cadc in std::function<void ()>::operator()() const /usr/include/c++/7/bits/std_function.h:706 #12 0x727d83 in CppUnit::TestCaller<PagesTreeTest>::runTest() /usr/include/cppunit/TestCaller.h:175 #13 0x7f53c0d14531 in CppUnit::TestCaseMethodFunctor::operator()() const (/lib64/libcppunit-1.14.so.0+0x24531) #14 0x7f53c0d0adf0 in CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/lib64/libcppunit-1.14.so.0+0x1adf0) #15 0x7f53c0d11834 in CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/lib64/libcppunit-1.14.so.0+0x21834) #16 0x7f53c0d1a18c in CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (/lib64/libcppunit-1.14.so.0+0x2a18c) #17 0x7f53c0d14364 in CppUnit::TestCase::run(CppUnit::TestResult*) (/lib64/libcppunit-1.14.so.0+0x24364) #18 0x7f53c0d14852 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) (/lib64/libcppunit-1.14.so.0+0x24852) #19 0x7f53c0d1475d in CppUnit::TestComposite::run(CppUnit::TestResult*) (/lib64/libcppunit-1.14.so.0+0x2475d) #20 0x7f53c0d14852 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) (/lib64/libcppunit-1.14.so.0+0x24852) #21 0x7f53c0d1475d in CppUnit::TestComposite::run(CppUnit::TestResult*) (/lib64/libcppunit-1.14.so.0+0x2475d) #22 0x7f53c0d1a0c1 in CppUnit::TestResult::runTest(CppUnit::Test*) (/lib64/libcppunit-1.14.so.0+0x2a0c1) #23 0x7f53c0d1ca2d in CppUnit::TestRunner::run(CppUnit::TestResult&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (/lib64/libcppunit-1.14.so.0+0x2ca2d) #24 0x7f53c0d1e73f in CppUnit::TextTestRunner::run(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, bool, bool) (/lib64/libcppunit-1.14.so.0+0x2e73f) #25 0x45edaa in main ..../test/unit/main.cpp:100 #26 0x7f53c003a039 in __libc_start_main (/lib64/libc.so.6+0x21039) #27 0x45d7a9 in _start (..../build/test/unit/podofo-test+0x45d7a9) 0x606000e23ca0 is located 0 bytes inside of 56-byte region [0x606000e23ca0,0x606000e23cd8) freed by thread T0 here: #0 0x7f53c5d39fd0 in operator delete(void*) (/usr/lib64/libasan.so.4+0xe0fd0) #1 0x6ad31c in __gnu_cxx::new_allocator<PoDoFo::PdfObject>::deallocate(PoDoFo::PdfObject*, unsigned long) /usr/include/c++/7/ext/new_allocator.h:125 #2 0x6aa735 in std::allocator_traits<std::allocator<PoDoFo::PdfObject> >::deallocate(std::allocator<PoDoFo::PdfObject>&, PoDoFo::PdfObject*, unsigned long) /usr/include/c++/7/bits/alloc_traits.h:462 #3 0x6a8b35 in std::_Vector_base<PoDoFo::PdfObject, std::allocator<PoDoFo::PdfObject> >::_M_deallocate(PoDoFo::PdfObject*, unsigned long) /usr/include/c++/7/bits/stl_vector.h:180 #4 0x7f53c3248109 in std::_Vector_base<PoDoFo::PdfObject, std::allocator<PoDoFo::PdfObject> >::~_Vector_base() (..../build/src/libpodofo.so.0.9.6+0xbcd109) #5 0x7f53c3245889 in std::vector<PoDoFo::PdfObject, std::allocator<PoDoFo::PdfObject> >::~vector() (..../build/src/libpodofo.so.0.9.6+0xbca889) #6 0x7f53c323d481 in PoDoFo::PdfArray::~PdfArray() ..../src/base/PdfArray.cpp:48 #7 0x7f53c323d4d8 in PoDoFo::PdfArray::~PdfArray() ..../src/base/PdfArray.cpp:50 #8 0x7f53c3454c4f in PoDoFo::PdfVariant::Clear() ..../src/base/PdfVariant.cpp:190 #9 0x7f53c34590de in PoDoFo::PdfVariant::operator=(PoDoFo::PdfVariant const&) ..../src/base/PdfVariant.cpp:344 #10 0x7f53c37d8c91 in PoDoFo::PdfPagesTree::GetPageNodeFromArray(int, PoDoFo::PdfArray const&, std::deque<PoDoFo::PdfObject*, std::allocator<PoDoFo::PdfObject*> >&) ..../src/doc/PdfPagesTree.cpp:491 #11 0x7f53c37d5903 in PoDoFo::PdfPagesTree::GetPageNode(int, PoDoFo::PdfObject*, std::deque<PoDoFo::PdfObject*, std::allocator<PoDoFo::PdfObject*> >&) ..../src/doc/PdfPagesTree.cpp:354 #12 0x7f53c37d424a in PoDoFo::PdfPagesTree::DeletePage(int) ..../src/doc/PdfPagesTree.cpp:282 #13 0x717d3e in PagesTreeTest::testDeleteAll(PoDoFo::PdfMemDocument&) ..../test/unit/PagesTreeTest.cpp:306 #14 0x7171c7 in PagesTreeTest::testDeleteAllCustom() ..../test/unit/PagesTreeTest.cpp:290 #15 0x726e00 in void std::__invoke_impl<void, void (PagesTreeTest::*&)(), PagesTreeTest*&>(std::__invoke_memfun_deref, void (PagesTreeTest::*&)(), PagesTreeTest*&) /usr/include/c++/7/bits/invoke.h:73 #16 0x7269e7 in std::__invoke_result<void (PagesTreeTest::*&)(), PagesTreeTest*&>::type std::__invoke<void (PagesTreeTest::*&)(), PagesTreeTest*&>(void (PagesTreeTest::*&)(), PagesTreeTest*&) /usr/include/c++/7/bits/invoke.h:95 #17 0x72669f in void std::_Bind<void (PagesTreeTest::*(PagesTreeTest*))()>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/include/c++/7/functional:467 #18 0x72605f in void std::_Bind<void (PagesTreeTest::*(PagesTreeTest*))()>::operator()<, void>() /usr/include/c++/7/functional:551 #19 0x725482 in std::_Function_handler<void (), std::_Bind<void (PagesTreeTest::*(PagesTreeTest*))()> >::_M_invoke(std::_Any_data const&) /usr/include/c++/7/bits/std_function.h:316 #20 0x65cadc in std::function<void ()>::operator()() const /usr/include/c++/7/bits/std_function.h:706 #21 0x727d83 in CppUnit::TestCaller<PagesTreeTest>::runTest() /usr/include/cppunit/TestCaller.h:175 #22 0x7f53c0d14531 in CppUnit::TestCaseMethodFunctor::operator()() const (/lib64/libcppunit-1.14.so.0+0x24531) #23 0x60b00000003f (<unknown module>) previously allocated by thread T0 here: #0 0x7f53c5d39158 in operator new(unsigned long) (/usr/lib64/libasan.so.4+0xe0158) #1 0x6adc9b in __gnu_cxx::new_allocator<PoDoFo::PdfObject>::allocate(unsigned long, void const*) /usr/include/c++/7/ext/new_allocator.h:111 #2 0x6ad070 in std::allocator_traits<std::allocator<PoDoFo::PdfObject> >::allocate(std::allocator<PoDoFo::PdfObject>&, unsigned long) /usr/include/c++/7/bits/alloc_traits.h:436 #3 0x6aa569 in std::_Vector_base<PoDoFo::PdfObject, std::allocator<PoDoFo::PdfObject> >::_M_allocate(unsigned long) /usr/include/c++/7/bits/stl_vector.h:172 #4 0x7f53c3249073 in std::_Vector_base<PoDoFo::PdfObject, std::allocator<PoDoFo::PdfObject> >::_M_create_storage(unsigned long) /usr/include/c++/7/bits/stl_vector.h:187 #5 0x7f53c3247f63 in std::_Vector_base<PoDoFo::PdfObject, std::allocator<PoDoFo::PdfObject> >::_Vector_base(unsigned long, std::allocator<PoDoFo::PdfObject> const&) (..../build/src/libpodofo.so.0.9.6+0xbccf63) #6 0x7f53c32454e4 in std::vector<PoDoFo::PdfObject, std::allocator<PoDoFo::PdfObject> >::vector(std::vector<PoDoFo::PdfObject, std::allocator<PoDoFo::PdfObject> > const&) (..../build/src/libpodofo.so.0.9.6+0xbca4e4) #7 0x7f53c323daa0 in PoDoFo::PdfArray::PdfArray(PoDoFo::PdfArray const&) ..../src/base/PdfArray.cpp:59 #8 0x7f53c3459c21 in PoDoFo::PdfVariant::operator=(PoDoFo::PdfVariant const&) ..../src/base/PdfVariant.cpp:355 #9 0x7f53c37da757 in PoDoFo::PdfPagesTree::GetPageNodeFromArray(int, PoDoFo::PdfArray const&, std::deque<PoDoFo::PdfObject*, std::allocator<PoDoFo::PdfObject*> >&) ..../src/doc/PdfPagesTree.cpp:529 #10 0x7f53c37d5903 in PoDoFo::PdfPagesTree::GetPageNode(int, PoDoFo::PdfObject*, std::deque<PoDoFo::PdfObject*, std::allocator<PoDoFo::PdfObject*> >&) ..../src/doc/PdfPagesTree.cpp:354 #11 0x7f53c37d424a in PoDoFo::PdfPagesTree::DeletePage(int) ..../src/doc/PdfPagesTree.cpp:282 #12 0x717d3e in PagesTreeTest::testDeleteAll(PoDoFo::PdfMemDocument&) ..../test/unit/PagesTreeTest.cpp:306 #13 0x7171c7 in PagesTreeTest::testDeleteAllCustom() ..../test/unit/PagesTreeTest.cpp:290 #14 0x726e00 in void std::__invoke_impl<void, void (PagesTreeTest::*&)(), PagesTreeTest*&>(std::__invoke_memfun_deref, void (PagesTreeTest::*&)(), PagesTreeTest*&) /usr/include/c++/7/bits/invoke.h:73 #15 0x7269e7 in std::__invoke_result<void (PagesTreeTest::*&)(), PagesTreeTest*&>::type std::__invoke<void (PagesTreeTest::*&)(), PagesTreeTest*&>(void (PagesTreeTest::*&)(), PagesTreeTest*&) /usr/include/c++/7/bits/invoke.h:95 #16 0x72669f in void std::_Bind<void (PagesTreeTest::*(PagesTreeTest*))()>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/include/c++/7/functional:467 #17 0x72605f in void std::_Bind<void (PagesTreeTest::*(PagesTreeTest*))()>::operator()<, void>() /usr/include/c++/7/functional:551 #18 0x725482 in std::_Function_handler<void (), std::_Bind<void (PagesTreeTest::*(PagesTreeTest*))()> >::_M_invoke(std::_Any_data const&) /usr/include/c++/7/bits/std_function.h:316 #19 0x65cadc in std::function<void ()>::operator()() const /usr/include/c++/7/bits/std_function.h:706 #20 0x727d83 in CppUnit::TestCaller<PagesTreeTest>::runTest() /usr/include/cppunit/TestCaller.h:175 #21 0x7f53c0d14531 in CppUnit::TestCaseMethodFunctor::operator()() const (/lib64/libcppunit-1.14.so.0+0x24531) #22 0x60b00000003f (<unknown module>) SUMMARY: AddressSanitizer: heap-use-after-free ..../src/base/PdfVariant.cpp:346 in PoDoFo::PdfVariant::operator=(PoDoFo::PdfVariant const&) ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Podofo-users mailing list Podofo-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/podofo-users