linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3] Allow CONFIG_DEBUG_SET_MODULE_RONX to be used on ARM
@ 2013-06-17 17:29 Laura Abbott
  2013-06-17 17:29 ` [PATCHv2 1/3] arm: Add definitions for pte_mkexec/pte_mknexec Laura Abbott
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Laura Abbott @ 2013-06-17 17:29 UTC (permalink / raw)
  To: linux-arm-kernel

Hi,

This is a series to allow CONFIG_DEBUG_SET_MODULE_RONX to be used on ARM. The
current config description from x86 describes it best:

	This option helps catch unintended modifications to loadable
	kernel module's text and read-only data. It also prevents execution
	of module data. Such protection may interfere with run-time code
	patching and dynamic kernel tracing - and they might also protect
	against certain classes of kernel exploits.

v2: Add module bounds checking per Russell, removed dsb per Catalin.
Macrofied the set_memory_* functions to avoid so much code duplication.

Thanks,
Laura

---

 arch/arm/Kconfig.debug            |   11 ++++++++++
 arch/arm/include/asm/cacheflush.h |    5 ++++
 arch/arm/include/asm/pgtable.h    |    2 +
 arch/arm/mm/mmu.c                 |   38 +++++++++++++++++++++++++++++++++++++
 4 files changed, 56 insertions(+), 0 deletions(-)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCHv2 1/3] arm: Add definitions for pte_mkexec/pte_mknexec
  2013-06-17 17:29 [PATCH v2 0/3] Allow CONFIG_DEBUG_SET_MODULE_RONX to be used on ARM Laura Abbott
@ 2013-06-17 17:29 ` Laura Abbott
  2013-06-17 17:29 ` [PATCHv2 2/3] arm: mm: Define set_memory_* functions for ARM Laura Abbott
  2013-06-17 17:29 ` [PATCHv2 3/3] arm: add DEBUG_SET_MODULE_RONX option to Kconfig Laura Abbott
  2 siblings, 0 replies; 4+ messages in thread
From: Laura Abbott @ 2013-06-17 17:29 UTC (permalink / raw)
  To: linux-arm-kernel

Other architectures define pte_mkexec to mark a pte as executable.
Add pte_mkexec for ARM to get the same functionality. Although no
other architectures currently define it, also add pte_mknexec to
explicitly allow a pte to be marked as non executable.

Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
---
 arch/arm/include/asm/pgtable.h |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
index 9bcd262..135381b 100644
--- a/arch/arm/include/asm/pgtable.h
+++ b/arch/arm/include/asm/pgtable.h
@@ -251,6 +251,8 @@ PTE_BIT_FUNC(mkclean,   &= ~L_PTE_DIRTY);
 PTE_BIT_FUNC(mkdirty,   |= L_PTE_DIRTY);
 PTE_BIT_FUNC(mkold,     &= ~L_PTE_YOUNG);
 PTE_BIT_FUNC(mkyoung,   |= L_PTE_YOUNG);
