History

Security/SELinux: seperate lsm specific mmap_min_addr

Currently SELinux enforcement of controls on the ability to map low memory is determined by the mmap_min_addr tunable. This patch causes SELinux to ignore the tunable and instead use a seperate Kconfig option specific to how much space the LSM should protect. The tunable will now only control the need for CAP_SYS_RAWIO and SELinux permissions will always protect the amount of low memory designated by CONFIG_LSM_MMAP_MIN_ADDR. This allows users who need to disable the mmap_min_addr controls (usual reason being they run WINE as a non-root user) to do so and still have SELinux controls preventing confined domains (like a web server) from being able to map some area of low memory.

Eric Paris committed 17 years ago

Commit 788084a1 parent 8cf948e11 files · +92 −30Browse files

Showing the changes to include (2 of 11 files). Show all

Unified · Split

2 files
  1. include/linux/mm.h +0 −15
  2. include/linux/security.h +17 −0
include/linux/mm.h+0−15
@@ -34,8 +34,6 @@ extern int sysctl_legacy_va_layout; · 33 unmodified lines
3434 #define sysctl_legacy_va_layout 0
3535 #endif
3636
37−extern unsigned long mmap_min_addr;
38−
3937 #include <asm/page.h>
4038 #include <asm/pgtable.h>
4139 #include <asm/processor.h>
@@ -574,19 +572,6 @@ static inline void set_page_links(struct page *page, enum zone_type zone, · 532 unmodified lines
574572 set_page_section(page, pfn_to_section_nr(pfn));
575573 }
576574
577−/*
578− * If a hint addr is less than mmap_min_addr change hint to be as
579− * low as possible but still greater than mmap_min_addr
580− */
581−static inline unsigned long round_hint_to_min(unsigned long hint)
582−{
583− hint &= PAGE_MASK;
584− if (((void *)hint != NULL) &&
585− (hint < mmap_min_addr))
586− return PAGE_ALIGN(mmap_min_addr);
587− return hint;
588−}
589−
590575 /*
591576 * Some inline functions in vmstat.h depend on page_zone()
592577 */
include/linux/security.h+17−0
@@ -28,6 +28,7 @@ · 27 unmodified lines
2828 #include <linux/resource.h>
2929 #include <linux/sem.h>
3030 #include <linux/shm.h>
31+#include <linux/mm.h> /* PAGE_ALIGN */
3132 #include <linux/msg.h>
3233 #include <linux/sched.h>
3334 #include <linux/key.h>
@@ -95,6 +96,7 @@ extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb); · 61 unmodified lines
9596 extern int cap_netlink_recv(struct sk_buff *skb, int cap);
9697
9798 extern unsigned long mmap_min_addr;
99+extern unsigned long dac_mmap_min_addr;
98100 /*
99101 * Values used in the task_security_ops calls
100102 */
@@ -147,6 +149,21 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) · 46 unmodified lines
147149 opts->num_mnt_opts = 0;
148150 }
149151
152+/*
153+ * If a hint addr is less than mmap_min_addr change hint to be as
154+ * low as possible but still greater than mmap_min_addr
155+ */
156+static inline unsigned long round_hint_to_min(unsigned long hint)
157+{
158+ hint &= PAGE_MASK;
159+ if (((void *)hint != NULL) &&
160+ (hint < mmap_min_addr))
161+ return PAGE_ALIGN(mmap_min_addr);
162+ return hint;
163+}
164+
165+extern int mmap_min_addr_handler(struct ctl_table *table, int write, struct file *filp,
166+ void __user *buffer, size_t *lenp, loff_t *ppos);
150167 /**
151168 * struct security_operations - main security structure
152169 *