| Eric Paris | 788084a | 2009-07-31 12:54:11 -0400 | [diff] [blame] | 1 | #include <linux/init.h> | 
|  | 2 | #include <linux/mm.h> | 
|  | 3 | #include <linux/security.h> | 
|  | 4 | #include <linux/sysctl.h> | 
|  | 5 |  | 
|  | 6 | /* amount of vm to protect from userspace access by both DAC and the LSM*/ | 
|  | 7 | unsigned long mmap_min_addr; | 
|  | 8 | /* amount of vm to protect from userspace using CAP_SYS_RAWIO (DAC) */ | 
|  | 9 | unsigned long dac_mmap_min_addr = CONFIG_DEFAULT_MMAP_MIN_ADDR; | 
|  | 10 | /* amount of vm to protect from userspace using the LSM = CONFIG_LSM_MMAP_MIN_ADDR */ | 
|  | 11 |  | 
|  | 12 | /* | 
|  | 13 | * Update mmap_min_addr = max(dac_mmap_min_addr, CONFIG_LSM_MMAP_MIN_ADDR) | 
|  | 14 | */ | 
|  | 15 | static void update_mmap_min_addr(void) | 
|  | 16 | { | 
|  | 17 | #ifdef CONFIG_LSM_MMAP_MIN_ADDR | 
|  | 18 | if (dac_mmap_min_addr > CONFIG_LSM_MMAP_MIN_ADDR) | 
|  | 19 | mmap_min_addr = dac_mmap_min_addr; | 
|  | 20 | else | 
|  | 21 | mmap_min_addr = CONFIG_LSM_MMAP_MIN_ADDR; | 
|  | 22 | #else | 
|  | 23 | mmap_min_addr = dac_mmap_min_addr; | 
|  | 24 | #endif | 
|  | 25 | } | 
|  | 26 |  | 
|  | 27 | /* | 
|  | 28 | * sysctl handler which just sets dac_mmap_min_addr = the new value and then | 
|  | 29 | * calls update_mmap_min_addr() so non MAP_FIXED hints get rounded properly | 
|  | 30 | */ | 
| Alexey Dobriyan | 8d65af7 | 2009-09-23 15:57:19 -0700 | [diff] [blame] | 31 | int mmap_min_addr_handler(struct ctl_table *table, int write, | 
| Eric Paris | 788084a | 2009-07-31 12:54:11 -0400 | [diff] [blame] | 32 | void __user *buffer, size_t *lenp, loff_t *ppos) | 
|  | 33 | { | 
|  | 34 | int ret; | 
|  | 35 |  | 
| Kees Cook | 4ae69e6 | 2010-04-22 12:19:17 -0700 | [diff] [blame] | 36 | if (write && !capable(CAP_SYS_RAWIO)) | 
| Kees Cook | 0e1a6ef | 2009-11-08 09:37:00 -0800 | [diff] [blame] | 37 | return -EPERM; | 
|  | 38 |  | 
| Alexey Dobriyan | 8d65af7 | 2009-09-23 15:57:19 -0700 | [diff] [blame] | 39 | ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos); | 
| Eric Paris | 788084a | 2009-07-31 12:54:11 -0400 | [diff] [blame] | 40 |  | 
|  | 41 | update_mmap_min_addr(); | 
|  | 42 |  | 
|  | 43 | return ret; | 
|  | 44 | } | 
|  | 45 |  | 
| H Hartley Sweeten | dd880fb | 2009-12-15 15:05:12 -0800 | [diff] [blame] | 46 | static int __init init_mmap_min_addr(void) | 
| Eric Paris | 788084a | 2009-07-31 12:54:11 -0400 | [diff] [blame] | 47 | { | 
|  | 48 | update_mmap_min_addr(); | 
|  | 49 |  | 
|  | 50 | return 0; | 
|  | 51 | } | 
|  | 52 | pure_initcall(init_mmap_min_addr); |