+PTE_BIT_FUNC(mkexec,   &= ~L_PTE_XN);
+PTE_BIT_FUNC(mknexec,   |= L_PTE_XN);
 
 static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
 
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCHv2 2/3] arm: mm: Define set_memory_* functions for ARM
  2013-06-17 17:29 [PATCH v2 0/3] Allow CONFIG_DEBUG_SET_MODULE_RONX to be used on ARM Laura Abbott
  2013-06-17 17:29 ` [PATCHv2 1/3] arm: Add definitions for pte_mkexec/pte_mknexec Laura Abbott
@ 2013-06-17 17:29 ` Laura Abbott
  2013-06-17 17:29 ` [PATCHv2 3/3] arm: add DEBUG_SET_MODULE_RONX option to Kconfig Laura Abbott
  2 siblings, 0 replies; 4+ messages in thread
From: Laura Abbott @ 2013-06-17 17:29 UTC (permalink / raw)
  To: linux-arm-kernel

Other architectures define various set_memory functions to allow
attributes to be changed (e.g. set_memory_x, set_memory_rw, etc.)
Currently, these functions are missing on ARM. Define these in an
appropriate manner for ARM.

Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
---
 arch/arm/include/asm/cacheflush.h |    5 ++++
 arch/arm/mm/mmu.c                 |   38 +++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
index bff7138..55ed26b 100644
--- a/arch/arm/include/asm/cacheflush.h
+++ b/arch/arm/include/asm/cacheflush.h
@@ -438,4 +438,9 @@ static inline void __sync_cache_range_r(volatile void *p, size_t size)
 #define sync_cache_w(ptr) __sync_cache_range_w(ptr, sizeof *(ptr))
 #define sync_cache_r(ptr) __sync_cache_range_r(ptr, sizeof *(ptr))
 
+int set_memory_ro(unsigned long addr, int numpages);
+int set_memory_rw(unsigned long addr, int numpages);
+int set_memory_x(unsigned long addr, int numpages);
+int set_memory_nx(unsigned long addr, int numpages);
+
 #endif
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index e0d8565..53b0de4 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -335,6 +335,44 @@ const struct mem_type *get_mem_type(unsigned int type)
 }
 EXPORT_SYMBOL(get_mem_type);
 
+#define PTE_SET_FN(_name, pteop) \
+static int pte_set_##_name(pte_t *ptep, pgtable_t token, unsigned long addr, \
+			void *data) \
+{ \
+	pte_t pte = pteop(*ptep); \
+\
+	set_pte_ext(ptep, pte, 0); \
+	return 0; \
+} \
+
+#define SET_MEMORY_FN(_name, callback) \
+int set_memory_##_name(unsigned long addr, int numpages) \
+{ \
+	unsigned long start = addr; \
+	unsigned long size = PAGE_SIZE*numpages; \
+	unsigned end = start + size; \
+\
+	if (start < MODULES_VADDR || start >= MODULES_END) \
+		return -EINVAL;\
+\
+	if (end < MODULES_VADDR || end >= MODULES_END) \
+		return -EINVAL; \
+\
+	apply_to_page_range(&init_mm, start, size, callback, NULL); \
+	flush_tlb_kernel_range(start, end); \
+	return 0;\
+}
+
+PTE_SET_FN(ro, pte_wrprotect)
+PTE_SET_FN(rw, pte_mkwrite)
+PTE_SET_FN(x, pte_mkexec)
+PTE_SET_FN(nx, pte_mknexec)
+
+SET_MEMORY_FN(ro, pte_set_ro)
+SET_MEMORY_FN(rw, pte_set_rw)
+SET_MEMORY_FN(x, pte_set_x)
+SET_MEMORY_FN(nx, pte_set_nx)
+
 /*
  * Adjust the PMD section entries according to the CPU in use.
  */
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCHv2 3/3] arm: add DEBUG_SET_MODULE_RONX option to Kconfig
  2013-06-17 17:29 [PATCH v2 0/3] Allow CONFIG_DEBUG_SET_MODULE_RONX to be used on ARM Laura Abbott
  2013-06-17 17:29 ` [PATCHv2 1/3] arm: Add definitions for pte_mkexec/pte_mknexec Laura Abbott
  2013-06-17 17:29 ` [PATCHv2 2/3] arm: mm: Define set_memory_* functions for ARM Laura Abbott
@ 2013-06-17 17:29 ` Laura Abbott
  2 siblings, 0 replies; 4+ messages in thread
From: Laura Abbott @ 2013-06-17 17:29 UTC (permalink / raw)
  To: linux-arm-kernel

Now that all the page setting infrastructure is in place,
Add the DEBUG_SET_MODULE_RONX to the ARM debugging Kconfig.
When turned on, data sections for modules will be marked as NX
and read only sections will be marked as such.

Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
---
 arch/arm/Kconfig.debug |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
index 1d41908..12bca63 100644
--- a/arch/arm/Kconfig.debug
+++ b/arch/arm/Kconfig.debug
@@ -692,4 +692,15 @@ config PID_IN_CONTEXTIDR
 	  additional instructions during context switch. Say Y here only if you
 	  are planning to use hardware trace tools with this kernel.
 
+config DEBUG_SET_MODULE_RONX
+	bool "Set loadable kernel module data as NX and text as RO"
+	depends on MODULES
+	---help---
+	  This option helps catch unintended modifications to loadable
+	  kernel module's text and read-only data. It also prevents execution
+	  of module data. Such protection may interfere with run-time code
+	  patching and dynamic kernel tracing - and they might also protect
+	  against certain classes of kernel exploits.
+	  If in doubt, say "N".
+
 endmenu
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-06-17 17:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-17 17:29 [PATCH v2 0/3] Allow CONFIG_DEBUG_SET_MODULE_RONX to be used on ARM Laura Abbott
2013-06-17 17:29 ` [PATCHv2 1/3] arm: Add definitions for pte_mkexec/pte_mknexec Laura Abbott
2013-06-17 17:29 ` [PATCHv2 2/3] arm: mm: Define set_memory_* functions for ARM Laura Abbott
2013-06-17 17:29 ` [PATCHv2 3/3] arm: add DEBUG_SET_MODULE_RONX option to Kconfig Laura Abbott

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).