compiling pidgin causes python to read freed memory

Joseph Bisch joseph.bisch at gmail.com
Fri Apr 14 13:02:01 EDT 2017


Hi again,

When compiling Pidgin with a Python 3 compiled with ASan, ASan detects
a use after free. Specifically, Python is reading from memory that Gnt
had prematurely freed.

Analysis:

My guess is that the issue is caused by freeing the name variable
immediately after Py_SetProgramName() is called. Later, ASan triggers
on the Py_Initialize() call.

https://bitbucket.org/pidgin/main/src/107c6c2342ffd03ad2eae7a838f6b01adcf49291/finch/libgnt/gntwm.c?at=default&fileviewer=file-view-default#gntwm.c-1582

Note that the Python documentation for the Py_SetProgramName()
function explicitly states that the contents of the argument should
not change for the duration of the program's execution.

Joseph

ASan output:

=================================================================
==27341==ERROR: AddressSanitizer: heap-use-after-free on address
0x60200001fd70 at pc 0x000000447f71 bp 0x7ffe72c11d20 sp
0x7ffe72c114d0
READ of size 16 at 0x60200001fd70 thread T0
    #0 0x447f70 in __interceptor_wcslen
/home/joseph/aur/llvm-svn/src/llvm/projects/compiler-rt/lib/asan/asan_interceptors.cc:591
    #1 0x7fedc4c65bed  (/usr/lib/libpython3.6m.so.1.0+0x224bed)
    #2 0x7fedc4c66739  (/usr/lib/libpython3.6m.so.1.0+0x225739)
    #3 0x7fedc4c67000 in Py_GetProgramFullPath
(/usr/lib/libpython3.6m.so.1.0+0x226000)
    #4 0x7fedc4c64826 in _PySys_Init (/usr/lib/libpython3.6m.so.1.0+0x223826)
    #5 0x7fedc4c31150 in _Py_InitializeEx_Private
(/usr/lib/libpython3.6m.so.1.0+0x1f0150)
    #6 0x7fedc5c5ec65 in gnt_wm_class_init
/home/joseph/pidgin-fuzz/main2/finch/libgnt/gntwm.c:1587:3
    #7 0x7fedc34eb4d6 in g_type_class_ref (/usr/lib/libgobject-2.0.so.0+0x304d6)
    #8 0x50b781 in dump_properties
/home/joseph/pidgin-fuzz/main2/finch/libgnt/tmp-introspectwzbhauez/Gnt-2.9.c:137:15
    #9 0x50aab7 in dump_object_type
/home/joseph/pidgin-fuzz/main2/finch/libgnt/tmp-introspectwzbhauez/Gnt-2.9.c:260:3
    #10 0x50aab7 in dump_type
/home/joseph/pidgin-fuzz/main2/finch/libgnt/tmp-introspectwzbhauez/Gnt-2.9.c:402
    #11 0x50aab7 in dump_irepository
/home/joseph/pidgin-fuzz/main2/finch/libgnt/tmp-introspectwzbhauez/Gnt-2.9.c:547
    #12 0x50aab7 in main
/home/joseph/pidgin-fuzz/main2/finch/libgnt/tmp-introspectwzbhauez/Gnt-2.9.c:610
    #13 0x7fedc2801510 in __libc_start_main (/usr/lib/libc.so.6+0x20510)
    #14 0x41a8c9 in _start
(/home/joseph/pidgin-fuzz/main2/finch/libgnt/tmp-introspectwzbhauez/.libs/lt-Gnt-2.9+0x41a8c9)

0x60200001fd70 is located 0 bytes inside of 16-byte region
[0x60200001fd70,0x60200001fd80)
freed by thread T0 here:
    #0 0x4d0af0 in __interceptor_cfree.localalias.1
/home/joseph/aur/llvm-svn/src/llvm/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:54
    #1 0x7fedc5c5ec60 in gnt_wm_class_init
/home/joseph/pidgin-fuzz/main2/finch/libgnt/gntwm.c:1583:3
    #2 0x7fedc34eb4d6 in g_type_class_ref (/usr/lib/libgobject-2.0.so.0+0x304d6)

previously allocated by thread T0 here:
    #0 0x4d0ca8 in __interceptor_malloc
/home/joseph/aur/llvm-svn/src/llvm/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:64
    #1 0x7fedc2ff3bb8 in g_malloc (/usr/lib/libglib-2.0.so.0+0x4fbb8)
    #2 0x7fedc34eb4d6 in g_type_class_ref (/usr/lib/libgobject-2.0.so.0+0x304d6)

SUMMARY: AddressSanitizer: heap-use-after-free
/home/joseph/aur/llvm-svn/src/llvm/projects/compiler-rt/lib/asan/asan_interceptors.cc:591
in __interceptor_wcslen
Shadow bytes around the buggy address:
  0x0c047fffbf50: fa fa 00 00 fa fa 00 04 fa fa 00 04 fa fa 00 00
  0x0c047fffbf60: fa fa 03 fa fa fa 00 00 fa fa 00 00 fa fa 00 00
  0x0c047fffbf70: fa fa 00 00 fa fa 03 fa fa fa 00 00 fa fa 00 00
  0x0c047fffbf80: fa fa 00 00 fa fa 00 00 fa fa 00 00 fa fa 03 fa
  0x0c047fffbf90: fa fa 00 00 fa fa 00 00 fa fa 03 fa fa fa 00 00
=>0x0c047fffbfa0: fa fa 00 00 fa fa 00 03 fa fa 00 03 fa fa[fd]fd
  0x0c047fffbfb0: fa fa fd fa fa fa 00 04 fa fa 00 04 fa fa 00 00
  0x0c047fffbfc0: fa fa 00 01 fa fa 00 01 fa fa 00 00 fa fa 00 fa
  0x0c047fffbfd0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fffbfe0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fffbff0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==27341==ABORTING
Command '['/home/joseph/pidgin-fuzz/main2/finch/libgnt/tmp-introspectwzbhauez/Gnt-2.9',
'--introspect-dump=/home/joseph/pidgin-fuzz/main2/finch/libgnt/tmp-introspectwzbhauez/functions.txt,/home/joseph/pidgin-fuzz/main2/finch/libgnt/tmp-introspectwzbhauez/dump.xml']'
returned non-zero exit status 1.
make[5]: *** [/usr/share/gobject-introspection-1.0/Makefile.introspection:156:
Gnt-2.9.gir] Error 1


More information about the security mailing list