From: ebiederm@xmission.com (Eric W. Biederman)
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: "Vegard Nossum" <vegard.nossum@gmail.com>,
"Al Viro" <viro@zeniv.linux.org.uk>,
"Alexey Dobriyan" <adobriyan@gmail.com>,
"Ingo Molnar" <mingo@elte.hu>,
"Pekka Enberg" <penberg@cs.helsinki.fi>,
LKML <linux-kernel@vger.kernel.org>, Greg KH <greg@kroah.com>,
Kay Sievers <kay.sievers@vrfy.org>,
<linux-fsdevel@vger.kernel.org>
Subject: Re: v2.6.28-rc1: readlink /proc/*/exe returns uninitialized data to userspace
Date: Sat, 25 Oct 2008 15:28:33 -0700 [thread overview]
Message-ID: <m163nggvhq.fsf@frodo.ebiederm.org> (raw)
In-Reply-To: <200810252241.53601.rjw@sisk.pl> (Rafael J. Wysocki's message of "Sat, 25 Oct 2008 22:41:52 +0200")
"Rafael J. Wysocki" <rjw@sisk.pl> writes:
> On Saturday, 25 of October 2008, Vegard Nossum wrote:
>> Hi,
>>
>> When I run readlink on the /proc/*/exe-file for udevd, the kernel
>> returns some unitialized data to userspace:
>>
>> # strace -e trace=readlink readlink /proc/4762/exe
>> readlink("/proc/4762/exe", "/sbin/udevd", 1025) = 30
>>
>> You can see it because the kernel thinks that the string is 30 bytes
>> long, but in fact it is only 12 (including the '\0').
>>
>> If we explicitly clear the buffer before calling readlink, we can also
>> see that some garbage has been filled in there, after the string:
>>
>> # ./readlink /proc/4762/exe
>> readlink(/proc/4762/exe) = 30
>>
> 2f7362696e2f7564657664000000ffffffad4effffffadffffffdeffffffffffffffff202864656c657465642900000000000000000000000000000
>>
>> (Output is from following simple program:)
>>
>> #include <stdio.h>
>> #include <string.h>
>> #include <unistd.h>
>>
>> int main(int argc, char *argv[])
>> {
>> char buf[1024];
>> int i;
>> ssize_t n;
>>
>> memset(buf, 0, sizeof(buf));
>> n = readlink(argv[1], buf, sizeof(buf));
>>
>> printf("readlink(%s) = %d\n", argv[1], n);
>>
>> for (i = 0; i < sizeof(buf); ++i)
>> printf("%02x", buf[i]);
>> printf("\n");
>>
>> return 0;
>> }
>>
>> It was discovered by kmemcheck:
>>
>> WARNING: kmemcheck: Caught 32-bit read from uninitialized memory (f6a109e4)
>> 64000000ad4eaddeffffffffffffffff000000000200000000000000c0838ff8
>> i i u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u
>> ^
>>
>> Pid: 21511, comm: readlink Not tainted (2.6.28-rc1 #58) 945P-A
>> EIP: 0060:[<c04f988d>] EFLAGS: 00000296 CPU: 0
>> EIP is at __d_path+0x8d/0x1c0
>> EAX: 0000000e EBX: d7ba0fe7 ECX: 00000001 EDX: f68b0b40
>> ESI: f6a109e4 EDI: d7ba0fef EBP: e58c3f28 ESP: c2569c08
>> DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
>> CR0: 8005003b CR2: f6c1d704 CR3: 31fc7000 CR4: 00000650
>> DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
>> DR6: ffff4ff0 DR7: 00000400
>> [<c04fa4b0>] d_path+0xb0/0xd0
>> [<c052c37c>] proc_pid_readlink+0x6c/0xc0
>> [<c04eda34>] sys_readlinkat+0x94/0xa0
>> [<c04eda67>] sys_readlink+0x27/0x30
>> [<c0422f83>] sysenter_do_call+0x12/0x3f
>> [<ffffffff>] 0xffffffff
>>
>> Line numbers are these (as of commit
>> e013e13bf605b9e6b702adffbe2853cfc60e7806 in Linus's tree):
>>
>> $ addr2line -e vmlinux -i c04f988d c04fa4b0 c052c37c c04eda34 c04eda67
>> fs/dcache.c:1895
>> fs/dcache.c:1901
>> fs/dcache.c:1957
>> fs/dcache.c:2016
>> fs/proc/base.c:1347
>> fs/proc/base.c:1374
>> fs/stat.c:312
>> fs/stat.c:325
>>
>> I couldn't immediately figure out who/what to blame, please Cc in
>> right direction if you think you know it :-)
>
> Well, I only can say who may be interested (CCs added).
Weird. The dentry for "udevd" has an incorrect length.
Is something stomping the length somewhere?
What filesystem does /sbin/udevd reside on?
Eric
next prev parent reply other threads:[~2008-10-25 22:34 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-25 17:14 v2.6.28-rc1: readlink /proc/*/exe returns uninitialized data to userspace Vegard Nossum
2008-10-25 20:41 ` Rafael J. Wysocki
2008-10-25 22:28 ` Eric W. Biederman [this message]
2008-10-26 21:08 ` Vegard Nossum
2008-11-04 9:39 ` Vegard Nossum
2008-11-04 10:00 ` Alexey Dobriyan
2008-11-04 10:07 ` Alexey Dobriyan
2008-11-04 10:34 ` Alexey Dobriyan
2008-11-04 10:54 ` Eric W. Biederman
2008-11-04 15:48 ` Al Viro
2008-11-04 15:12 ` Al Viro
2008-11-06 10:04 ` Ingo Molnar
2008-11-07 19:05 ` Greg KH
2008-11-07 23:12 ` Alexey Dobriyan
2008-11-11 22:14 ` Andrew Morton
2008-11-11 22:53 ` Vegard Nossum
2008-12-03 17:18 ` Greg KH
2008-12-03 20:20 ` Andrew Morton
2008-12-07 5:44 ` Greg KH
2008-12-07 7:04 ` Al Viro
2008-10-26 0:23 ` Al Viro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m163nggvhq.fsf@frodo.ebiederm.org \
--to=ebiederm@xmission.com \
--cc=adobriyan@gmail.com \
--cc=greg@kroah.com \
--cc=kay.sievers@vrfy.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=penberg@cs.helsinki.fi \
--cc=rjw@sisk.pl \
--cc=vegard.nossum@gmail.com \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.