summaryrefslogtreecommitdiffstats
path: root/fs/befs
diff options
context:
space:
mode:
authorDavid Windsor <dave@nullcore.net>2017-06-10 22:50:32 -0400
committerKees Cook <keescook@chromium.org>2018-01-15 15:07:54 -0500
commit0fc256d3ad76f2552de0db781854506bb623715a (patch)
treef5ee18f470f977641fe3853c9ad011584dcf3068 /fs/befs
parent8d2704d382a9fd14f65dcdd2a3459067162fd4e6 (diff)
befs: Define usercopy region in befs_inode_cache slab cache
befs symlink pathnames, stored in struct befs_inode_info.i_data.symlink and therefore contained in the befs_inode_cache slab cache, need to be copied to/from userspace. cache object allocation: fs/befs/linuxvfs.c: befs_alloc_inode(...): ... bi = kmem_cache_alloc(befs_inode_cachep, GFP_KERNEL); ... return &bi->vfs_inode; befs_iget(...): ... strlcpy(befs_ino->i_data.symlink, raw_inode->data.symlink, BEFS_SYMLINK_LEN); ... inode->i_link = befs_ino->i_data.symlink; example usage trace: readlink_copy+0x43/0x70 vfs_readlink+0x62/0x110 SyS_readlinkat+0x100/0x130 fs/namei.c: readlink_copy(..., link): ... copy_to_user(..., link, len); (inlined in vfs_readlink) generic_readlink(dentry, ...): struct inode *inode = d_inode(dentry); const char *link = inode->i_link; ... readlink_copy(..., link); In support of usercopy hardening, this patch defines a region in the befs_inode_cache slab cache in which userspace copy operations are allowed. This region is known as the slab cache's usercopy region. Slab caches can now check that each dynamically sized copy operation involving cache-managed memory falls entirely within the slab's usercopy region. This patch is modified from Brad Spengler/PaX Team's PAX_USERCOPY whitelisting code in the last public patch of grsecurity/PaX based on my understanding of the code. Changes or omissions from the original code are mine and don't reflect the original grsecurity/PaX code. Signed-off-by: David Windsor <dave@nullcore.net> [kees: adjust commit log, provide usage trace] Cc: Luis de Bethencourt <luisbg@kernel.org> Cc: Salah Triki <salah.triki@gmail.com> Signed-off-by: Kees Cook <keescook@chromium.org> Acked-by: Luis de Bethencourt <luisbg@kernel.org>
Diffstat (limited to 'fs/befs')
-rw-r--r--fs/befs/linuxvfs.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c
index ee236231cafa..af2832aaeec5 100644
--- a/fs/befs/linuxvfs.c
+++ b/fs/befs/linuxvfs.c
@@ -444,11 +444,15 @@ unacquire_none:
444static int __init 444static int __init
445befs_init_inodecache(void) 445befs_init_inodecache(void)
446{ 446{
447 befs_inode_cachep = kmem_cache_create("befs_inode_cache", 447 befs_inode_cachep = kmem_cache_create_usercopy("befs_inode_cache",
448 sizeof (struct befs_inode_info), 448 sizeof(struct befs_inode_info), 0,
449 0, (SLAB_RECLAIM_ACCOUNT| 449 (SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|
450 SLAB_MEM_SPREAD|SLAB_ACCOUNT), 450 SLAB_ACCOUNT),
451 init_once); 451 offsetof(struct befs_inode_info,
452 i_data.symlink),
453 sizeof_field(struct befs_inode_info,
454 i_data.symlink),
455 init_once);
452 if (befs_inode_cachep == NULL) 456 if (befs_inode_cachep == NULL)
453 return -ENOMEM; 457 return -ENOMEM;
454 458