|
Message-ID: <20120207192309.GG28231@dhcp-25-225.brq.redhat.com> Date: Tue, 7 Feb 2012 20:23:09 +0100 From: Petr Matousek <pmatouse@...hat.com> To: Solar Designer <solar@...nwall.com> Cc: oss-security@...ts.openwall.com Subject: Re: CVE-2011-4325 Linux kernel: nfs: diotest4 from LTP crash client Hi, On Mon, Feb 06, 2012 at 01:42:48PM +0400, Solar Designer wrote: <snip> > Apparently, an uninitialized pointer was being accessed, and apparently > it happened to be NULL (or nearby) on some occasion - but I see no proof > that it would always be NULL, although there may well be something that > makes it so. > > Overall, after a quick glance at the fix, I am not convinced that this > was just a DoS. Someone familiar with the code might have a better idea. Code: 48 8b 47 38 48 89 fb 48 8b 68 10 48 8d b5 b4 00 00 00 e8 c9 RIP [<ffffffff887aed65>] :nfs:__put_nfs_open_context+0x7/0x93 RSP <ffff810153cc1d28> CR2: 0000000000000038 <0>Kernel panic - not syncing: Fatal exception addr2line -ife nfs.ko.debug <<< 6D65 __put_nfs_open_context /usr/src/debug/kernel-2.6.18/linux-2.6.18-296.el5.x86_64/fs/nfs/inode.c:624 0000000000006d5e <__put_nfs_open_context>: 6d5e: 41 54 push %r12 6d60: 41 89 f4 mov %esi,%r12d 6d63: 55 push %rbp 6d64: 53 push %rbx 6d65: 48 8b 47 38 mov 0x38(%rdi),%rax static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync) { struct inode *inode = ctx->path.dentry->d_inode; // line 624 / 6d65 ... } [pmatouse@...p-25-225 linux-2.6.18-296.el5.x86_64]$ pahole -r -C nfs_open_context nfs.ko.debug struct nfs_open_context { struct nfs_lock_context lock_context; /* 0 48 */ struct path path; /* 48 16 */ ... } [pmatouse@...p-25-225 linux-2.6.18-296.el5.x86_64]$ pahole -r -C path nfs.ko.debug struct path { struct vfsmount * mnt; /* 0 8 */ struct dentry * dentry; /* 8 8 */ ... } 48 + 8 == 56 (0x38) (mov 0x38(%rdi),%rax) ctx is null -- nfs_direct_read_schedule() -> data = nfs_readdata_alloc(); // allocates and nulls readdata -> nfs_readdata_release(data); // on error -> data->args.context = get_nfs_open_context(ctx); // initializes args.context it can happen that nfs_readdata_release() is called with data->args.context being NULL. void nfs_readdata_release(void *data) { struct nfs_read_data *rdata = data; put_nfs_open_context(rdata->args.context); nfs_readdata_free(rdata); } void put_nfs_open_context(struct nfs_open_context *ctx) { __put_nfs_open_context(ctx, 0); } static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync) { struct inode *inode = ctx->path.dentry->d_inode; // line 624 ... } > Also, does Red Hat treat NULL pointer derefs in the kernel as DoS only > now, relying primarily on mmap_min_addr to work? (We do. And we'll > treat a mmap_min_addr bypass if another one of these is found, as the > real privilege escalation issue, assuming that plenty of NULL derefs > exist in the kernel.) Yes. Thanks, -- Petr Matousek / Red Hat Security Response Team
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.