Thread (34 messages) 34 messages, 5 authors, 2018-03-12

Re: [PATCH 4/7] Protectable Memory

From: Igor Stoppa <hidden>
Date: 2018-03-12 21:25:54
Also in: linux-security-module, lkml


On 12/03/18 21:13, Matthew Wilcox wrote:
On Wed, Feb 28, 2018 at 10:06:17PM +0200, Igor Stoppa wrote:
quoted
struct gen_pool *pmalloc_create_pool(const char *name,
					 int min_alloc_order);
int is_pmalloc_object(const void *ptr, const unsigned long n);
bool pmalloc_prealloc(struct gen_pool *pool, size_t size);
void *pmalloc(struct gen_pool *pool, size_t size, gfp_t gfp);
static inline void *pzalloc(struct gen_pool *pool, size_t size, gfp_t gfp)
static inline void *pmalloc_array(struct gen_pool *pool, size_t n,
				  size_t size, gfp_t flags)
static inline void *pcalloc(struct gen_pool *pool, size_t n,
			    size_t size, gfp_t flags)
static inline char *pstrdup(struct gen_pool *pool, const char *s, gfp_t gfp)
int pmalloc_protect_pool(struct gen_pool *pool);
static inline void pfree(struct gen_pool *pool, const void *addr)
int pmalloc_destroy_pool(struct gen_pool *pool);
Do you have users for all these functions?  I'm particularly sceptical of
pfree().
The typical case is when rolling back allocations, on an error path.
For example, with SELinux, the userspace provides the policy, which gets
processed and converted into a policyDB, where every policy maps to
several structures allocated dynamically.

The allocation is not transactional. In case a policy turns out to be
bad/broken, while being interpreted, those structures that were
initially allocated for that policy, must be freed.

Since pmalloc is meant to be a drop in replacement for k/vmalloc, it
needs to provide also pfree.
 To my mind, a user wants to:

pmalloc_create();
pmalloc(); * N
pmalloc_protect();
...
pmalloc_destroy();
This is the simplest case, but also the error path must be supported.
I don't mind the pstrdup, pcalloc, pmalloc_array, pzalloc variations, but
All those functions turned out to be necessary when converting SELinux
to pmalloc.
Yes, I haven't published this code yet, but I was hoping to first be
done with pmalloc and then move on to SELinux, which I suspect will be
harder to chew :-/
I don't know why you need is_pmalloc_object().
Because of hardened usercopy [1]:


On 23/05/17 00:38, Kees Cook wrote:

[...]
I'd like hardened usercopy to grow knowledge of these
allocations so we can bounds-check objects. Right now, mm/usercopy.c
just looks at PageSlab(page) to decide if it should do slab checks. I
think adding a check for this type of object would be very important
there.


[1] http://www.openwall.com/lists/kernel-hardening/2017/05/23/17


--
igor
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help