Thread (5 messages) 5 messages, 2 authors, 2016-07-08

Re: [kernel-hardening] Re: [PATCH 9/9] mm: SLUB hardened usercopy support

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2016-07-08 10:19:58
Also in: linux-mm

Kees Cook [off-list ref] writes:
On Thu, Jul 7, 2016 at 12:35 AM, Michael Ellerman [off-list ref] wrote:
quoted
I gave this a quick spin on powerpc, it blew up immediately :)
Wheee :) This series is rather easy to test: blows up REALLY quickly
if it's wrong. ;)
Better than subtle race conditions which is the usual :)
quoted
diff --git a/mm/slub.c b/mm/slub.c
index 0c8ace04f075..66191ea4545a 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3630,6 +3630,9 @@ const char *__check_heap_object(const void *ptr, unsigned long n,
        /* Find object. */
        s = page->slab_cache;

+       /* Subtract red zone if enabled */
+       ptr = restore_red_left(s, ptr);
+
Ah, interesting. Just to make sure: you've built with
CONFIG_SLUB_DEBUG and either CONFIG_SLUB_DEBUG_ON or booted with
either slub_debug or slub_debug=z ?
Yeah built with CONFIG_SLUB_DEBUG_ON, and booted with and without slub_debug
options.
Thanks for the slub fix!

I wonder if this code should be using size_from_object() instead of s->size?
Hmm, not sure. Who's SLUB maintainer? :)

I was modelling it on the logic in check_valid_pointer(), which also does the
restore_red_left(), and then checks for % s->size:

static inline int check_valid_pointer(struct kmem_cache *s,
				struct page *page, void *object)
{
	void *base;

	if (!object)
		return 1;

	base = page_address(page);
	object = restore_red_left(s, object);
	if (object < base || object >= base + page->objects * s->size ||
		(object - base) % s->size) {
		return 0;
	}

	return 1;
}

cheers
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help