[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4 00/16] XSA55 libelf fixes for unstable
On Wed, Jun 5, 2013 at 5:59 AM, Ian Jackson <ian.jackson@xxxxxxxxxxxxx> wrote: > This is version 4 of my (prematurely-released) series to try to fix > libelf. This version deals better with some possibly-out-of-control > loops, fixes the three so-far-known regressions, and should fix the > 32-bit ARM build. Looks like there's another issue that needs fixing up in this XSA (surprise!): setup_hypercall_page (in xc_dom_boot.c) calls xc_dom_p2m_guest with an unchecked, user-controlled pfn: Starting program: /usr/local/sbin/xl create /dev/null kernel=\'check/_usr_lib_debug_vmlinux-3_2_0-4-amd64-37bdfe88206dbe6f75d9c6e021fd9b83c27814d2-5873-0_001 _1e-06-file.2.0-4-amd64\'\;\ name=\'blah\' [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Parsing config from /dev/null Program received signal SIGSEGV, Segmentation fault. 0x00007ffff6d8cb01 in xc_dom_p2m_guest (pfn=<optimized out>, dom=0x626fd0) at xc_dom.h:338 338 return dom->p2m_host[pfn - dom->rambase_pfn]; (gdb) p pfn $1 = <optimized out> (gdb) p dom->rambase_pfn $2 = 0 (gdb) bt 5 #0 0x00007ffff6d8cb01 in xc_dom_p2m_guest (pfn=<optimized out>, dom=0x626fd0) at xc_dom.h:338 #1 setup_hypercall_page (dom=0x626fd0) at xc_dom_boot.c:56 #2 xc_dom_boot_image (dom=dom@entry=0x626fd0) at xc_dom_boot.c:260 #3 0x00007ffff799b85a in libxl__build_pv (gc=gc@entry=0x629390, domid=domid@entry=9368, info=info@entry=0x7fffffffdd00, state=state@entry=0x625a80) at libxl_dom.c:399 #4 0x00007ffff7991887 in libxl__domain_build (gc=0x629390, d_config=d_config@entry=0x7fffffffdcc0, domid=9368, state=state@entry=0x625a80) at libxl_create.c:349 (More stack frames follow...) (gdb) fr 1 #1 setup_hypercall_page (dom=0x626fd0) at xc_dom_boot.c:56 56 domctl.u.hypercall_init.gmfn = xc_dom_p2m_guest(dom, pfn); (gdb) p pfn $3 = <optimized out> (gdb) l 51 52 DOMPRINTF("%s: vaddr=0x%" PRIx64 " pfn=0x%" PRIpfn "", __FUNCTION__, 53 dom->parms.virt_hypercall, pfn); 54 domctl.cmd = XEN_DOMCTL_hypercall_init; 55 domctl.domain = dom->guest_domid; 56 domctl.u.hypercall_init.gmfn = xc_dom_p2m_guest(dom, pfn); 57 rc = do_domctl(dom->xch, &domctl); 58 if ( rc != 0 ) 59 xc_dom_panic(dom->xch, 60 XC_INTERNAL_ERROR, "%s: HYPERCALL_INIT failed (rc=%d)", (gdb) l - 41 static int setup_hypercall_page(struct xc_dom_image *dom) 42 { 43 DECLARE_DOMCTL; 44 xen_pfn_t pfn; 45 int rc; 46 47 if ( dom->parms.virt_hypercall == -1 ) 48 return 0; 49 pfn = (dom->parms.virt_hypercall - dom->parms.virt_base) 50 >> XC_DOM_PAGE_SHIFT(dom); (gdb) p dom->parms.virt_hypercall $4 = 0 (gdb) p dom->parms.virt_base $5 = 18446744071562067968 (gdb) p/x dom->parms.virt_base $6 = 0xffffffff80000000 Here, the silly dom->parms.virt_base is leading to an out-of-bounds array access to the guest p2m table. (Also, perhaps dom->parms.virt_hypercall should be being compared to UNSET_ADDR, not -1, on line 47.) - Matthew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |