* CVE-2009-2584 @ 2009-11-04 22:05 Michael Gilbert 2009-11-04 22:08 ` CVE-2009-2584 Justin P. Mattock 2009-11-05 15:27 ` CVE-2009-2584 Jiri Kosina 0 siblings, 2 replies; 14+ messages in thread From: Michael Gilbert @ 2009-11-04 22:05 UTC (permalink / raw) To: linux-kernel Hi, CVE-2009-2584 [0],[1] has been disclosed for quite a while now (with existing exploit code by Brad Spengler [2]). A patch has also been available for the same amount of time [3], but as of 2.6.32-rc6 it is still not applied. Did this slip through the cracks? Thanks upfront for any info on the matter. Best wishes, Mike [0] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-2584 [1] http://xorl.wordpress.com/2009/07/21/linux-kernel-sgi-gru-driver-off-by-one-overwrite/ [2] http://grsecurity.net/~spender/exploit_demo.c [3] http://lkml.org/lkml/2009/7/20/348 ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-04 22:05 CVE-2009-2584 Michael Gilbert @ 2009-11-04 22:08 ` Justin P. Mattock 2009-11-04 22:21 ` CVE-2009-2584 Michael Gilbert 2009-11-05 15:27 ` CVE-2009-2584 Jiri Kosina 1 sibling, 1 reply; 14+ messages in thread From: Justin P. Mattock @ 2009-11-04 22:08 UTC (permalink / raw) To: Michael Gilbert; +Cc: linux-kernel Michael Gilbert wrote: > Hi, > > CVE-2009-2584 [0],[1] has been disclosed for quite a while now (with > existing exploit code by Brad Spengler [2]). A patch has also been > available for the same amount of time [3], but as of 2.6.32-rc6 it is > still not applied. Did this slip through the cracks? Thanks upfront > for any info on the matter. > > Best wishes, > Mike > > [0] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-2584 > [1] http://xorl.wordpress.com/2009/07/21/linux-kernel-sgi-gru-driver-off-by-one-overwrite/ > [2] http://grsecurity.net/~spender/exploit_demo.c > [3] http://lkml.org/lkml/2009/7/20/348 > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > > just read something today which might be similar/same as what you might be referring too. http://www.theregister.co.uk/2009/11/03/linux_kernel_vulnerability/ Justin P. Mattock ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-04 22:08 ` CVE-2009-2584 Justin P. Mattock @ 2009-11-04 22:21 ` Michael Gilbert 2009-11-04 22:49 ` CVE-2009-2584 Justin P. Mattock 0 siblings, 1 reply; 14+ messages in thread From: Michael Gilbert @ 2009-11-04 22:21 UTC (permalink / raw) To: Justin P. Mattock; +Cc: linux-kernel On Wed, 04 Nov 2009 14:08:41 -0800, Justin P. Mattock wrote: > just read something today which might > be similar/same as what you might > be referring too. > http://www.theregister.co.uk/2009/11/03/linux_kernel_vulnerability/ Hi, Thank you very much for the quick response, but that link refers to CVE-2009-3547 (not CVE-2009-2584), which is a different issue altogether. Best wishes, Mike ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-04 22:21 ` CVE-2009-2584 Michael Gilbert @ 2009-11-04 22:49 ` Justin P. Mattock 0 siblings, 0 replies; 14+ messages in thread From: Justin P. Mattock @ 2009-11-04 22:49 UTC (permalink / raw) To: Michael Gilbert; +Cc: linux-kernel Michael Gilbert wrote: > On Wed, 04 Nov 2009 14:08:41 -0800, Justin P. Mattock wrote: > >> just read something today which might >> be similar/same as what you might >> be referring too. >> http://www.theregister.co.uk/2009/11/03/linux_kernel_vulnerability/ >> > > Hi, > > Thank you very much for the quick response, but that link refers to > CVE-2009-3547 (not CVE-2009-2584), which is a different issue > altogether. > > Best wishes, > Mike > > alright.. wasn't sure or not. hopefully somebody gives some info on this(I don't like seeing these things). Justin P. Mattock ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-04 22:05 CVE-2009-2584 Michael Gilbert 2009-11-04 22:08 ` CVE-2009-2584 Justin P. Mattock @ 2009-11-05 15:27 ` Jiri Kosina 2009-11-05 16:32 ` CVE-2009-2584 Linus Torvalds 1 sibling, 1 reply; 14+ messages in thread From: Jiri Kosina @ 2009-11-05 15:27 UTC (permalink / raw) To: Michael Gilbert, Linus Torvalds, Michael Buesch, Jack Steiner Cc: linux-kernel, stable [ adding some more CCs and including patch below for completness, obviously it got lost in space ] On Wed, 4 Nov 2009, Michael Gilbert wrote: > CVE-2009-2584 [0],[1] has been disclosed for quite a while now (with > existing exploit code by Brad Spengler [2]). A patch has also been > available for the same amount of time [3], but as of 2.6.32-rc6 it is > still not applied. Did this slip through the cracks? Thanks upfront > for any info on the matter. [ ... ] > [0] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-2584 > [1] http://xorl.wordpress.com/2009/07/21/linux-kernel-sgi-gru-driver-off-by-one-overwrite/ > [2] http://grsecurity.net/~spender/exploit_demo.c > [3] http://lkml.org/lkml/2009/7/20/348 From: Michael Buesch <mb@bu3sch.de> Subject: sgi-gru: Fix kernel stack buffer overrun This patch fixes a kernel stack buffer overrun in the sgi-gru procfs interface implementation. The "count" parameter to options_write() is user controlled. So this bug can be used to write '\0' bytes to almost arbitrary places on the kernel stack. Cc: stable@kernel.org Signed-off-by: Michael Buesch <mb@bu3sch.de> Acked-by: Jack Steiner <steiner@sgi.com> --- linux-2.6.orig/drivers/misc/sgi-gru/gruprocfs.c +++ linux-2.6/drivers/misc/sgi-gru/gruprocfs.c @@ -157,23 +157,23 @@ static int options_show(struct seq_file seq_printf(s, "0x%lx\n", gru_options); return 0; } static ssize_t options_write(struct file *file, const char __user *userbuf, size_t count, loff_t *data) { unsigned long val; char buf[80]; + memset(buf, 0, sizeof(buf)); if (strncpy_from_user(buf, userbuf, sizeof(buf) - 1) < 0) return -EFAULT; - buf[count - 1] = '\0'; if (!strict_strtoul(buf, 10, &val)) gru_options = val; return count; } static int cch_seq_show(struct seq_file *file, void *data) { long gid = *(long *)data; int i; ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-05 15:27 ` CVE-2009-2584 Jiri Kosina @ 2009-11-05 16:32 ` Linus Torvalds 2009-11-05 17:38 ` CVE-2009-2584 Linus Torvalds 0 siblings, 1 reply; 14+ messages in thread From: Linus Torvalds @ 2009-11-05 16:32 UTC (permalink / raw) To: Jiri Kosina Cc: Michael Gilbert, Michael Buesch, Jack Steiner, linux-kernel, stable On Thu, 5 Nov 2009, Jiri Kosina wrote: > > + memset(buf, 0, sizeof(buf)); > if (strncpy_from_user(buf, userbuf, sizeof(buf) - 1) < 0) > return -EFAULT; > - buf[count - 1] = '\0'; Why isn't this just buf[sizeof(buf) - 1] = 0; which was almost certainly the _intention_ of the code in the first place, since 'count' has absolutely nothing to do with the copy from user space as it is written. I'm also convinced we do _not_ want 'strncpy' there, since we do have the size of the write. Doing a strncpy_from_user() is actually _wrong_ if the user buffer itself is smaller than the kernel buffer and isn't NUL-terminated. So that strncpy crap needs to go. It's wrong. In other words it would all look a whole lot more natural (and correct) like the appended patch. Untested, of course. And since almost nobody has the hardware, so it's not like it's ever likely to _be_ tested. Linus --- drivers/misc/sgi-gru/gruprocfs.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c index ccd4408..c0e17b0 100644 --- a/drivers/misc/sgi-gru/gruprocfs.c +++ b/drivers/misc/sgi-gru/gruprocfs.c @@ -164,7 +164,9 @@ static ssize_t options_write(struct file *file, const char __user *userbuf, unsigned long val; char buf[80]; - if (strncpy_from_user(buf, userbuf, sizeof(buf) - 1) < 0) + if (count >= sizeof(buf)) + count = sizeof(buf)-1; + if (copy_from_user(buf, userbuf, count)) return -EFAULT; buf[count - 1] = '\0'; if (!strict_strtoul(buf, 10, &val)) ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-05 16:32 ` CVE-2009-2584 Linus Torvalds @ 2009-11-05 17:38 ` Linus Torvalds 2009-11-05 17:47 ` CVE-2009-2584 Linus Torvalds ` (2 more replies) 0 siblings, 3 replies; 14+ messages in thread From: Linus Torvalds @ 2009-11-05 17:38 UTC (permalink / raw) To: Jiri Kosina Cc: Michael Gilbert, Michael Buesch, Jack Steiner, linux-kernel, stable On Thu, 5 Nov 2009, Linus Torvalds wrote: > > Untested, of course. And since almost nobody has the hardware, so it's not > like it's ever likely to _be_ tested. > > Linus > > --- > drivers/misc/sgi-gru/gruprocfs.c | 4 +++- > 1 files changed, 3 insertions(+), 1 deletions(-) > > diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c > index ccd4408..c0e17b0 100644 > --- a/drivers/misc/sgi-gru/gruprocfs.c > +++ b/drivers/misc/sgi-gru/gruprocfs.c > @@ -164,7 +164,9 @@ static ssize_t options_write(struct file *file, const char __user *userbuf, > unsigned long val; > char buf[80]; > > - if (strncpy_from_user(buf, userbuf, sizeof(buf) - 1) < 0) > + if (count >= sizeof(buf)) > + count = sizeof(buf)-1; > + if (copy_from_user(buf, userbuf, count)) > return -EFAULT; > buf[count - 1] = '\0'; And it's wrong. That 'count-1' was always wrong. It seems to _depend_ on people doing things like echo number > /proc/.. and the 'echo' adding a '\n' at the end, and then 'buf[count-1] = 0' clearing away the '\n'. Which is pointless, since '\n' at the end is the _one_ thing strict_strtoul() accepts. And it's wrong, because it means that echo -n number > /proc.. fails. In other words, the whole function is utter sh*t as far as I can tell. There's basically not a single correct line in the whole thing. Even the 'strict_strtoul()' line is absolute and utter crap, since it forces decimal numbers, but 'options_show()' will then show it as a hex number (and a hex number is natural, since it's a set of flags). It also doesn't actually return an error if you write some invalid value, and it's totally pointless to have that 'val' temporary, since the strict_strtoul function only writes the result if it is successful _anyway_. The size of the buffer is also insane. Since the _only_ thing we will ever accept is a number, there's no point in allowing all that many characters. And silently ignoring the extra characters kind of makes the whole 'strict' part of 'strict_strtoul()' pointless. So here's a second try. I guess the 'return count/-EFAULT' lines were actually correct after all. So it wasn't _all_ buggy or insane. Still entirely untested. Linus --- drivers/misc/sgi-gru/gruprocfs.c | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c index ccd4408..762f179 100644 --- a/drivers/misc/sgi-gru/gruprocfs.c +++ b/drivers/misc/sgi-gru/gruprocfs.c @@ -161,14 +161,15 @@ static int options_show(struct seq_file *s, void *p) static ssize_t options_write(struct file *file, const char __user *userbuf, size_t count, loff_t *data) { - unsigned long val; - char buf[80]; + char buf[16]; - if (strncpy_from_user(buf, userbuf, sizeof(buf) - 1) < 0) + if (count >= sizeof(buf)) + return -EINVAL; + if (copy_from_user(buf, userbuf, count)) return -EFAULT; - buf[count - 1] = '\0'; - if (!strict_strtoul(buf, 10, &val)) - gru_options = val; + buf[count] = '\0'; + if (strict_strtoul(buf, 0, &gru_options)) + return -EINVAL; return count; } ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-05 17:38 ` CVE-2009-2584 Linus Torvalds @ 2009-11-05 17:47 ` Linus Torvalds 2009-11-05 17:47 ` CVE-2009-2584 Michael Buesch 2009-11-05 17:56 ` CVE-2009-2584 Roland Dreier 2 siblings, 0 replies; 14+ messages in thread From: Linus Torvalds @ 2009-11-05 17:47 UTC (permalink / raw) To: Jiri Kosina Cc: Michael Gilbert, Michael Buesch, Jack Steiner, linux-kernel, stable On Thu, 5 Nov 2009, Linus Torvalds wrote: > { > - unsigned long val; > - char buf[80]; > + char buf[16]; On third thought, this was too aggressive. Using "0x%16ul" as a format on 64-bit machines is reasonable, so 19 bytes of buffer is not insane (with the terminating NUL). Of course, it never used to accept hex numbers, so it's not like it would have worked before, but the point is that I cut down the buffer unnecessarily strictly. Can anybody see anything else wrong in that suggested fix? Linus ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-05 17:38 ` CVE-2009-2584 Linus Torvalds 2009-11-05 17:47 ` CVE-2009-2584 Linus Torvalds @ 2009-11-05 17:47 ` Michael Buesch 2009-11-05 18:16 ` CVE-2009-2584 Jack Steiner 2009-11-05 18:19 ` CVE-2009-2584 Linus Torvalds 2009-11-05 17:56 ` CVE-2009-2584 Roland Dreier 2 siblings, 2 replies; 14+ messages in thread From: Michael Buesch @ 2009-11-05 17:47 UTC (permalink / raw) To: Linus Torvalds Cc: Jiri Kosina, Michael Gilbert, Jack Steiner, linux-kernel, stable On Thursday 05 November 2009 18:38:21 Linus Torvalds wrote: > @@ -161,14 +161,15 @@ static int options_show(struct seq_file *s, void *p) > static ssize_t options_write(struct file *file, const char __user *userbuf, > size_t count, loff_t *data) > { > - unsigned long val; > - char buf[80]; > + char buf[16]; > > - if (strncpy_from_user(buf, userbuf, sizeof(buf) - 1) < 0) > + if (count >= sizeof(buf)) > + return -EINVAL; > + if (copy_from_user(buf, userbuf, count)) > return -EFAULT; > - buf[count - 1] = '\0'; > - if (!strict_strtoul(buf, 10, &val)) > - gru_options = val; > + buf[count] = '\0'; > + if (strict_strtoul(buf, 0, &gru_options)) > + return -EINVAL; > > return count; > } > > Looks OK to me. I can't test it however, as I don't own the hardware. -- Greetings, Michael. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-05 17:47 ` CVE-2009-2584 Michael Buesch @ 2009-11-05 18:16 ` Jack Steiner 2009-11-05 18:22 ` CVE-2009-2584 Linus Torvalds 2009-11-05 18:19 ` CVE-2009-2584 Linus Torvalds 1 sibling, 1 reply; 14+ messages in thread From: Jack Steiner @ 2009-11-05 18:16 UTC (permalink / raw) To: Michael Buesch Cc: Linus Torvalds, Jiri Kosina, Michael Gilbert, linux-kernel, stable On Thu, Nov 05, 2009 at 06:47:33PM +0100, Michael Buesch wrote: > On Thursday 05 November 2009 18:38:21 Linus Torvalds wrote: > > @@ -161,14 +161,15 @@ static int options_show(struct seq_file *s, void *p) > > static ssize_t options_write(struct file *file, const char __user *userbuf, > > size_t count, loff_t *data) > > { > > - unsigned long val; > > - char buf[80]; > > + char buf[16]; > > > > - if (strncpy_from_user(buf, userbuf, sizeof(buf) - 1) < 0) > > + if (count >= sizeof(buf)) > > + return -EINVAL; > > + if (copy_from_user(buf, userbuf, count)) > > return -EFAULT; > > - buf[count - 1] = '\0'; > > - if (!strict_strtoul(buf, 10, &val)) > > - gru_options = val; > > + buf[count] = '\0'; > > + if (strict_strtoul(buf, 0, &gru_options)) > > + return -EINVAL; > > > > return count; > > } > > > > > > Looks OK to me. I can't test it however, as I don't own the hardware. "buf" should be larger than 16. The string could be "0x" + 16 characters. I'll verify the the rest. We have the hardware :-) --- jack ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-05 18:16 ` CVE-2009-2584 Jack Steiner @ 2009-11-05 18:22 ` Linus Torvalds 2009-11-05 18:41 ` CVE-2009-2584 Jack Steiner 0 siblings, 1 reply; 14+ messages in thread From: Linus Torvalds @ 2009-11-05 18:22 UTC (permalink / raw) To: Jack Steiner Cc: Michael Buesch, Jiri Kosina, Michael Gilbert, linux-kernel, stable On Thu, 5 Nov 2009, Jack Steiner wrote: > > "buf" should be larger than 16. The string could be "0x" + 16 characters. I have 'char buf[20];' in my tree now. > I'll verify the the rest. > > We have the hardware :-) Thanks. I've committed it locally, but if I get a tested-by or an ack (or a fix) soon enough, I'll update the commit before I push it out. Linus ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-05 18:22 ` CVE-2009-2584 Linus Torvalds @ 2009-11-05 18:41 ` Jack Steiner 0 siblings, 0 replies; 14+ messages in thread From: Jack Steiner @ 2009-11-05 18:41 UTC (permalink / raw) To: Linus Torvalds Cc: Michael Buesch, Jiri Kosina, Michael Gilbert, linux-kernel, stable On Thu, Nov 05, 2009 at 10:22:43AM -0800, Linus Torvalds wrote: > > > On Thu, 5 Nov 2009, Jack Steiner wrote: > > > > "buf" should be larger than 16. The string could be "0x" + 16 characters. > > I have 'char buf[20];' in my tree now. > > > I'll verify the the rest. > > > > We have the hardware :-) > > Thanks. I've committed it locally, but if I get a tested-by or an ack (or > a fix) soon enough, I'll update the commit before I push it out. Tested on real hardware. Acked-by: Jack Steiner <steiner@sgi.com> --- jack ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-05 17:47 ` CVE-2009-2584 Michael Buesch 2009-11-05 18:16 ` CVE-2009-2584 Jack Steiner @ 2009-11-05 18:19 ` Linus Torvalds 1 sibling, 0 replies; 14+ messages in thread From: Linus Torvalds @ 2009-11-05 18:19 UTC (permalink / raw) To: Michael Buesch Cc: Jiri Kosina, Michael Gilbert, Jack Steiner, linux-kernel, stable On Thu, 5 Nov 2009, Michael Buesch wrote: > > Looks OK to me. I can't test it however, as I don't own the hardware. Heh. Even the people who wanted to write exploit examples had the same small problem. I doubt it really matters for anybody. I'm committing it, just because I don't think it can really be any worse than the status quo. But I'll happily take further patches, especially from anybody who actually has access to the hardware. Linus ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: CVE-2009-2584 2009-11-05 17:38 ` CVE-2009-2584 Linus Torvalds 2009-11-05 17:47 ` CVE-2009-2584 Linus Torvalds 2009-11-05 17:47 ` CVE-2009-2584 Michael Buesch @ 2009-11-05 17:56 ` Roland Dreier 2 siblings, 0 replies; 14+ messages in thread From: Roland Dreier @ 2009-11-05 17:56 UTC (permalink / raw) To: Linus Torvalds Cc: Jiri Kosina, Michael Gilbert, Michael Buesch, Jack Steiner, linux-kernel, stable > So here's a second try. I guess the 'return count/-EFAULT' lines were > actually correct after all. So it wasn't _all_ buggy or insane. The blank lines seem fine too. - R. ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2009-11-05 18:41 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-11-04 22:05 CVE-2009-2584 Michael Gilbert 2009-11-04 22:08 ` CVE-2009-2584 Justin P. Mattock 2009-11-04 22:21 ` CVE-2009-2584 Michael Gilbert 2009-11-04 22:49 ` CVE-2009-2584 Justin P. Mattock 2009-11-05 15:27 ` CVE-2009-2584 Jiri Kosina 2009-11-05 16:32 ` CVE-2009-2584 Linus Torvalds 2009-11-05 17:38 ` CVE-2009-2584 Linus Torvalds 2009-11-05 17:47 ` CVE-2009-2584 Linus Torvalds 2009-11-05 17:47 ` CVE-2009-2584 Michael Buesch 2009-11-05 18:16 ` CVE-2009-2584 Jack Steiner 2009-11-05 18:22 ` CVE-2009-2584 Linus Torvalds 2009-11-05 18:41 ` CVE-2009-2584 Jack Steiner 2009-11-05 18:19 ` CVE-2009-2584 Linus Torvalds 2009-11-05 17:56 ` CVE-2009-2584 Roland Dreier
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox